IaC (Infrastructure as Code, μ½λν μΈνλΌ)κ° νμν μ΄μ
- 컀맨λ κΈ°λ°μ μΈνλΌ κ΅¬μ± μ μ¬μ©μ μ€μ λ±μ μΈμ μ€λ₯ κ°λ₯μ±μ΄ λμ.
- μ€μΉ μμμ μνΈ μ°κ΄μ± λ±μ κ³ λ €νμ¬ κ°μ’ λΌμ΄λΈλ¬λ¦¬μ ν¨κ» 볡μ‘ν λͺ λ Ήμ΄λ€μ κ³ λ―Όνκ² λλλ° μ½λν μΈνλΌλ‘ ν΄κ²° κ°λ₯.
- μμ μ¬νμ μΈμ λ μ½λ λ³κ²½μ ν΅ν΄ κ°λ₯νλ€. λ°λΌμ κ°λ° μ 무 λͺ©μ μ μ΄λ£¨λ κ²μλ§ μ¨μ ν μ§μ€ν μ μλ€.
- IaCλ νλ ₯μ±, νμ₯μ±, λ°λ³΅μ±μ λΆμ¬νκ² λμ΄ λμ‘μ΄ μλ²κ° μλ λμΌν νκ²½μ 보μ ν μλ²(컨ν
μ΄λ)λ₯Ό μμ~μλ°±λλ₯Ό μ΄μ, κ΄λ¦¬νκ² ν΄μ€λ€.
- λμ‘μ΄ μλ²: μ€μ μ΄μ νκ²½μ λ€μν μλ²λ₯Ό κ°κ³ μλ€. κ°λ°μλ², ν μ€νΈμλ², μ΄μμλ² λ±μ΄ μλλ° μ΄μμ νλ€λ³΄λ©΄ μ¬λ¬κ°μ§ λ³κ²½ μ¬νμ΄ μλ€. μ΄λ λκ°μ setupμ νλ€κ³ ν΄λ ν μ€νΈμλ²μμ λλκ² μ΄μμλ²μμ μ λκΈ°λ νλ μν©μ΄ μΌμ΄λκ²λλ€. μ΄λ° νκ²½μ λμ‘μ΄ μλ²λΌκ³ νλ€.
κ·Έλ λ€λ©΄ Dockerfileμ΄λ λκΉ
Dockerfile
- Dockerfileμ Dockerμμ λμνλ 컨ν
μ΄λμ κ΅¬μ± μ 보λ₯Ό νλ‘λΉμ λ(Provisioning)ν ν
μ€νΈ template νμΌμ΄λ€.
- νλ‘λΉμ λμ μ¬μ©μμ μꡬμ λ§κ² μμ€ν μμμ ν λΉ, λ°°μΉ, λ°°ν¬ν΄ λμλ€κ° νμ μ μμ€ν μ μ¦μ μ¬μ©ν μ μλ μνλ‘ λ―Έλ¦¬ μ€λΉν΄ λλ κ²
- λ°λΌμ Dockerfileμ μ ν리μΌμ΄μ λ°°ν¬μ νμν 컨ν μ΄λ μΈνλΌλ₯Ό μ½λ ννλ‘ μ μν νμΌμ΄λ€. μ΄λ¬ν κ°λ μ IaC, μ½λν μΈνλΌ λΌκ³ νλ€.
Dockerfile λͺ λ Ήμ΄
FROM (Layer)
- μμ±νλ €λ μ΄λ―Έμ§μ λ² μ΄μ€ μ΄λ―Έμ§ μ§μ
- μ΄λ―Έμ§λ₯Ό μ νν λ μμ ν¬κΈ°μ μ΄λ―Έμ§(slim)μ 리λ μ€ λ°°ν¬νμ΄ μνμΈ(alpine) μ΄λ―Έμ§λ₯Ό κΆμ₯
- νκ·Έλ₯Ό λ£μ§ μμΌλ©΄ Latestλ‘ μ§μ
MAINTAINER
- μ΄λ―Έμ§λ₯Ό λΉλν μμ±μ μ΄λ¦κ³Ό μ΄λ©μΌ μμ±
LABEL (Layer)
- μ΄λ―Έμ§μ μμ± λͺ©μ μ΄λ μ 보 λ±μ μμ±
- μ΄λ―Έμ§ κ΄λ¦¬μ λμ
RUN (Layer)
- μ€μ λ κΈ°λ³Έ μ΄λ―Έμ§μ ν¨ν€μ§ μ λ°μ΄νΈ, μ€μΉ, μ€ν λ±μ μμ±
- RUN λͺ λ Ήμ΄μ κ°λ³ μλ₯Ό μ€μ¬μ μ¬λ¬ μ€μΉ λͺ λ Ήμ μ°κ²°νλ©΄ μ΄λ―Έμ§μ λ μ΄μ΄ μλ₯Ό κ°μμν¬ μ μλ€.
RUN apt update && apt install -y nginx \
git \
vim \
curl
CMD
- μμ±λ μ΄λ―Έμ§λ₯Ό 컨ν μ΄λλ‘ μ€νν λ μ€νλλ λͺ λ Ήμ΄
- μ¬λ¬κ°μ CMDλ₯Ό μμ±ν΄λ λ§μ§λ§ νλλ§ μ²λ¦¬λλ€.
- μ¦, μ΄λ―Έμ§κ° 컨ν μ΄λλ‘ μ€νλ λ λμ
- μ μ μΈ μ΄λ―Έμ§ νκ²½ -> λμ μΈ μ»¨ν μ΄λ νκ²½ μΌλ‘ μ΄λν λ μ¬μ©
ENTRYPOINT
- CMDμ λ§μ°¬κ°μ§λ‘ μμ±λ μ΄λ―Έμ§κ° 컨ν μ΄λλ‘ μ€νλ λ μ¬μ©νμ§λ§, λ€λ₯Έ μ μ 컨ν μ΄λκ° μ€νλ λ λͺ λ μ΄ λ° μΈμ κ°μ μ λ¬νμ¬ μ€ννλ€.
- ENTRYPOINTλ CMDμ λ€λ₯΄κ² μ¬λ¬ κ° μ€ν κ°λ₯
COPY (Layer)
- νΈμ€νΈ νκ²½μ νμΌ, λλ ν°λ¦¬λ₯Ό μ΄λ―Έμ§ μμ 볡μ¬νλ κ²½μ° μμ±
- λ¨μν λ³΅μ¬ μμ λ§ μ§μ
- λλ ν 리 μΈλΆμ νμΌμ COPYν μ μλ€.
- ADDλ³΄λ€ COPY κΆμ₯
ENV (Layer)
- μ΄λ―Έμ§ μμ κ°μ’ νκ²½ λ³μλ₯Ό μ§μ ν΄μΌ νλ κ²½μ°κ° λ§μ
- μλμ κ°μ΄ μμ±νλ©΄ λλ€.
ENV TZ=Asia/Seoul
EXPOSE
- 컨ν μ΄λκ° νΈμ€νΈ λ€νΈμν¬λ₯Ό ν΅ν΄ λ€μ΄μ€λ νΈλν½μ 리μ€λνλ ν¬νΈμ νλ‘ν μ½μ μ§μ νκΈ° μν΄ μμ±
VOLUME
- λ³Όλ₯¨μ μ΄λ―Έμ§ λΉλμ 미리 μ€μ νλ κ²½μ° μμ±
ARG
- docker build μμ μμ λ³μ κ°μ μ λ¬νκΈ° μν΄ "--build-arg=μΈμ"λ₯Ό μ μνμ¬ μ¬μ©
- λΉλ° ν€, κ³μ λΉλ°λ²νΈ κ°μ λ―Όκ°ν μ 보 μ¬μ© μ μ΄λ―Έμ§μ κ·Έλλ‘ μ‘΄μ¬νμ¬ λ ΈμΆλ μνμ΄ μμΌλ―λ‘ μ΄λ¬ν μ 보λ μ£Όμν΄μΌ νλ€.
μλλ JAVA μ ν리μΌμ΄μ Dockerfile μμμ΄λ€.
FROM openjdk:11
ARG JAR_FILE=build/libs/app.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]
Dockerfile μ΅μ ν
μ λ컀 νμΌμ μ΅μ νν΄μΌ ν κΉ??
- 컨ν μ΄λ μλΉμ€λ κ²½λμ κ°μν μλΉμ€λ₯Ό λͺ©μ μΌλ‘ νλ€.
- Dockerμμ μ 곡λλ base imageλ€ λν μ§ν₯μ μ νμν νλ‘κ·Έλ¨, λΌμ΄λΈλ¬λ¦¬, μ€ννμΌ λ§μ 보μ νκ³ μμ.
- λΉ λ₯Έ 컨ν μ΄λ λ°°ν¬λ₯Ό μν΄ "μ΅μνμ μ€μ κ³Ό ꡬμ±"μ κΆμ₯νκ³ μλ€.
μ΅μ ν λ°©μ
1. 컨ν μ΄λ μ΄λ―Έμ§μμ λΆνμν λ°μ΄λ리λ₯Ό λͺ¨λ μ κ±°νμ¬ μ΄λ―Έμ§ ν¬κΈ°λ₯Ό κ²½λν
- μ€μΉλ ν¨ν€μ§ νμΌμ autoremove, cleanλ±μ λͺ λ Ήμ ν΅ν΄ μ κ±°νλ©΄ κ²½λνμ λμλλ€.
2. Dockerμμ μ 곡νλ μ΅μ κΈ°λ³Έ μ΄λ―Έμ§μΈ alpine linux λλ scratchλ₯Ό μ¬μ©νλ€.
3. multi-strage-buildλ₯Ό μ¬μ©νμ¬ μ΅μ’ μ΄λ―Έμ§ ν¬κΈ°λ₯Ό μ΅μν
- multi-stage-buildλ μ¬λ¬ κ°μ base imageλ₯Ό μ¬μ©ν docker buildμ΄λ€.
- FROM λͺ λ Ήμ΄κ° 2κ° μ΄μ μ¬μ©λμ΄ λΆλ¦¬λ μμ 곡κ°(stage)λ₯Ό μ 곡
- 첫 λ²μ§Έ stageμμ μμ±λ μ€ννμΌ λ±μ λ λ²μ§Έ stageμ μ 곡
- λ§μ§λ§μ μ€νλ stage μμ μ΄ Docker imageλ‘ μ΅μ’ μμ±λμ΄ μ΄λ―Έμ§ ν¬κΈ°κ° κ°μνλ€.
- wgetλ±μ λͺ λ Ήμ΄κ° 보μμ μΈ νμ μ΄ μλ€κ³ μκΈ°νλλ°, stage1μμ κ·Έλ° μμ λ€μ μννκ³ stage2μμ μ¬μ©νλ€λ©΄ μ΄λ₯Ό μλ°©ν μ μλ€.
4. Dockerfile μμ± μ μμ±λλ Layerμ μ΅μ ν μλ‘ RUN μ¬μ© μ κ°λ₯νλ©΄ λͺ λ Ήμ κ²°ν©(κ·Έλ£Ήν)νμ¬ μ¬μ©
Dockerfile build λ°©λ²
docker build -t IMAGE_NAME:TAG [-f DOCKERFILE_NAME] DOCKERFILE_LOCATION
Docker build κ³Όμ
Docker run κ³Όμ