좋아, 태기야! 지난 시간에 쿠버네티스의 레이블과 셀렉터를 알아봤으니, 이번에는 그보다 더 근본적인 단위인 컨테이너 이미지를 만들 때 많은 사람들이 헷갈려 하는 작은 개념 하나를 확실하게 짚고 넘어가 볼게.
바로 Dockerfile을 작성할 때마다 고민하게 되는 CMD와 ENTRYPOINT의 차이점이야! 둘 다 컨테이너가 시작될 때 명령어를 실행하는 것 같은데, 도대체 뭐가 다른 걸까? 오늘 제대로 파헤쳐 보자! 😄
제목: ✅ [개념정리] Dockerfile의 CMD와 ENTRYPOINT, 뭐가 다를까? 🤔 (헷갈리는 개념 바로잡기)
부제 (선택): 컨테이너의 첫인상을 결정하는 두 명령어, 완벽하게 이해하고 사용하기! 🚀
[들어가며: 컨테이너의 시작을 알리는 두 가지 방법]
Dockerfile을 작성하다 보면, 컨테이너가 시작될 때 실행될 명령어를 지정하기 위해 CMD나 ENTRYPOINT라는 지시어(instruction)를 사용하게 돼.
"둘 다 명령어를 실행하는 것 같은데, 왜 두 가지나 있고 정확히 어떤 차이가 있는 걸까?"
이 둘의 미묘하지만 아주 중요한 차이점을 이해하면, 훨씬 더 유연하고 예측 가능한 컨테이너 이미지를 만들 수 있어. 지금부터 이 둘의 정체를 밝혀보자!
Part 1: CMD – 컨테이너의 "기본값" 명령어 🍽️
**CMD**는 컨테이너가 시작될 때 실행될 기본(default) 명령어를 지정해. 여기서 핵심 단어는 바로 **'기본값'**이야.
- 핵심 특징: docker run 명령어를 사용할 때 뒤에 다른 명령어를 붙이면, Dockerfile에 있던 CMD 명령어는 쉽게 무시되고 새로운 명령어로 덮어써져(override).
- 사용 형식:
- CMD ["실행파일", "파라미터1", "파라미터2"] (exec form, 권장 형식)
- CMD 명령어 파라미터1 파라미터2 (shell form)
- 간단한 예시:
-
Dockerfile
FROM ubuntu:latest CMD ["echo", "Hello from CMD"] - 실행 결과:
- docker run <이미지이름> → CMD에 지정된 기본 명령어가 실행되어 "Hello from CMD"가 출력돼.
- docker run <이미지이름> ls -l → docker run 뒤에 붙인 ls -l 명령어가 기존 CMD를 완전히 덮어쓰고 실행돼. "Hello from CMD"는 출력되지 않아.
CMD는 사용자가 별다른 명령을 주지 않았을 때를 위한 '기본 메뉴' 같은 거야. 손님이 다른 메뉴를 주문하면 기본 메뉴는 나오지 않지!
Part 2: ENTRYPOINT – 컨테이너의 "고정" 실행 파일 🚀
**ENTRYPOINT**는 컨테이너를 하나의 특정 실행 파일처럼 동작하도록 만들 때 사용해. 여기서 핵심 단어는 **'고정'**이야.
- 핵심 특징: docker run 명령어 뒤에 오는 내용들은 ENTRYPOINT 명령어를 덮어쓰는 게 아니라, ENTRYPOINT에 지정된 실행 파일에 **전달되는 파라미터(인자)**로 취급돼.
- 사용 형식:
- ENTRYPOINT ["실행파일", "파라미터1", "파라미터2"] (exec form, 권장 형식)
- ENTRYPOINT 명령어 파라미터1 파라미터2 (shell form)
- 간단한 예시:
-
Dockerfile
FROM ubuntu:latest ENTRYPOINT ["ping", "localhost"] - 실행 결과:
- docker run <이미지이름> → ENTRYPOINT에 지정된 ping localhost 명령어가 실행돼.
- docker run <이미지이름> -c 5 → docker run 뒤에 붙인 -c 5가 ENTRYPOINT 명령어의 파라미터로 추가되어, 최종적으로 ping localhost -c 5가 실행돼.
- ENTRYPOINT 자체를 바꾸려면 docker run --entrypoint <바꿀명령어>처럼 별도의 플래그를 사용해야만 해.
ENTRYPOINT는 이 컨테이너가 '어떤 프로그램인지'를 고정하는 역할을 해. ping 프로그램 컨테이너, curl 프로그램 컨테이너처럼 말이야!
Part 3: ENTRYPOINT와 CMD의 환상적인 조합! 🤝
사실 CMD와 ENTRYPOINT의 진가는 이 둘을 함께 사용할 때 드러나!
Best Practice: ENTRYPOINT로는 고정된 실행 파일을 지정하고, CMD로는 그 실행 파일의 "기본 파라미터"를 지정한다.
- 동작 방식: CMD에 지정된 내용이 ENTRYPOINT에 지정된 명령어의 기본 파라미터로 합쳐져서 실행돼. 그리고 docker run 뒤에 다른 인자를 주면 CMD의 기본 파라미터만 덮어쓰게 되지.
- 최고의 예시:
-
Dockerfile
FROM ubuntu:latest ENTRYPOINT ["ping"] CMD ["-c", "3", "localhost"] - 실행 결과:
- docker run <이미지이름> → ENTRYPOINT와 CMD가 합쳐져서 ping -c 3 localhost가 실행돼. (CMD가 기본 파라미터 역할을 했지?)
- docker run <이미지이름> google.com → docker run 뒤에 붙인 google.com이 CMD의 기본 파라미터를 덮어쓰고, ENTRYPOINT의 파라미터가 돼. 최종적으로 ping google.com이 실행돼.
이렇게 조합하면, 이 컨테이너는 **"기본적으로 localhost에 3번 ping을 보내는, 하지만 원하면 다른 주소에도 ping을 보낼 수 있는 ping 전용 컨테이너"**가 되는 거야. 정말 유연하고 직관적이지?
[마무리하며: 그래서, 언제 뭘 써야 할까? 🎯]
- ENTRYPOINT를 써야 할 때:
- 컨테이너를 하나의 실행 파일(도구)처럼 만들고 싶을 때.
- 메인 애플리케이션은 고정하고, 실행 시 파라미터만 유연하게 바꾸고 싶을 때.
- CMD만 써야 할 때:
- 컨테이너의 기본 실행 명령어를 지정하되, 사용자가 docker run으로 완전히 다른 명령어를 실행할 수 있도록 허용하고 싶을 때. (예: ubuntu 이미지의 기본 bash 쉘)
- ENTRYPOINT와 CMD를 함께 쓸 때 (강력 추천!):
- 컨테이너의 주된 실행 파일을 ENTRYPOINT로 고정하고, CMD로 기본 파라미터를 제공하여 유연성을 더하고 싶을 때.
이제 CMD와 ENTRYPOINT의 차이점이 확실히 정리되었기를 바란다! 이 둘의 관계를 잘 이해하고 Dockerfile을 작성하면, 훨씬 더 재사용하기 좋고 직관적인 컨테이너를 만들 수 있을 거야. 😊
'02. 클라우드 보안 공부 > 개념정리' 카테고리의 다른 글
| ✅ [개념정리] OWASP Top 10 파헤치기 (1/10): A01 - 취약한 접근 통제 (Broken Access Control) (0) | 2025.09.03 |
|---|---|
| ✅ [개념정리] 쉘 스크립트의 작은따옴표('')와 큰따옴표(""), 결정적 차이! (2) | 2025.07.29 |
| ✅ [개념정리] 쿠버네티스의 영혼의 단짝, 레이블과 셀렉터! 🏷️ (오브젝트를 연결하는 법) (0) | 2025.07.29 |
| ✅ [개념정리] 쉘 스크립트의 마법 주문, set -eux! 🧙♂️ (스크립트 디버깅 & 안정성 높이기) (2) | 2025.07.21 |
| ✅ [개념정리] 파드, 컨테이너, 도커, 쿠버네티스: 핵심 관계 완전 정복!🏗️ (0) | 2025.05.23 |