π³ Dockerfile vs Helm values νκ²½ λ³μ κ΄λ¦¬
λ°°ν¬ νκ²½ λ³μ, μ΄λ»κ² κ΄λ¦¬νλ κ² μ’μκΉ?
μλ
μ μ§νν νλ‘μ νΈμμ μΏ λ²λ€ν°μ€ κΈ°λ°μ μ¬λ΄ λ°°ν¬ ν΄μ νμ©ν΄ κ°λ°, μ€ν
μ΄μ§, μ΄μ νκ²½μ ꡬμΆνκ² λμλ€. κ·Έλ°λ° λ°°ν¬ νκ²½λ³λ‘ νκ²½ λ³μλ₯Ό μ΄λ»κ² ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ§ κ³ λ―Όμ΄ μκ²Όλ€.
μ μ΄ λ¬Έμ λ₯Ό κ³ λ―ΌνμκΉ?
κΈ°μ‘΄ λ°©μμμλ μ¬λ΄ λ°°ν¬ ν΄μμ μ§μ Dockerμ νκ²½ λ³μλ₯Ό μ
λ ₯ν΄μΌ νλ€. μ΄λ κ² νλ©΄ μ΄μ νκ²½κ³Ό κ°λ° νκ²½μ λΆλ¦¬ν μλ μμ§λ§, λ¬Έμ λ μ½λμμμ μ΄λ€ νκ²½μ΄ μ μ©λλμ§ νμΈν μ μλ€λ μ μ΄μλ€. λ°°ν¬ μ€μ μ΄ μ¬λ΄ ν΄ λ΄λΆμμλ§ κ΄λ¦¬λλ€ λ³΄λ, μ½λλ§ λ΄μλ μ΄λ€ νκ²½μμ μ€νλλμ§ μκΈ° μ΄λ €μ λ€.
κ·Έλμ νκ²½ λ³μλ₯Ό μ½λμμλ λͺ
νν νμΈν μ μμΌλ©΄μλ, κ΄λ¦¬κ° λ νΈλ¦¬ν λ°©λ²μ μ°ΎκΈ°λ‘ νλ€. μ²μμλ Dockerfileμμ νκ²½μ μ€μ νλ λ°©μμ κ³ λ €νμ§λ§, μ΄μ νκ²½μ΄ μ»€μ§λ©΄μ μ΄ λ°©μμ΄ κ³Όμ° μ΅μ μΈμ§ μλ¬Έμ΄ λ€μλ€. μ¬λ¬ κ°μ§ μλλ₯Ό κ±°μΉ λμ, μ΅μ’
μ μΌλ‘ Helmμ values.yamlμ νμ©νλ λ°©μμΌλ‘ μ ννκ² λμλ€.
μ΄ κΈμμλ μ²μ μ¬μ©νλ Dockerfile κΈ°λ° νκ²½ λ³μ κ΄λ¦¬ λ°©μκ³Ό Helmμ νμ©ν λ°©μμ μ°¨μ΄μ , κ·Έλ¦¬κ³ μ΅μ’ μ μΌλ‘ Helmμ μ νν μ΄μ λ₯Ό μ 리ν΄λ³΄λ €κ³ νλ€.
κΈ°μ‘΄ λ°©μ: Dockerfileμμ ARGμ ENVλ₯Ό νμ©ν νκ²½ μ€μ
μ²μμλ Dockerfileμμ ARGμ ENVλ₯Ό νμ©ν΄μ λ°°ν¬ νκ²½μ ꡬλΆνλ λ°©μμΌλ‘ μ€μ μ μ§ννλ€. λΉλ μμ μμ νκ²½ λ³μλ₯Ό λ°μ ENVIRONMENT κ°μ μ€μ νκ³ , μ΄λ₯Ό λ°νμμμλ νμ©ν μ μλλ‘ κ΅¬μ±νλ λ°©μμ΄λ€.
κΈ°μ‘΄ λ°©μμ Dockerfile μμ
FROM openjdk:11
# λΉλ μ νκ²½ λ³μλ₯Ό μ€μ (κΈ°λ³Έκ°: dev)
ARG SPRING_PROFILES_ACTIVE=dev
ENV SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
WORKDIR /app
COPY . .
CMD ["java", "-jar", "app.jar"]
π μ΄ μ½λμ μν
μ΄ Dockerfileμ Python μ ν리μΌμ΄μ μ μ€ννλ 컨ν μ΄λ μ΄λ―Έμ§λ₯Ό λΉλνλ μ©λλ‘ μμ±λμλ€.
- ARG ENVIRONMENT=development: λΉλ μμ μ νκ²½ λ³μλ₯Ό λ°μ μ μλλ‘ μ€μ νλ©°, κΈ°λ³Έκ°μ developmentλ‘ μ€μ λμ΄ μμ
- ENV ENVIRONMENT=${ENVIRONMENT}: ARGλ‘ λ°μ κ°μ 컨ν μ΄λ λ΄λΆ νκ²½ λ³μλ‘ μ μ₯ν΄ λ°νμμμλ μ¬μ©ν μ μλλ‘ μ€μ
- WORKDIR /app: 컨ν μ΄λ λ΄λΆμμ μμ λλ ν 리λ₯Ό /appμΌλ‘ μ€μ
- COPY . .: νμ¬ λλ ν 리μ λͺ¨λ νμΌμ 컨ν μ΄λμ /app λλ ν 리μ 볡μ¬
- CMD ["python", "app.py"]: 컨ν μ΄λκ° μ€νλ λ python app.pyλ₯Ό μ€ννλλ‘ μ€μ
μ΄λ κ² νλ©΄ Docker μ΄λ―Έμ§λ₯Ό λΉλν λ --build-arg ENVIRONMENT=production κ°μ μ΅μ
μ΄λ μ¬λ΄ν΄μ νλΌλ―Έν°λ₯Ό λ£μ΄μ μ΄μ νκ²½κ³Ό κ°λ° νκ²½μ ꡬλΆν μ μλ€. κΈ°λ³Έκ°μ developmentλ‘ μ€μ ν΄ λμκΈ° λλ¬Έμ λ³λ€λ₯Έ μ€μ μμ΄λ κ°λ° νκ²½μμ λμνλλ‘ νλ€.
μ΄ λ°©μμ λ°°ν¬ νκ²½μ ꡬλΆν μ μλ μ μ©ν λ°©λ²μ΄μ§λ§, λͺ κ°μ§ λΆνΈν μ μ΄ μμλ€.
κΈ°μ‘΄ λ°©μμ μ₯μ
- λΉλ μμ μ νκ²½μ μ€μ ν μ μμ΄ μ΄μ νκ²½κ³Ό κ°λ° νκ²½μ λͺ ννκ² κ΅¬λΆν μ μλ€.
- Dockerfile λ΄μμ μ§μ νκ²½ λ³μλ₯Ό κ΄λ¦¬ν μ μμ΄ κ΅¬μ‘°μ μΌλ‘ μ΄ν΄νκΈ° μ¬μ΄ νΈμ΄λ€.
- λΉλλ μ΄λ―Έμ§ λ΄λΆμμ νκ²½μ μ μνκΈ° λλ¬Έμ λ³λμ μ€μ μμ΄ μ€νν μ μλ€.
κΈ°μ‘΄ λ°©μμ λ¨μ
- μ΄λ―Έμ§λ₯Ό νκ²½λ³λ‘ λ°λ‘ λΉλν΄μΌ νλ€. μ΄μ νκ²½κ³Ό κ°λ° νκ²½μ κ°κ° λ€λ₯Έ μ΄λ―Έμ§λ‘ λ§λ€μ΄μΌ νλ―λ‘ λ°°ν¬ νλ‘μΈμ€κ° 볡μ‘ν΄μ§λ€.
- Dockerfileμ μμ ν΄μΌ νκ²½μ λ³κ²½ν μ μλ€. ENVIRONMENT κ°μ λ°κΎΈλ €λ©΄ Dockerfileμ μμ νκ±°λ, λΉλ μλ§λ€ --build-arg μ΅μ μ λͺ μμ μΌλ‘ μ€μΌ νλ€.
- Kubernetes νκ²½κ³Ό μμ°μ€λ½κ² λ§μ§ μλλ€. μΏ λ²λ€ν°μ€μμ ConfigMapμ΄λ Secretμ μ¬μ©ν΄ νκ²½μ μ μ΄νλ κ²μ΄ μΌλ°μ μΈλ°, μ΄ λ°©μμ Docker λΉλ κ³Όμ μμ μ΄λ―Έ νκ²½μ΄ κ²°μ λκΈ° λλ¬Έμ μ΄μ νκ²½μμ μ½κ² λ³κ²½νκΈ° μ΄λ ΅λ€.
Dockerfileμ νμ©ν λ°©μλ μΆ©λΆν νμ©ν μ μμμ§λ§, Kubernetes νκ²½μμ μ΄μνκΈ°μλ μ μ½μ΄ λ§μλ€. νΉν λ°°ν¬ νκ²½λ§λ€ μ΄λ―Έμ§λ₯Ό λ€λ₯΄κ² λΉλν΄μΌ νλ μ μ΄ λΉν¨μ¨μ μΌλ‘ λκ»΄μ‘λ€. κ·Έλμ λ€λ₯Έ λ°©λ²μ κ³ λ―Όνκ² λμλ€.
Helm values.yamlμ νμ©ν νκ²½ μ€μ
κΈ°μ‘΄ λ°©μμ λ¨μ μ ν΄κ²°νκΈ° μν΄ Dockerfileμμ νκ²½μ μ§μ μ€μ νλ λμ , Helmμ values.yamlμ νμ©νμ¬ νκ²½μ ꡬλΆνλ λ°©μμΌλ‘ λ³κ²½νλ€.
Helmμ μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μ€μ μ λ°°ν¬ μμ μ λμ μΌλ‘ λ³κ²½ν μ μλ€. λ°λΌμ Docker μ΄λ―Έμ§λ νλλ§ λΉλνκ³ , νκ²½μ λ§λ μ€μ κ°μ values.yamlμ ν΅ν΄ μ μ©ν μ μλ€.
μλ‘μ΄ λ°©μμ μ€μ μμ
κ°λ° νκ²½ (values-dev.yaml)
env:
SPRING_PROFILES_ACTIVE: dev
μ΄μ νκ²½ (values-prod.yaml)
env:
SPRING_PROFILES_ACTIVE: production
Helmμ deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-backend
spec:
template:
spec:
containers:
- name: backend
image: my-backend-image
env:
- name: SPRING_PROFILES_ACTIVE
value: {{ .Values.env.SPRING_PROFILES_ACTIVE }}
μ΄μ λ°°ν¬ν λ helm install λͺ λ Ήμ΄μμ values.yamlμ μ ννλ κ²λ§μΌλ‘ νκ²½μ λ€λ₯΄κ² μ μ©ν μ μλ€.
# κ°λ° νκ²½ λ°°ν¬
helm install my-backend ./helm-chart -f values-dev.yaml
# μ΄μ νκ²½ λ°°ν¬
helm install my-backend ./helm-chart -f values-prod.yaml
μ΄ λ°©μμμλ Docker μ΄λ―Έμ§λ₯Ό νλλ§ λΉλνλ©΄ λκ³ , λ°°ν¬ μμ μμ values.yamlμ ν΅ν΄ νκ²½μ λ³κ²½ν μ μλ€. μ΄λ Kubernetes νκ²½μ ν¨μ¬ μ ν©ν ꡬ쑰λ€.
μλ‘μ΄ λ°©μμ μ₯μ
- Docker μ΄λ―Έμ§λ₯Ό ν λ²λ§ λΉλνλ©΄ λλ€. μ΄μ νκ²½κ³Ό κ°λ° νκ²½μ΄ λμΌν μ΄λ―Έμ§λ₯Ό 곡μ ν μ μλ€.
- νκ²½ λ³μλ₯Ό Helm values.yamlμμ κ΄λ¦¬ν μ μλ€. νκ²½λ³λ‘ values.yamlμ λ°λ‘ λ§λ€μ΄ κ΄λ¦¬νλ©΄ μ€μ μ΄ ν¨μ¬ κΉλν΄μ§λ€.
- Kubernetes λ€μ΄ν°λΈν λ°©μμ΄λ€. Kubernetesμμλ ConfigMapμ΄λ Secretμ νμ©ν΄ νκ²½μ κ΄λ¦¬νλ κ²μ΄ μΌλ°μ μΈλ°, μ΄ λ°©μμ΄ μ΄μ μ ν©νλ€.
- λ°°ν¬ μμ μμ νκ²½μ λμ μΌλ‘ λ³κ²½ν μ μλ€. κΈ°μ‘΄ λ°©μμμλ Dockerfileμμ λΉλ μ νκ²½μ μ ν΄μΌ νμ§λ§, μ΄μ λ λ°°ν¬ν λ μ νλ§ νλ©΄ λλ€.
μλ‘μ΄ λ°©μμ λ¨μ
- Helmμ μ¬μ©νμ§ μλλ€λ©΄ μ μ©νκΈ° μ΄λ ΅λ€. λ‘컬 κ°λ° νκ²½μμ docker run κ°μ λ°©μμΌλ‘ μ€νν κ²½μ°, νκ²½ μ€μ μ λ°λ‘ κ΄λ¦¬ν΄μΌ νλ€.
- νκ²½μ΄ Helmμ μ’ μλλ€. Kubernetesκ° μλ νκ²½μμ μ¬μ©νλ €λ©΄ μΆκ°μ μΈ μ€μ μ΄ νμν μ μλ€.
λ΄κ° μ νν κ²°λ‘ : Helm values.yamlμ΄ λ ν¨μ¨μ μ΄μλ€
μ΄λ² νλ‘μ νΈλ₯Ό μ§ννλ©΄μ Dockerfileμμ νκ²½μ κ΄λ¦¬νλ λ°©μκ³Ό Helmμ νμ©νλ λ°©μμ λΉκ΅ν μ μμλ€. μ¬λ¬ κ°μ§ μλλ₯Ό ν΄ λ³Έ κ²°κ³Ό, Helm values.yamlμ νμ©νλ λ°©μμ΄ λ μ μ°νκ³ , λ°°ν¬ νκ²½μ κΉλνκ² μ 리ν μ μμλ€λ μ μμ μ ν©νλ€κ³ νλ¨νλ€.
μ΄ λ°©μμ μ μ©ν ν Docker μ΄λ―Έμ§λ₯Ό λΉλνλ κ³Όμ μ΄ λ¨μν΄μ‘κ³ , λ°°ν¬ νκ²½μ κ΄λ¦¬νλ κ²μ΄ ν¨μ¬ μ¬μμ‘λ€. κ°μ μ΄λ―Έμ§λ₯Ό μ¬μ©νλ©΄μλ νκ²½λ³ μ€μ μ μ μ°νκ² λ°κΏ μ μμ΄ μ μ§λ³΄μ μΈ‘λ©΄μμλ μ₯μ μ΄ λ§μλ€. λν, μ¬λ΄ λ°°ν¬ ν΄μμ Dockerμ μ§μ κ°μ λ£μ΄μΌ νλ λ²κ±°λ‘μμ΄ μ¬λΌμ§κ³ , Helmμμ μ½λλ‘ λͺ μν μ μμ΄ μ€μ μμ΄ κ΄λ¦¬ν μ μκ² λμλ€.
λ¬Όλ‘ λͺ¨λ νλ‘μ νΈμ 무쑰건 Helmμ΄ μ λ΅μ μλ μλ μλ€. νμ§λ§ λ΄κ° κ²½νν νλ‘μ νΈμμλ μ΄ λ°©μμ΄ λ μ ν©νκ³ , λ ν¨μ¨μ μ΄μλ€. Kubernetesλ₯Ό νμ©νλ νκ²½μ΄λΌλ©΄, Dockerfileμμ ARGμ ENVλ₯Ό νμ©νλ κ²λ³΄λ€ Helm values.yamlμ ν΅ν΄ νκ²½μ λΆλ¦¬νλ κ²μ΄ λ λμ μ νμΌ κ°λ₯μ±μ΄ λλ€.