Cloud Architect/Docker

Chapter 7. Dockerfile

"Everything about infra" 2025. 11. 28. 01:20

 

안녕하세요 ~

오늘은 Dockerfile을 직접 작성하고

file에 들어가는 layer들에 대해서 알아보는 시간을 갖도록 하겠습니다.

이 Dockerfile을 가지고 Application을 컨테이너 인프라에 배포를 하겠죠!

 

docker build architecture

 

01. Dockerfile Layer

Dockerfile 이란?

  • Docker image 개발에 필요한 명령들을 layer 형태로 나열하여 작성한 텍스트 파일

이 Dockerfile을 작성하여 image를 생성하고 'docker build' 명령을 통해 registry에 push 합니다.

 

Application 구성을 Dockerfile에서 정의 → docker image 생성(Application 패키징) → Registry에 push (Docker hub 등) → Application 배포 (컨테이너 환경) 순서로 인프라를 구성하게 됩니다.

 

직접 컨테이너 환경까지 배포하기 이전에 Dockerfile에 대한 Layer들을 알아보겠습니다.


 

📌 Docker layer 명령어

 

1) FROM

  • 생성하려는 base image를 지정하는 명령이며 라이센스 때문에 Docker hub에 제공되는 공식 이미지를 권장.
  • 컨테이너는 경량화가 가장 중요하므로 slim, alpine 등 배포판 이미지도 권장된다
    • 하지만, 무거운 환경은 Application이 동작하지 않으므로 환경에 따라 다르다.
FROM ubuntu:14.04
FROM openjdk:17-jdk-alpine

 

2) MAINTAINER

  • Dockerfile을 작성한 작성자의 이름과 이메일 등 정보가 들어간다.
  • 필수로 작성되지 않아도 되지만, 회사 규정이나 가독성을 위해서 권장한다.
MAINTAINER ssunghwan <ssunghwan.heo@gmail.com>

 

3) LABEL

  • 이미지에 대한 description 이라고 불린다.
  • 이미지의 작성 목적으로 버전 관리, 설명, 라이선스 등을 작성하며 하나 이상으로도 작성이 가능하다.
LABEL purpose = 'web server'
LABEL version = 'v1.0'
LABEL description = 'Proxy server for traffic distribution'

 

4) RUN

  • base image에 package update, package install, 컨테이너 내부에서 실행할 명령 등을 작성한다.
RUN apt-get update && apt-get install -y --no-install-recommends wget tar vim \
         && mkdir -p /opt/tomcat \
         && wget -O tomcat.tar.gz https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.50/bin/apache-tomcat-9.0.50.tar.gz \
        && tar xvfz tomcat.tar.gz -C /opt/tomcat --strip-components=1 \
        && rm tomcat.tar.gz \
        && apt-get remove -y --purge wget \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*

 

5) CMD

  • 이미지는 정적 파일이고, 컨테이너는 동적 프로세스인데 이 CMD를 작성하여 이미지가 컨테이너 실행 시 애플리케이션 데몬이 실행하도록 하는 경우에 사용한다. (보통 첫줄에 FROM, 마지막줄에 CMD가 쓰인다)
shell 방식 : CMD apachectl -D FOREGROUND
exec 방식 : CMD ["/usr/sbin/apachectl", "-D", "FOREGROUND"]

 

6) COPY

  • 호스트에 있는 특정 디렉토리 및 파일을 이미지 안에 복사(집어넣는)하는 경우 작성하여 사용한다.
COPY VintageBlue.war /opt/tomcat/webapps/
COPY index.html /usr/share/nginx/html 

 

7) ENV

  • 이미지 안에 환경 변수를 지정할 때 사용한다.
  • 애플리케이션 사용을 하기 위해선 구성에 따라 환경변수들을 사용합니다 (예: 반복된 표현인 경우 변수 설정)
ENV PATH /usr/local/nginx/bin:$PATH
ENV TOMCAT_VERSION 9.0.50

 

8) EXPOSE

  • 컨테이너가 Host Network를 통해 들어오는 Traffic을 리스닝 하는 포트, 프로토콜을 지정하기 위함.
  • 이미지 내에 어플리케이션이 사용하는 포트를 사전에 확인하고 호스트와 연결되도록 구성하기 위함.
EXPOSE 443
EXPOSE 8080/udp

 

추가적으로 더 많은 옵션이 있습니다. 예를들어, 우리가 배웠던 VOLUME 이라는 명령어를 Dockerfile에서

작성하여 사전에 Mount를 시킬 수도 있습니다. (환경에 따라 커스터마이징해서 사용하시면 됩니다)


02. Dockerfile 최적화

 Dockerfile 작성 최적의 조건

 

1) 이미지 크기를 경량화 함으로써 빌드시간을 단축시키면 좋다 (layer를 만드는 과정 최적화)

2) 재사용성, 유지보수성을 생각하여 작성한다.

3) 보안적인 설정이 들어가면 좋다 (계정에 대한 권한 설정 등.)

 

docker 문서에 best practice에 대한 요구사항에 대해 자세하게 잘 나와있으니 참고하도록 하자.

 

📌 이미지 크기 경량화

  • dockerfile 작성 시 패키지를 설치 후 불필요한 패키지 파일은 제거한다 (autoremove, clean 등 명령 사용)
  • 패키지 설치 시 자동으로 필요한 라이브러리가 자동 설치되는데, 환경에 맞는 라이브러리가 아닌 버전일 경우
    • (--no-install-recommends [패키지명])을 많이 사용한다.
  • base image에서 alpine linux 및 slim, scratch를 사용하여 경량화 한다.
  • 가능 한 Layer수를 최소화 한다. (하기 참고)
1) 잘못된 예시

RUN apt update
RUN apt install -y apache2
RUN apt clean

2) 좋은 예시
RUN apt update && apt install -y apache2 && apt clean

 

📌 multi-stage build

  • 여러 개의 base image를 사용하여 build 한다 (FROM절 2개 이상 사용되는 환경)
  • 첫번째 FROM절에 들어가는 base image는 두번째 FROM절에 들어가는 base image를 위한 가상환경.

위와 같이 stage 0에서 as 명령을 통해 dev 환경에 대한 이미지 구성을 다른 환경에 보낼 수 있고,

stage 1에서 --from으로 dev 환경을 가져와서 stage 1 안의 디렉토리에 집어넣을 수 있다.

 

📌 보안 강화

  • dockerfile에 사용자 계정을 지정하지 않으면 root 사용자를 사용한다.
    • 권한에 대한 보안 문제가 발생하므로, 애플리케이션에서 사용할 사용자 및 권한 설정을 권장한다.
  • 이미지 서명을 통해서 위,변조가 이루어지지 않는 이미지 라는것을 신뢰할 수 있도록 작성한다.
    • Docker Signer (docker trust sign), DCT (Docker Contents Trust)를 사용한다.