도커 알아보기 - 2

현곤·2025년 2월 26일

도커 컨테이너의 엔트리 포인트란?

컨테이너가 실행될 때 자동으로 실행되는 기본 명령어를 의미

nginx 의 엔트리포인트는 Nginx 서버 실행 명령어인,
(nginx -g 'daemon off;')로 설정되어 있는데

--entrypoint 옵션을 사용하면 이를 덮어쓰고 다른 명령어를 실행할 수 있다

docker run --entrypoint ls nginx
  1. nignx 컨테이너를 실행하지만

  2. 원래 nginx 이미지의 기본 ENTRYPOINT(Nginx 실행)가 아닌

  3. ls 명령어를 실행하도록 덮어쓰는 것

그래서 실행을 하면?

컨테이너가 실행되면서 ls 명령어가 실행되고, nginx 컨테이너 내부의 루트 파일 목록이 출력

그 후 컨테이너는 추가적인 프로세스 없이 종료

근데 이렇게 하면 기본 엔트리포인트는 작동 ❌

도커 컨테이너 실행 시 ENTRYPOINT를 ls로 변경하여 Nginx 서버가 아닌 파일 목록을 출력하고 바로 종료하는 효과


인터렉션과 인터렉티브 모드

인터렉션(Interaction)이란 사용자가 시스템과 상호작용(입력과 출력)하는 것을 의미

즉, 명렁을 입력하면 즉각적으로 응답을 받을 수 있는 방식

인터렉티브 모드(Interactive Mode)는 이런 상호작용이 필요한 프로그램
실행하는 방식으로,

터미널에서 직접 명령을 입력하고 실행할 수 있도록 해준다.

docker run -it --entrypoint bash nginx
  1. nginx 컨테이너를 실행하지만, 원래의 엔트리포인트(기본적으로 Nginx 실행)가 아님

  2. bash(셸)를 실행하도록 ENTRYPOINT를 덮어씀

  3. -it 옵션을 사용하여 인터렉티브 모드로 실행함

옵션 설명

  • -i : 표준 입력(STDIN)을 활성화하여 입력을 받을 수 있도록 함

  • -t : 터미널을 할당하여 셸 환경을 제공함

이 명령을 실행하면 nginx 컨테이너 안에서 bash 셸이 실행되며, 사용자는 직접 명령을 입력 할 수 있다.

bash에서 나가는 방법

exit

또는 Ctrl + D

그래서 정리하자면

  • 인터렉션(Interaction) : 사용자와 시스템 간의 상호작용 (입력 → 실행 → 출력)

  • 인터렉티브 모드(Interactive Mode) : 사용자가 직접 명령어를 입력하고
    실행할 수 있는 모드

  • -it 옵션: 도커 컨테이너에서 인터렉티브 모드로 실행할 때 사용

  • ENTRYPOINT를 bash 로 변경 : 기본 실행 명령을 Nginx가 아닌 Bash 셸로 변경하여 직접 명령을 입력할 수 있도록 함


도커 이미지 정보 확인

도커 컨테이너의 생명주기를 결정하는 주 프로세스를 생성하는 명령어를 최종 실행 명령어라 하는데

최종 실행 명령어엔트리포인트 + 명령어로 이루어짐

최종 실행 명령어 = ENTRYPOINT + CMD

CMD : ENTRYPOINT에 전달되는 기본 인자(명령어)

각 옵션은 도커 이미지 실행시에 재지정이 가능

명령어 설명

1. 도커 이미지의 전체 정보 확인

docker inspect nginx
  • nginx 이미지의 모든 정보를 JSON 형식으로 출력

  • 환경 변수, 네트워크 설정, ENTRYPOINT, CMD, 볼륨 등 다양한 정보 포함

2. 기본 엔트리포인트(ENTRYPOINT) 확인

docker inspect nginx | grep -A 1 '"Entrypoint"'
  • nginx 이미지의 ENTRYPOINT 값을 확인

  • grep -A 1 옵션은 "Entrypoint" 라는 키를 찾고, 그 다음 줄까지 출력

3. 기본 명령어(CMD) 확인

docker inspect nginx | grep -A 4 '"CMD"'
  • nginx 이미지의 CMD 값을 확인

  • grep -A 4 옵션은 "CMD" 라는 키를 찾고, 그 다음 4줄까지 출력

쉽게 말하면

  • 컨테이너가 실행될 때 기본적으로 실행되는 명령어(ENTRYPOINT + CMD)가 있다

  • docker inspect 명령어로 도커 이미지의 세부 정보를 확인할 수 있음

  • grep 을 사용하면 필요한 정보(ENTRYPOINT, CMD)만 골라서 볼 수 있음


docker run을 자세하게

첫번 째 명령어 : docker run nginx

  • docker run 명령어
docker run nginx
  • docker run 명령어 : 기본 명령어가 명시적으로 지정
docker run nginx "nginx" "-g" "daemon off;"
  • docker run 명령어 : 기본 엔트리포인트까지 명시적으로 지정
docker run --entrypoint ./docker-entrypoint.sh nginx
  • 최종 실행 명령어
./docker-entrypoint.sh "nginx" "-g" "daemon off;"
  • ./docker-entrypoint.sh 에서 마지막에 실행되는 명령어
./docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
./docker-entrypoint.d/15-local-resolvers.envsh
./docker-entrypoint.d/20-envsubst-on-templates.sh
./docker-entrypoint.d/30-tune-worker-processes.sh
nginx -g "daemon off;"

두번 째 명령어 : docker run nginx ls -al

  • docker run 명령어
docker run nginx ls -al
  • docker run 명령어 : 기본 엔트리포인트까지 명시적으로 지정
docker run --entrypoint ./docker-entrypoint.sh nginx ls -al
  • 도커 컨테이너 내부에서 실행되는 명령어
./docker-entrypoint.sh "ls" "-al"
  • 최종적으로 도커 컨테이너 내부에서 실행되는 명령어
ls -al

--rm

  • --rm 옵션 없이 실행:
    컨테이너가 실행 후 종료되더라도 종료된 컨테이너가 목록에 남아있어 이후 확인하거나 디버깅할 때 유용
  • --rm 옵션 사용 시:
    컨테이너가 실행 후 자동으로 삭제되어 디스크 공간을 절약하고 깔끔한 환경을 유지

--rm 없이 실행

# --rm 옵션 없이 hello-world 컨테이너 실행
docker run hello-world
docker ps -a

--rm 사용하여 실행

docker rm blissful_morse # 기존 도커 컨테이너 제거
docker run --rm hello-world

# 컨테이너 실행 후, 자동으로 삭제되어 목록에 나타나지 않음
docker ps -a
# (종료된 hello-world 컨테이너가 존재하지 않음)
  • --rm 옵션 미사용 :
    - 종료된 컨테이너가 남아 있어 이후 상태 확인이나 로그 분석에 좋음
    • 단, 컨테이너가 계속 쌓이면 디스크 공간을 차지
  • --rm 옵션 사용 :
    - 컨테이너가 종료되면 자동으로 삭제되어 환경이 깔끔
    • 단, 디버깅시 컨테이너 정보를 확인하기 어려움

컨테이너 중지 & 실행 모드 (-d)

1. 컨테이너 중지

docker stop 컨테이너 ID 또는 컨테이너 이름
  • 실행 중인 컨테이너를 중지(stop) 시키는 명령어

  • 주로 백그라운드에서 실행된 컨테이너를 종료할 때 사용


2. -d 옵션 (백그라운드 실행)

도커 컨테이너를 실행할 때, -d 옵션을 사용하면 실행 방식이 달라짐

-d 옵션 사용 (Detach 모드, 백그라운드 실행)

docker run -d nginx
  • 백그라운드에서 실행, 터미널 점유 ❌

  • 실행한 후에도 터미널에서 다른 작업 가능

  • 예: nginx 웹 서버를 계쏙 실행하면서 터미널을 자유롭게 사용 가능

-d 옵션 미사용 (Foreground 모드, 포그라운드 실행)

docker run nginx
  • 포그라운드에서 실행, 터미널 점유 ⭕

  • 실행한 컨테이너의 출력이 터미널에 직접 표시

  • 컨테이너가 종료될 때까지 터미널 사용 ❌


쉽게 말해

  • docker stop → 실행 중인 컨테이너를 중지하는 명령어

  • -d 옵션 → 컨테이너를 백그라운드에서 실행할지(Foreground vs. Background)
    결정하는 옵션

    • -d 사용하면 백그라운드 실행, 터미널에서 자유롭게 다른 작업 가능

    • 데몬(서비스) 형태의 실행에 적합

    • -d 없으면 포그라운드 실행, 컨테이너가 끝날 때까지 터미널 점유

    • 로그를 실시간으로 확인 가능


docker logs, --name 옵션

1. name 옵션 (컨테이너 이름 지정)

docker run --name my-nginx -d nginx
  • --name my-nginx : 컨테이너 이름을 my-nginx로 지정

  • 컨테이너 ID 대신 이름으로 컨테이너를 관리할 수 있음

  • 컨테이너 이름은 유일해야 한다(Unique) 같은 이름 ❌


2. docker logs (컨테이너 로그 확인)

도커 컨테이너가 실행되면서 생성하는 출력(stdout)과 에러(stderr) 로그를 확인하는 명령어

기본 로그 조회

docker logs my-nginx
  • my-nginx 컨테이너의 실행 로그를 출력

  • 백그라운드에서 실행되는 컨테이너의 상태를 확인하거나 디버깅할 때 유용

-f 옵션 (실시간 로그 확인)

docker logs -f my-nginx
  • 로그를 실시간으로 모니터링 (새로운 로그가 생성될 때 계속 출력)

  • 웹 서버(Nginx, Apache)나 애플리케이션 로그를 실시간으로 확인할 때 사용

--timestamps 옵션 (타임스탬프 포함)

  • 각 로그에 타임스탬프(날짜, 시간) 포함

  • 로그 발생 시간을 확인하여 문제 발생 시점을 파악할 때 유용


쉽게 말해

  • --name 옵션 → 컨테이너에 고유한 이름을 지정할 수 있음

  • docker logs 컨테이너 이름 → 실행 중인 컨테이너의 로그를 확인

  • -f 옵션실시간 로그 모니터링 (새로운 로그 자동 표시)

  • --timestamps 옵션 → 로그에 시간 정보를 추가하여 언제 발생한 로그인지 확인 가능


docker start, -a 옵션

1. docker start

이전에 실행되었다가 중지된 컨테이너를 다시 실행할 때 사용

기본 동작 (Detach 모드, 백그라운드 실행)

docker start 컨테이너 이름
  • 중지된 컨테이너를 다시 실행하지만, 터미널에 출력이 나타나지 않음

  • 백그라운드(Detach 모드)에서 실행됨

  • 즉, 실행되긴 하지만 아무런 출력이 보이지 않고, 터미널에서 다른 작업이 가능

docker start hello-world
  • hello-world 컨테이너가 다시 실행되지만, 실행 결과는 터미널에 표시 ❌

2. -a 옵션 (Attach)

docker start -a 컨테이너 이름
  • 중지된 컨테이너를 다시 실행하면서, 표준 출력(stdout)과 표준 에러(stderr)를
    터미널에서 바로 확인 가능

  • 즉, 컨테이너의 실행 결과나 메시지를 직접 볼 수 있음

docker start -a hello-world
  • hello-world 컨테이너를 다시 실행하고, 실행 결과를 터미널에서 확인 가능

  • hello-world 컨테이너는 실행 후 자동으로 종료되므로, 실행 메시지가 표시된 후 종료


쉽게 말해

  • docker start 컨테이너 이름 → 컨테이너를 다시 시작하지만, 백그라운드에서 실행되므로 터미널에 출력이 보이지 않음

  • docker start -a 컨테이너 이름 → 컨테이너를 다시 시작하면서, 출력 내용을 터미널에서 바로 확인 가능


docker kill, docker stop

1. docker stop (안전한 종료)

docker stop 컨테이너 이름
  • 컨테이너에 SIGTERM 신호를 보내 정상적으로 종료할 기회를 줌

  • 내부 프로세스가 정리할 시간을 가질 수 있음

  • 일정 시간 내 종료되지 않으면 자동으로 SIGKILL 을 보내 강제 종료

  • 데이터 손실을 방지하면서 안전하게 종료하고 싶을 때 사용

예제

docker stop my-containor
  • my-containor 를 정상적으로 종료

2. docker kill (즉시 강제 종료)

docker kill 컨테이너 이름
  • 컨테이너에 SIGKILL 신호를 보내 즉시 강제 종료

  • 정상 종료 기회 없이 즉각적으로 프로세스를 중단

  • 내부 작업이 진행 중이더라도 강제 종료되므로 데이터 손실 위험이 있음

  • 프로세스를 빠르게 중단해야 할 때 사용

예제

docker kill my-containor
  • my-containor즉시 종료

3. docker rm -f (강제 삭제)

docker rm -f 컨테이너 이름
  • 실행 중인 컨테이너를 강제 삭제

  • 내부적으로 docker kill 을 실행한 후 컨테이너를 제거

  • 실행 중인 컨테이너를 강제 종료하고 삭제까지 한 번에 진행

예제

docker kill my-containor
  • my-containor 를 강제 종료하고 삭제

  • docker stop → 정상적으로 종료하려면 이걸 사용!
  • `docker kill → 바로 강제 종료해야 하면 이걸 사용!
  • docker rm -f → 실행 중인 컨테이너를 종료하고 삭제까지 하려면 이걸 사용!

환경변수

1. 환경변수(Enovironment Variables)란?

  • 컨테이너 실행 시 외부에서 설정값을 전달할 수 있도록 하는 기능

  • 데이터 베이스 연결 정보, API 키, 애플리케이션 설정 등을 하드코딩하지 않고 환경변수로 관리 가능

  • 보안성 및 유연성 증가 (코드 변경 없이 설정 변경 가능)


2. 컨테이너 실행 시 환경변수 지정 방법

-e 옵션 (개별 환경변수 설정)

docker run -e MY_VAR=HelloDocker nginx
  • MY_VAR=HelloDocker 환경변수를 컨테이너에 전달

  • 컨테이너 내부에서 MY_VAR 값을 사용할 수 있음

--env-file 옵션 (여러 개 환경변수 한 번에 설정)

docker run --env-file env.list nginx
  • env.list 파일에 정의된 여러 개의 환경변수를 한 번에 적용

  • 파일 내용 예시 (env.list)

    	```ini
    	MY_VAR=HelloDocker

    APP_ENV=production

    	```

3. Dockerfile 에서 환경변수 설정 (ENV 명령어)

# Dockerfile 예제
FROM ubuntu
ENV MY_VAR=HelloDocker
  • ENV MY_VAR=HelloDocker → 기본값 설정

  • 실행 시 -e 옵션으로 값을 변경하지 않으면 기본값으로 적용

실행 예시

docker build -t my-image .
docker run my-image
  • MY_VAR 값이 HelloDocker 로 설정됨

  • 실행 시 docker run -e MY_VAR=NewValue my-image 하면 값 변경 가능


4. 준비 스크립트 설명 (env.list 파일 생성 과정)

rm -rf ~/testDockerProjects/exam19  # 기존 폴더 삭제
mkdir -p ~/testDockerProjects/exam19  # 새 폴더 생성
cd ~/testDockerProjects/exam19  # 해당 폴더로 이동
echo MY_VAR=HelloDocker > env.list  # 환경변수 파일 생성 (MY_VAR)
echo APP_ENV=production >> env.list  # 추가 환경변수 설정 (APP_ENV)
  • exam19 폴더를 새로 만들고 env.list 파일 생성

  • env.list 에는 MY_VAR=HelloDocker , APP_ENV=production 값이 저장

  • 이후 --env-file env.list 옵션을 사용하여 컨테이너 실행 시 적용 가능


  • -e 옵션 → 한 개의 환경변수만 설정할 때 사용

  • -env-file 옵션 → 여러 개의 환경변수를 한 번에 설정할 때 사용!

  • ENV (Dockerfile) → 컨테이너 기본값을 설정하는 방법!

환경변수 사용하면 코드 수정 없이 설정을 쉽게 변경할 수 있음

profile
코딩하는 곤쪽이

0개의 댓글