ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker Attached & Detached Container
    Infra/컨테이너 2022. 9. 14. 17:42

    Container를 시작하는 두가지 명령어

    docker start (컨테이너 이름 또는 ID) 

    해당 명령어로 Container를 재시작하면 터미널 프로세스가 즉시 완료된다. 터미널을 실행중인 Docker Container에 연결하지 않는다.(Container는 background로 실행중인 상태가 된다.) 해당 Container는 터미널에서 블록되지 않았을 뿐이지 실행 중 이다. 

    -detached 실행

     

    docker  run -p  외부에서 접근할 포트번호:외부에 노출할 포트 번호  이미지ID

    이전의 실행한 dockr run 명령과는 다르다. 7070포트에는 이미 다른 Container가 실행 중 이므로 8070 포트 번호를 사용하여 동일 Image기반으로 새로운 추가 Container를 실행한다.

    -attached실행

     

    다른 터미널을 열어 docker ps  명령어로 확인하면 두개의 Container가 실행 중 인 것을 확인 할 수 있다.

     


    Container의 실행 모드

    하지만 docker run 명령어를 사용한 경우에 터미널이 사용할 수 없게 막힌 것을 확인 할 수 있다. 더 이상 명령어를 실행할 수 없다. 해당 프로세스는 docker run 명령어를 실행한 터미널을 차단하고 있지만,(Container는 foreground에서 실행 중인 상태가 된다.) docker start는 그렇지 않다. 

     

    docker run 명령어를 실행한 곳에서 터미널 사용불가능이 되는 것은 강제 당하는 일이 아니다.  attached(연결)모드나 detached(분리)모드를 원하는 대로 설정할 수 있다.

     

    단지 docker start로 시작하는 경우는 detached모드가 디폴트이며, docker run으로 실행하는 경우는 attached모드가 디폴트일 뿐이다. 이제 중요한것은 어느 모드를 원하며, 왜 그것이 신경써야 하는 문제인가? 이다.

     

    app.post("/store-goal", (req, res) => {
      const enteredGoal = req.body.goal;
      console.log(enteredGoal);
      userGoal = enteredGoal;
      res.redirect("/");
    });

    우리가 실행하는 예제 Application에서는 변수  req.body의 goal이 Request로 올 때마다 이를 console.log()로 출력한다.


    detached 모드

    <input> goal에 "learn docker in-depth!"라고 입력한 뒤에  버튼을 눌러서 Post를 보내면 localhost:7070은 detached모드로 시작된 Container이므로 console에 아무 것도 표시되지 않는다.


    attached 모드

    반면에 docker run으로 실행한 새로운 Container인 localhost:8070으로 이동해 <input> goal에 "learn docker in-depth!"라고 입력한 뒤에  버튼을 눌러서 Post를 보내면, 터미널에 보낸 문자열 값이 찍혀 나오는 것을 확인 할 수 있다.

     

    왜냐하면 실행 중인 Container에 attached(연결)되어 있기 때문이다. 즉 attached모드는 단순한 의미는 원하든 원하지 않든 Container안에든 Application의  출력결과를 수신 한다는 것을 의미한다. (예를 들어 console의 출력 내용같은 것들)


    docker run 명령어 detached모드로 실행하기

    docker run -p 8070:8080 -d (이미지ID)

    Container를 실행할 터미널에 디폴트로 attached되는 것을 원하지 않는다면, detached모드로 docker run 명령어를 실행할 수도 있다.  그러기 위해서는 위 와 같이 docker run 명령어에서 이미지ID 앞에 detached의 약자인 -d를 플래그로 추가한다.

     

    그러면 완전히 새로운 Container가 생성된 뒤에 더이상 터미널이 블록되지 않고, 단지 새로 생성된 Container의 ID만 출력하는 것을 확인 할 수 있다.


    docker start 명령어 attached모드로 실행하기

    docker start -a 컨테이너 이름 혹은 ID

    위 와 같이 docker start 명령시 -a 옵션을 사용하면  local 터미널을 Container 내부 터미널에 연결시킨채로 Container를 restart 시킬 수 있다.

     


     

     

    local터미널에서 실행중인 Container에 터미널에 연결하기

     실행 중인 컨테이너를 계속 보고 싶다면 두가지 방법이 존재한다.

    docker attach 컨테이너 이름 혹은 ID

    첫번째는  attach명령을 사용하는 것이다. 실행 중인 Container의 터미널에 다시 연결할 수 있다. docker attach 명령어 뒤에 해당 Container의 이름이나 ID를 넣고 명령어를 수행한다.

     

    localhost:7070에 들어가서 새로운 Goal을 설정하면 console에 새로 설정한 Goal이 출력되는 것을 확인할 수 있다.

     

    두번째 방법은 Container 내부에 출력되는 로그 메시지에 access하는 방법에 가깝다.

    localhost:7070에 들어가서 새로운 Goal을 설정하면 console에 새로 설정한다. 하지만 local 터미널에는 해당 Goal 메시지가 출력되지 않는다. 왜냐하면 Container는 detach모드로 실행이 되고 있기 때문이다.

     

    docker logs 컨테이너 이름 혹은 ID

    이때 실행되고 있는 Container 내부에 console에 출력되고 있는 로그를 가져오는 docker logs 명령을 사용할 수 도 있다.

     

    해당 명령어를 사용하면 그동안 Container에 터미널에 console.log로 출력된 메시지들을 한번에 확인해 볼 수 있다.

     

    docker logs의 option

    docker logs -f 컨테이너 이름 혹은 ID

    옵션 -f를 사용해서 follow모드로 진입해 원하는 Container에 log에 대해 계속 수신대기 할 수 있다.

     

     

    해당 명령어와 옵션을 실행하면 위 그림과 같이 연결되 프로세스를 다시 갖게 되며 또한 그 컨테이너의 향후 로그 출력 결과를 다시 볼 수 있게된다.

     

    정리

    연결이 되어 있든 분리가 되었든에 상관없이 Container는 여전히 실행 중이라는 사실에 유의 해야한다. 하지만 컨테이너 내부의 정보가 필요한 경우 docker logs를 사용하거나 컨테이너를 다시 직접연결하여 추가 정보를 얻을 수 있다.

    실행된 Container 연결된 Container
    중지된 Container 분리된 Container

    댓글

Designed by Tistory.