도커 컨테이너 안에서는 어떤 프로세스가 실행되나?
이미지마다 다르지만, 이미지 내부에는 어떤 프로세스를 실행할지 정의되어 있다. 바로 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 |