[Docker] 인터랙티브 모드, Entrypoint/Cmd, 폐쇄망 배포

윤하빈·2026년 6월 30일

개발 공부

목록 보기
15/18
post-thumbnail

1. 인터랙티브 모드 (-it 옵션)

도커 컨테이너는 기본적으로 백그라운드에서 혼자 실행됨. 컨테이너 내부 터미널로 진입하여 직접 조작하고 싶을 때 -it 옵션을 사용함.

# 컨테이너 내부로 들어가기 (bash 셸 실행)
docker run -it --entrypoint bash nginx

# 컨테이너 내부에서 빠져나오기
exit
  • -i (Interactive): 사용자의 키보드 입력을 컨테이너 표준 입력(stdin)으로 전달함.
  • -t (TTY): 가상 터미널을 할당하여 화면 출력 형식을 터미널 형태로 보여줌.
  • --entrypoint bash: 이미지의 기본 엔트리포인트를 bash 셸로 교체하여 진입함.

2. 최종 실행 명령어의 구조 (Entrypoint + Cmd)

도커 컨테이너가 실행될 때 작동하는 최종 명령어는 EntrypointCmd의 조합으로 결정됨.

최종 실행 명령어 = Entrypoint + Cmd

이미지 내부 정보 확인 명령어

# 이미지 전체 정보 확인
docker inspect nginx

# 엔트리포인트(설정 파일 등) 정보만 필터링
docker inspect nginx | grep -A 1 '"Entrypoint"'

# 기본 실행 명령어(Cmd) 정보만 필터링
docker inspect nginx | grep -A 4 '"Cmd"'

Entrypoint와 Cmd 재지정 방법

  • Cmd만 교체: docker run [이미지명] [새로운 Cmd] 형태로 이미지명 뒤에 명령어 삽입 (예: docker run nginx echo "hello")
  • Entrypoint 교체: --entrypoint 옵션을 명시하여 강제로 교체 (예: docker run --entrypoint bash nginx)

3. docker-entrypoint.sh 스크립트의 역할

컨테이너가 켜질 때 필요한 사전 준비 작업(환경 변수 설정, 초기화 등)을 마치고, 실제 메인 애플리케이션(nginx 등)에 바통을 넘겨주는 징검다리 역할을 함.

컨테이너 시작
    ↓
docker-entrypoint.sh 실행
    ↓
첫 번째 인자($1)가 "nginx"인가?
    ├── YES → /docker-entrypoint.d/ 내부 사전 준비 스크립트들 순차 실행
    └── NO  → 준비 작업 건너뜀
    ↓
exec "$@" 실행 → nginx에 프로세스 제어권 이양 (PID 1번 교체)

핵심 포인트: `exec "$@"이 명령어를 통해docker-entrypoint.sh셸 스크립트 프로세스가nginx프로세스로 완전히 대체됨. 결과적으로nginx`가 PID 1(주 프로세스)을 가지게 되며, 이 PID 1번이 살아있는 동안 컨테이너가 유지됨.


4. docker run 작동 케이스 분석

케이스 1: docker run nginx (기본 실행)

  • 실제 내부 동작: docker run --entrypoint ./docker-entrypoint.sh nginx "nginx" "-g" "daemon off;"
  • 사전 준비 스크립트(10-...sh, 15-...sh 등)가 정상 작동함.
  • 최종적으로 nginx -g "daemon off;"가 주 프로세스(PID 1)로 실행되어 컨테이너가 계속 유지됨.

케이스 2: docker run nginx ls -al (Cmd 교체 실행)

  • 실제 내부 동작: ./docker-entrypoint.sh "ls" "-al" 호출.
  • 첫 번째 인자가 nginx가 아니므로 사전 준비 작업을 전부 건너뜀.
  • ls -al이 실행되어 디렉토리 목록을 출력한 후, 주 프로세스가 종료되므로 컨테이너도 즉시 종료(Exited)됨.

5. 폐쇄망 환경에서 도커 이미지 사용하기

외부 인터넷이 차단된 폐쇄망(서버실 등) 환경에서는 docker pull을 통한 Docker Hub 접근이 불가능함. 이때 이미지를 파일 형태로 추출하여 이동시키는 방식을 사용함.

# [인터넷 가능 환경] 도커 이미지를 tar 파일로 저장
docker save nginx > nginx.tar

# [폐쇄망 환경] tar 파일로부터 도커 이미지 로드
docker load < nginx.tar

💡 정리해 보자면

  • -it: 컨테이너 내부 터미널로 진입할 때 필수.
  • Entrypoint: 항상 실행되는 사전 준비 및 실행 프로그램.
  • Cmd: 엔트리포인트 뒤에 붙는 실제 매개변수 및 명령어.
  • exec "$@": 프로세스를 교체하여 메인 앱이 PID 1번을 갖게 만드는 핵심 문법.
  • save / load: 인터넷이 안 되는 폐쇄망 배포의 방법.

1개의 댓글

comment-user-thumbnail
2026년 8월 7일

최고의 개발자 윤하빈

답글 달기