심플코더
간단한 코딩 공간
   

글쓰기    관리    수식입력
  • 분류 전체보기 (84)
    • AWS (1)
    • JavaScript (11)
    • 개인학습 (5)
    • DB (11)
    • OS (9)
    • Network (7)
    • DevOps (0)
    • TypeScript (1)
    • 개발 (1)
    • CKA (28)
hELLO · Designed By 정상우.
심플코더

간단한 코딩 공간

CKA

Docker 명령어와 엔트리포인트(CMD vs ENTRYPOINT)

도커 컨테이너 안에서는 어떤 프로세스가 실행되나?

 

이미지마다 다르지만, 이미지 내부에는 어떤 프로세스를 실행할지 정의되어 있다. 바로 Dockerfile의 CMD 항목이다.

 

예를 들어,

 

  • nginx 이미지에서는 CMD ["nginx"]
  • mysql 이미지에서는 CMD ["mysqld"]

 

이런 식으로 정의되어 있고, 컨테이너 실행 시 이 명령이 자동 실행된다.

 

하지만 Ubuntu 이미지는 CMD ["bash"] 로 되어 있다. bash는 터미널 환경이 있어야 동작하는데, 도커는 기본적으로 터미널을 붙이지 않기 때문에 bash가 바로 종료되고, 컨테이너도 종료된다.

 

 

CMD 덮어쓰기: 실행할 명령어 바꾸기

 

docker run 명령 뒤에 명령어를 붙이면, 이미지에 정의된 CMD를 덮어쓸 수 있다.

docker run ubuntu sleep 5

이렇게 하면 bash가 아니라 sleep 5 명령이 실행된다. sleep 5초 후 컨테이너가 종료된다.

 

그런데 매번 실행할 명령을 뒤에 붙이는 건 번거롭다. 아예 이미지 자체를 sleep 전용으로 만들 수 없을까?

 

 

Dockerfile에서 CMD 변경하기

FROM ubuntu
CMD ["sleep", "5"]

이렇게 Dockerfile을 작성하고 docker build -t ubuntu-sleeper . 하면, sleep 5가 실행되는 컨테이너 이미지를 만들 수 있다.

docker run ubuntu-sleeper

이제 명령어를 뒤에 안 붙여도 sleep 5가 자동 실행된다.

 

 

sleep 5가 아니라 sleep 10으로 바꾸고 싶다면?

 

앞서 CMD는 덮어쓰기라고 했었다. 즉, 명령어를 뒤에 붙이면 CMD 자체가 통째로 바뀐다.

docker run ubuntu-sleeper sleep 10

이렇게 하면 CMD가 sleep 10으로 완전히 바뀌어 실행된다.

 

그런데 이건 좀 이상하다. 이미지 이름이 ubuntu-sleeper인데, sleep 명령어까지 다시 써줘야 한다니. 아래처럼 쓸 수는 없을까?

docker run ubuntu-sleeper 10

이렇게 숫자만 넘기고도 sleep이 자동으로 실행되는 구조.

 

 

ENTRYPOINT의 등장

 

ENTRYPOINT를 사용하면 된다.

FROM ubuntu
ENTRYPOINT ["sleep"]

이렇게 설정하면, docker run ubuntu-sleeper 10 이라는 명령어를 실행했을 때, ENTRYPOINT인 sleep에 인자로 10이 붙어서 실행된다. 실제로는 sleep 10이 실행되는 것과 동일하다.

 

즉,

 

  • CMD: 통째로 덮어쓰기
  • ENTRYPOINT: 뒤에 인자만 붙는다

 

그렇다면 docker run ubuntu-sleeper처럼 숫자도 안 붙이면?

Error: missing operand

이런 오류가 뜨게 된다. sleep 뒤에 숫자를 꼭 넣어줘야 하니까.

 

 

ENTRYPOINT + CMD 조합

 

기본 인자를 넣어주고 싶다면 CMD와 같이 쓰면 된다.

FROM ubuntu
ENTRYPOINT ["sleep"]
CMD ["5"]

이렇게 하면

 

  • docker run ubuntu-sleeper → sleep 5
  • docker run ubuntu-sleeper 10 → sleep 10

 

즉, CMD는 기본 인자이고, 명령어 입력 시 덮어씌워진다.

 

이 구조는 꼭 JSON 배열로 써야 의도대로 동작한다.

 

 

ENTRYPOINT를 강제로 바꾸고 싶다면?

docker run --entrypoint sleep2.0 ubuntu-sleeper 10

이렇게 --entrypoint 옵션을 주면 이미지의 ENTRYPOINT도 덮어쓸 수 있다. 결국 실행되는 명령은 sleep2.0 10이다.

 

 

마무리

 

Docker에서는 CMD와 ENTRYPOINT를 통해 컨테이너 내부에서 어떤 프로세스를 어떻게 실행할지를 유연하게 조절할 수 있다.

 

  • CMD만 있으면, docker run 뒤의 명령이 통째로 교체된다.
  • ENTRYPOINT가 있으면, docker run 뒤의 인자가 ENTRYPOINT 뒤에 붙는다.
  • ENTRYPOINT + CMD 조합이면, ENTRYPOINT는 고정된 명령이고, CMD는 기본 인자 역할을 한다.

 

이 원리를 알아두면 Kubernetes의 pod 명령어 설정에서도 매우 유용하게 활용할 수 있다

'CKA' 카테고리의 다른 글

Kubernetes Deployment 업데이트와 롤백  (0) 2025.04.09
Kubernetes Logging  (0) 2025.04.02
Kubernetes Monitoring  (0) 2025.04.01
Kubernetes Admission Controller의 두 가지 유형  (0) 2025.03.30
(TIL) Scheduler Profiles  (0) 2025.03.30
    'CKA' 카테고리의 다른 글
    • Kubernetes Deployment 업데이트와 롤백
    • Kubernetes Logging
    • Kubernetes Monitoring
    • Kubernetes Admission Controller의 두 가지 유형
    심플코더
    심플코더

    티스토리툴바