Docker 컨테이너 실행 시 명령을 설정하는 방법은 ENTRYPOINT와 CMD 두 가지가 있습니다.
• CMD는 기본 실행 명령이지만, docker run에서 인자를 전달하면 완전히 덮어씌워집니다.
• ENTRYPOINT는 고정 실행 명령으로 사용되며, docker run에서 전달한 인자가 ENTRYPOINT에 추가됩니다.
1. ENTRYPOINT: 고정 실행 명령
FROM alpine
ENTRYPOINT ["echo"]
docker run my-image Hello # echo Hello
docker run my-image Hi! # echo Hi!
ENTRYPOINT는 명령어가 고정되며, docker run에서 전달된 인자가 ENTRYPOINT에 추가됩니다.
2. CMD: 기본 실행 명령 (Override 가능)
FROM alpine
CMD ["echo", "Hello, World!"]
docker run my-image # echo Hello, World!
docker run my-image Hi! # Hi! (CMD 전체가 덮어씌워짐)
CMD는 실행할 명령을 설정하지만, 새로운 인자를 전달하면 기존 CMD가 무시됩니다.
3. ENTRYPOINT + CMD
FROM alpine
ENTRYPOINT ["echo"]
CMD ["Hello, World!"]
docker run my-image # echo Hello, World!
docker run my-image Hi! # echo Hi!
ENTRYPOINT가 실행 명령으로 고정되며,CMD는 기본 인자로 동작하지만, docker run에서 새로운 인자를 입력하면 CMD는 덮어씌워집니다.
ENTRYPOINT와 CMD를 함께 사용하면 기본값을 유지하면서도 유연하게 인자를 변경할 수 있습니다.
Kubernetes에서 컨테이너가 실행될 때 어떤 명령을 실행할지 설정하는 방법은 Docker의 ENTRYPOINT와 CMD 개념과 유사합니다.
Kubernetes에서는 command와 args 필드를 사용하여 실행 명령어를 정의합니다.
Kubernetes에서는 command가 Docker의 ENTRYPOINT를, args가 Docker의 CMD를 대체합니다.
1. command만 설정한 경우
• command를 설정하면 Docker 이미지의 ENTRYPOINT를 덮어씁니다.
• args가 없으면 command만 실행됩니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: alpine
command: ["/bin/sh", "-c", "echo 'Hello from Kubernetes'"]
# /bin/sh -c echo 'Hello from Kubernetes'
2.args만 설정한 경우
• args는 Docker 이미지의 CMD를 덮어씌웁니다.
• command가 없으면 원래 ENTRYPOINT 값이 유지됩니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: alpine
args: ["echo", "Hello from Kubernetes"]
# echo "Hello from Kubernetes"
3.command와 args를 함께 사용하는 경우
• command가 ENTRYPOINT를 덮어씌우고,
• args가 인자로 전달됩니다.
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: alpine
command: ["/bin/sh", "-c"]
args: ["echo 'Hello from Kubernetes'"]
# /bin/sh -c echo 'Hello from Kubernetes'
ConfigMap은 애플리케이션에서 사용할 환경 설정 값을 저장하는 객체입니다. 일반적으로 환경 변수, 설정 파일, 커맨드라인 인수 등을 관리할 때 사용됩니다.
주요 특징
• 비밀 정보가 아닌 일반 환경 변수, 설정 값을 저장 (예: API URL, 서비스 포트 등)
• Key-Value 형태로 데이터 저장
• Pod에서 환경 변수, 볼륨 마운트, 커맨드라인 인수로 참조 가능
• YAML 파일 또는 CLI를 통해 생성 가능
ConfigMap (YAML)
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
DB_HOST: "mysql-service"
DB_PORT: "3306"
LOG_LEVEL: "debug"
1. 환경 변수로 주입
envFrom:
- configMapRef:
name: app-config
2. 볼륨 마운트 방식
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
Secret은 비밀번호, API 키, TLS 인증서 등의 민감한 데이터를 저장하기 위한 Kubernetes 객체입니다.
주요 특징
• Base64 인코딩된 데이터를 저장
• ConfigMap과 동일한 방법으로 Pod에서 참조 가능
• 환경 변수 또는 볼륨 마운트 방식으로 사용 가능
• RBAC(Role-Based Access Control)과 결합하여 보안 강화 가능
Secret 예제 (YAML)
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
DB_PASSWORD: c2VjcmV0MTIz # "secret123"를 Base64 인코딩한 값
API_KEY: YXBpa2V5MTIzNDU= # "apikey12345"를 Base64 인코딩한 값
1. 환경 변수로 주입
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
2. 볼륨 마운트 방식
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: app-secret