목차
- Docker 컨테이너의 ENTRYPOINT가 /bin/bash 일 때
- docker attach로 진입한 후 exit 명령어 실행
- docker exec로 진입한 후 exit 명령어 실행
- attach, exec 비교 정리
서론
Docker 컨테이너 내부에 접속할 때 docker attach와 docker exec 두 명령어를 사용할 수 있습니다.
이 글에서는 도커 컨테이너의 entrypoint가 bash쉘(/bin/bash)일 때, attach와 exec 명령을 사용해 내부에 진입 후 exit 명령어를 실행했을 때 컨테이너 상태가 어떻게 변하는지 살펴보겠습니다.
Docker 컨테이너의 ENTRYPOINT가 /bin/bash 일 때
컨테이너의 ENTRYPOINT가 /bin/bash 라는 것은, 컨테이너가 실행될 때 기본적으로 bash 쉘이 실행되고, 쉘 세션이 메인 프로세스로 동작함을 의미합니다.
이를 확인해 보기 위해 ubuntu 컨테이너를 생성 및 실행하고, 상태를 확인해보겠습니다.
docker run -dit --name myubuntu ubuntu:20.04
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0246aa4d1448 ubuntu:20.04 "/bin/bash" Less than a second ago Up Less than a second myubuntu
bash쉘은 실행 중인 myubuntu 컨테이너의 PID 1번 메인 프로세스로 동작합니다.
root@5cdae46966de:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 06:43 pts/0 00:00:00 /bin/bash
root 9 1 0 07:03 pts/0 00:00:00 ps -ef
docker attach로 진입한 후 exit 명령어 실행
이 방식으로 컨테이너에 접근하면, 컨테이너의 기본 프로세스 (이 경우 /bin/bash)에 직접 접근하게 됩니다.
docker attach myubuntu
여기서 exit 명령어를 입력하면 어떻게 될까요?
root@5cdae46966de:/# exit
init 시스템인 PID 1 프로세스 /bin/bash가 종료됨에 따라 컨테이너 자체가 중지됩니다.
따라서 ctrl + P, Q를 입력해 쉘을 종료하지 않고 컨테이너를 빠져나와야 합니다.
docker exec로 진입한 후 exit 명령어 실행
이번엔 새로운 터미널을 사용하여 컨테이너에 접근해 보겠습니다.
docker exec -it myubuntu /bin/bash
exec 명령어로 접근 시 메인 프로세스로 실행 중인 쉘에 접근하는게 아닌, 별도의 새 프로세스로 쉘을 생성하고 접근합니다.
root@5cdae46966de:/# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:15 pts/0 00:00:00 /bin/bash
root 10 0 1 07:18 pts/1 00:00:00 /bin/bash
root 19 10 0 07:18 pts/1 00:00:00 ps -ef
컨테이너 내부를 확인해 보면 bash 프로세스가 PID 1 외에 추가로 생긴 것을 확인할 수 있습니다.
이제 exit 명령어를 입력하면 exec로 실행된 쉘 프로세스만 종료됩니다. 컨테이너의 PID 1인 메인 프로세스는 종료되지 않았으므로 컨테이너는 계속 동작합니다.
attach, exec 비교 정리
명령어 프로세스 종료 여부 컨테이너 상태 변경 여부
docker attach | PID 1 종료 | 중지 |
docker exec | 새로 생성한 PID 종료 | 동작 |
따라서 컨테이너를 유지하면서 작업하고 싶다면 docker exec를 사용하는 것을 권장합니다.
'Dev > Docker' 카테고리의 다른 글
[시작하세요! 도커/쿠버네티스] 01장 도커란? (0) | 2025.03.25 |
---|---|
[시작하세요! 도커/쿠버네티스] 서문 (0) | 2025.03.24 |
[Docker] Docker 컨테이너 기본 시간대 설정 (1) | 2024.11.11 |