1. 컨테이너 개념 다시 짚어보기
컨테이너는 호스트 컴퓨터 위에서 격리되어 실행되는 프로세스다. Docker 공식 문서에 따르면 컨테이너에서 실행되는 프로세스는 자체 파일 시스템, 자체 네트워크, 호스트와 분리된 프로세스 트리를 가진다. [2]
따라서 학습 관점에서는 컨테이너를 호스트 컴퓨터 안에 따로 마련된 실행 공간으로 이해할 수 있다. 컨테이너마다 파일 시스템, 설치된 프로그램, 실행 중인 프로세스가 분리되어 있기 때문이다. [2]
2. 실행 중인 컨테이너 내부에 접속하기
실행 중인 컨테이너 안에서 명령어를 실행하려면 docker exec 명령을 사용한다.
Docker 공식 문서에 따르면 docker exec는 실행 중인 컨테이너 안에서 새 명령을 실행하는 명령이며, docker container exec의 별칭(alias)이다. [1]
docker exec [옵션] 컨테이너명 명령어
docker exec [옵션] 컨테이너ID 명령어
컨테이너 내부에 쉘로 접속하려면 보통 다음처럼 -it 옵션과 bash를 함께 사용한다.
docker exec -it 컨테이너명 bash
또는 컨테이너 ID를 사용할 수 있다.
docker exec -it 컨테이너ID bash
3. Nginx 컨테이너 내부 접속 예시
먼저 Nginx 컨테이너를 백그라운드에서 실행한다.
docker run -d --name nginx-exec-test nginx
컨테이너가 실행 중인지 확인한다.
docker ps
그 다음 docker exec -it 명령으로 컨테이너 내부에 접속한다.
docker exec -it nginx-exec-test bash
접속 후에는 컨테이너 내부에서 명령어를 실행할 수 있다.
ls
cd /etc/nginx
cat nginx.conf
컨테이너 내부에서 나오려면 다음 중 하나를 사용한다.
exit
또는 터미널에서 Ctrl + D를 입력한다.
4. bash의 의미
bash는 쉘(Shell)의 한 종류다.
쉘은 사용자가 입력한 명령어를 운영체제에 전달하고, 실행 결과를 다시 보여주는 프로그램이다.
docker exec -it nginx-exec-test bash
위 명령은 nginx-exec-test 컨테이너 안에서 bash 명령을 실행한다는 뜻이다.
단, 모든 컨테이너 이미지에 bash가 설치되어 있는 것은 아니다.
예를 들어 가벼운 이미지에는 bash가 없고 sh만 있는 경우가 있다.
이 경우에는 다음처럼 sh로 접속할 수 있다.
docker exec -it 컨테이너명 sh
Docker 공식 문서의 예시에서도 실행 중인 컨테이너 안에 대화형 sh 쉘을 실행할 때 docker exec -it mycontainer sh를 사용한다. [1]
5. -it 옵션의 의미
-it는 실제로 두 옵션을 붙여 쓴 것이다.
-i,--interactive: 표준 입력(STDIN)을 열린 상태로 유지한다. [1]-t,--tty: 가상 터미널(pseudo-TTY)을 할당한다. [1]
즉, -it는 컨테이너 안에서 명령어를 직접 입력하고 결과를 확인할 수 있도록 만드는 조합이다.
docker exec -it 컨테이너명 bash
-it 없이 단일 명령만 실행할 수도 있다.
docker exec nginx-exec-test ls /etc/nginx
위 명령은 컨테이너 내부의 /etc/nginx 목록을 한 번 출력하고 종료한다.
반면 docker exec -it nginx-exec-test bash는 쉘 세션을 열기 때문에, 사용자가 exit 또는 Ctrl + D로 나가기 전까지 계속 명령어를 입력할 수 있다.
6. docker exec 사용 시 주의할 점
docker exec는 실행 중인 컨테이너를 대상으로 한다.
Docker 공식 문서에 따르면 docker exec로 지정한 명령은 컨테이너의 기본 프로세스, 즉 PID 1이 실행 중일 때만 실행된다. [1]
따라서 컨테이너가 종료된 상태라면 먼저 컨테이너를 시작해야 한다.
docker start 컨테이너명
docker exec -it 컨테이너명 bash
또한 docker exec로 실행한 명령은 컨테이너가 재시작될 때 자동으로 다시 실행되지 않는다. [1]
7. 핵심 정리
컨테이너 내부 접속
docker exec -it 컨테이너명 bash: 실행 중인 컨테이너 안에서bash실행 [1]docker exec -it 컨테이너ID bash: 컨테이너 ID를 사용해bash실행 [1]docker exec -it 컨테이너명 sh:bash가 없을 때sh실행 [1]옵션
-i,--interactive: 표준 입력을 열린 상태로 유지 [1]-t,--tty: 가상 터미널 할당 [1]-it: 컨테이너 내부에서 계속 명령어를 입력하기 위한 일반적인 조합 [1]종료
exit: 컨테이너 내부 쉘에서 나가기Ctrl + D: 현재 쉘 입력 종료
참고 자료
- Docker Docs,
docker container exec
https://docs.docker.com/engine/reference/commandline/exec - Docker Docs, Running containers
https://docs.docker.com/engine/containers/run/