exec 로 컨테이너에 접근하기

DockerBeginner
지금 연습하기

소개

이 실습에서는 실행 중인 Docker 컨테이너에 들어가는 방법을 배웁니다. 컨테이너는 일회성으로 사용하도록 설계되었지만, 실제로 어떤 일이 발생하는지 파악하려면 실행 중인 환경을 확인해야 하는 경우가 많습니다. 따라서 이 방법은 디버깅에 매우 중요한 기술입니다.

컨테이너 내부의 파일을 확인하거나 실행 중인 프로세스를 점검하거나 문제를 해결하려면 해당 컨테이너 환경에서 명령 셸을 사용해야 하는 경우가 많습니다. docker exec 명령을 사용하면 이미 실행 중인 컨테이너를 다시 빌드하거나 재시작하지 않고도 컨테이너 내부에서 추가 명령을 실행할 수 있습니다.

여기서 "추가"라는 말이 중요합니다. docker exec는 컨테이너의 기본 프로세스를 교체하지 않습니다. 원래 서비스가 계속 실행되는 동안 동일한 컨테이너 네임스페이스 안에서 다른 프로세스를 시작합니다.

다음 단계를 진행합니다.

  • 백그라운드에서 Nginx 컨테이너를 시작합니다.
  • docker exec를 사용해 컨테이너 내부에서 대화형 Bash 셸을 시작합니다.
  • 컨테이너 내부에서 명령을 실행해 운영 체제를 확인합니다.
  • 컨테이너를 종료하고 호스트 터미널로 돌아갑니다.

백그라운드 컨테이너 시작

이 단계에서는 Nginx 이미지를 사용해 새 Docker 컨테이너를 시작합니다. 컨테이너를 백그라운드에서 실행하는 "detached" 모드로 시작하고, 나중에 쉽게 지정할 수 있도록 특정 이름을 지정합니다.

터미널에서 다음 명령을 실행합니다.

docker run -d --name web1 nginx

명령 구성:

  • docker run: 컨테이너를 생성하고 시작하는 명령입니다.
  • -d: 컨테이너를 detached 모드 (백그라운드) 로 실행합니다.
  • --name web1: 컨테이너 이름을 web1로 지정합니다.
  • nginx: 사용할 이미지입니다.

컨테이너가 실행 중인지 확인합니다.

docker ps

활성 컨테이너 목록에 web1이 표시되어야 합니다.

docker exec는 이미 실행 중인 컨테이너 환경에 들어가는 방식으로 동작하므로 컨테이너가 실행 중이어야 합니다. 이미 중지된 컨테이너 내부에서는 셸을 시작할 수 없습니다.

컨테이너에 들어가기

컨테이너가 실행 중이므로 이제 docker exec 명령을 사용해 컨테이너 내부에서 셸 세션을 시작합니다. 이 작업은 원격 서버에 SSH 로 접속하는 것처럼 컨테이너에 "로그인"하는 것과 같습니다.

다음 명령을 실행합니다.

docker exec -it web1 bash

명령 구성:

  • docker exec: 기존 컨테이너 내부에서 명령을 실행합니다.
  • -it: 대화형 세션에 필요한 옵션 조합입니다.
    • -i(interactive): 입력 스트림을 열린 상태로 유지합니다.
    • -t(tty): 의사 터미널을 할당해 실제 명령 프롬프트처럼 동작하게 합니다.
  • web1: 대상 컨테이너의 이름입니다.
  • bash: 컨테이너 내부에서 실행할 명령입니다. 여기서는 Bash 셸을 시작합니다.

즉, docker exec는 "컨테이너 내부에서 이 명령을 실행하라"는 의미입니다. 셸은 대표적인 사용 사례 중 하나일 뿐이며, ls, cat 또는 디버깅 유틸리티를 실행할 수도 있습니다.

변경된 내용을 확인합니다.

이 명령을 실행하면 명령 프롬프트가 바뀝니다. 다음과 비슷한 형태로 표시됩니다. root@<container-id>:/#

이는 이제 호스트 머신이 아니라 컨테이너 내부에서 명령을 실행하고 있다는 뜻입니다.

이 격리에는 일반적으로 파일 시스템의 관점, 프로세스 네임스페이스, 네트워크 컨텍스트가 포함됩니다. 여전히 동일한 커널을 사용하지만, 이제 호스트의 전체 환경이 아니라 컨테이너에 한정된 환경을 보고 있습니다.

컨테이너 환경 확인

이제 컨테이너 내부에 있습니다. 현재 표시되는 파일 시스템은 LabEx 환경이 아니라 컨테이너에 속합니다. 운영 체제 정보를 확인하면 이를 검증할 수 있습니다.

컨테이너 셸 내부에서 다음 명령을 실행합니다.

cat /etc/os-release

Nginx 이미지에서 사용하는 Linux 배포판을 설명하는 출력이 표시됩니다. 일반적으로 Debian 입니다.

출력 예시:

PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
...

이 출력은 컨테이너에 호스트와 분리된 자체 운영 체제 환경이 있음을 확인해 줍니다.

더 정확히 말하면 컨테이너에는 자체 사용자 공간 파일 시스템과 프로세스 환경이 있습니다. 별도의 커널을 사용하는 것은 아니지만, 컨테이너 내부에서는 작은 독립 Linux 시스템처럼 느껴질 수 있습니다.

종료하고 호스트로 돌아가기

컨테이너 디버깅이나 점검을 마쳤다면 셸 세션을 종료하고 호스트 머신으로 돌아가야 합니다.

컨테이너 내부에서 다음 명령을 입력합니다.

exit

Enter 키를 누르면 명령 프롬프트가 표준 LabEx 사용자 프롬프트로 돌아와야 합니다.

무슨 일이 발생했나요?

컨테이너 내부에서 실행 중이던 Bash 프로세스를 종료했습니다. 하지만 기본 프로세스인 Nginx 가 계속 실행 중이므로 컨테이너 자체 (web1) 는 여전히 백그라운드에서 실행됩니다.

이것이 docker exec의 컨테이너 수명 주기와 관련된 핵심 내용입니다. 대화형 셸을 종료해도 컨테이너는 중지되지 않습니다. 해당 셸이 컨테이너의 수명을 결정하는 기본 프로세스인 경우에만 셸 종료로 컨테이너가 중지됩니다.

다음 명령을 실행하면 이를 확인할 수 있습니다.

docker ps

web1이 여전히 목록에 표시됩니다.

정리하려면 다음 명령으로 컨테이너를 중지하고 삭제할 수 있습니다.

docker rm -f web1

요약

이 실습에서는 docker exec -it를 사용해 실행 중인 컨테이너에 접근하는 방법을 배웠습니다. 다음 작업을 실습했습니다.

  • 백그라운드에서 컨테이너 시작
  • 대화형 Bash 셸을 사용해 컨테이너에 들어가기
  • 컨테이너 내부에서 환경 확인
  • 서비스를 계속 실행한 상태로 안전하게 종료

이는 Docker 를 다루기 위한 기본 기술입니다. 이 방법을 사용하면 애플리케이션의 문제를 해결하고 컨테이너 환경을 직접 점검할 수 있습니다.