DevOps/Docker

[Docker] 도커의 Attached, Detached 컨테이너

샤아이인 2022. 9. 7.

 

1. Attached, Detached 컨테이너

보통 다음과 같이 cmd를 입력하면 해당 process는 background 모드로 실행되기 때문에 바로 터미널에 추가적인 입력이 가능합니다.

docker start intelligent_austin

도커 컨테이너를 실행하는 명령이며, docker ps로 확인 시 실행 중임을 확인할 수 있다.

여기서 생각할점이 "start"명령어는 입력 후 터미널이 사용자의 입력을 block하지 않았다는 점입니다.

따라서 추가적인 "ps"명령을 입력할 수 있었죠!

이를 detached 모드라 부릅니다.

 

이와 달리 docker run 은 명령을 실행하면 바로 사용자의 입력을 block 하게 됩니다. 다음을 살펴보시죠!

이는 컨테이너가 foreground로 실행되기 때문입니다. 이를 attached 모드라 부릅니다.

 

▶ 요약

  • "docker start" : detached가 기본
  • "docker run" : attached가 기본

 

만약 우리의 애플리케이션에서 출력하는 log를 보고 싶다면 어떤 모드로 접속했어야 할까요?

=> attached 모드입니다! , attached는 컨테이너의 출력 결과를 수신한다는 것을 의미합니다.

 

다행히 이를 추가 옵션을 통해 원하는 대로 변경할 수 있습니다.

 

만약 docker run을 실행하면서 detached모드로 진입하고 싶다면 다음과 같이 "-d"옵션을 주면 됩니다.

docker run -p 8000:80 -d node-web

분리된 컨테이너를 다시 연결하려면 다음과 같이 명령하면 됩니다.

docker container attach <컨테이너 이름>

위와 같이 입력하면 다시 attach 되어 애플리케이션의 log를 볼 수 있죠!

 

아니면 아예 "logs" 옵션을 추가해주는 방식도 있습니다.

docker logs -f <컨테이너 이름>

참고로 -f는 fallow 옵션으로 계속 수신 대기하면서 로그를 보여주게 됩니다.

 

마지막으로 "start"명령과 동시에 attached 모드가 되려면 "-a"옵션을 추가해주면 됩니다.

docker start -a intelligent_austin

 

2. 실시간 콘솔 애플리케이션에서의 경우

보통 Java, Python 등으로 콘솔 기반의 애플리케이션을 만들기도 하는데, 이 경우 터미널과 지속적으로 소통을 해야 합니다.

 

문제는 해당 프로그램이 포함된 이미지를 "run"명령어로 실행하면 attached 모드라 우리의 입력을 전달할 수가 없습니다.

즉, attached는 애플리케이션의 출력 값을 전달받을 수는 있지만 입력값을 전달할 수가 없습니다.

 

이때 사용하는 옵션 2가지가 있습니다.

 

-i, --interactive : standard input 계속 열어두는데, 설령 attached상태가 아니더라도 열어둡니다.

-t, --tty : 가상의 TTY를 할당합니다. 즉 터미널을 생성하게 됩니다.

따라서 -it 옵션을 주면 input을 넘길 수 있는 터미널을 생성하게 되는 것입니다.

 

다음과 같이 입력 시 실시간 애플리케이션의 컨테이너를 실행하면서 사용자의 입력을 받게 됩니다.

docker run -it <이미지 이름>

 

또한 컨테이너를 재 실행할 때는 "-a -t"옵션만 추가해주면 됩니다.

즉, attached 하여 수신 결과를 받음과 동시에 interactive 하게 사용자의 입력을 전달하겠다는 의미입니다.

 

 

댓글