Docker_Cloudwave 캠프: Dockerfile 구조와 이미지 빌드 원리

1. Dockerfile 구성 요소 (적용 시점 주의)

Dockerfile 명령어들은 빌드 시점컨테이너 실행 시점에 따라 역할이 다르다.

빌드 시점 전용

  • ARG
    • key=value 형태
    • 빌드할 때만 사용
    • 컨테이너(애플리케이션) 실행 시에는 사용 불가

이미지/컨테이너 공통

  • FROM
    • 베이스 이미지 지정
    • Repository:Tag 형식
  • LABEL
    • 이미지 메타데이터
    • 이미지 관리용
    • Kubernetes 환경에서 매우 중요
  • ENV
    • key=value
    • 컨테이너 실행 시에도 사용 가능

2. 파일 및 디렉토리 처리

  • ADD
    • 파일 또는 디렉토리 복사
    • 원격 URL 다운로드 가능
    • <remote 주소 | src 경로> <dest 경로>
    • 실무에서 더 자주 사용
  • COPY
    • 로컬 파일/디렉토리 복사
    • 다른 이미지에서 가져오는 용도
    • ADD보다 기능 제한적이라 상대적으로 덜 사용됨

3. 실행 환경 관련 설정

  • USER
    • 컨테이너에서 사용할 사용자 권한 설정
  • WORKDIR
    • 작업 디렉토리 설정
    • 이후 명령어(RUN, CMD 등)의 기준 경로
  • RUN
    • 이미지 빌드 과정에서 실행할 명령어
    • 패키지 설치, 설정 작업 등에 사용

4. 컨테이너 실행 관련 명령어

  • CMD
    • 컨테이너 실행 시 기본 명령어
    • override 가능
  • ENTRYPOINT
    • 컨테이너 진입점
    • 변경 불가 (CMD보다 강제성 높음)
  • EXPOSE
    • 컨테이너가 사용하는 포트 명시
    • 실제 포트를 여는 기능은 없음
    • 협업 및 문서화를 위한 주석 역할

5. 안전한 서비스 운영을 위해 필요한 요소

미래를 고려한 Dockerfile 작성 시 중요 포인트

  1. 협업
    • 주석 처리
    • LABEL, EXPOSE 적극 활용
  2. 비용
    • 불필요한 레이어 제거
    • 이미지 경량화
  3. 유지보수
    • 명확한 구조
    • ARG, ENV 활용
  4. 보안
    • 불필요한 root 권한 지양
    • 최소 권한 원칙 적용

6. Dockerfile 예시 분석

ARG TAG=22.04
FROM ubuntu:$TAG
LABEL PROJECT=cloudwave
ENV STAGE=prod
ADD https://docs.docker.com/engine/reference/builder/sample.html
COPY ./jar /src/jar
USER root
WORKDIR /root
RUN apt-get update && apt-get upgrade
CMD ["/bin/bash"]
ENTRYPOINT [""]

 

흐름 해석

  • ARG로 Ubuntu 버전 유연하게 관리
  • LABEL로 프로젝트 정보 명시
  • ENV로 실행 환경 구분 (prod)
  • ADD로 원격 리소스 포함
  • WORKDIR 기준 작업 디렉토리 설정
  • RUN으로 이미지 빌드 단계 작업 수행
  • CMD로 기본 실행 쉘 지정
  • 시험: FROM 위에 선언된 ARG는 바로 아래 FROM 한테만 적용. 그 밑에 줄에서 ARG 값을 받으면 값 없음으로 뜸

7. 멀티스테이지 빌드 개념

빌드 환경과 실행 환경이 다를 때 사용하는 방식

1단계: 빌드 스테이지

  • 컴파일용 이미지 사용
  • 소스 코드 복사
  • 빌드 수행 → 실행 파일 생성

2단계: 런타임 스테이지

  • 실행 전용 이미지 사용 (예: scratch, alpine)
  • 빌드 스테이지에서 생성된 결과물만 복사
  • 불필요한 빌드 도구 제거

8. Docker 캐시 개념

  • Docker는 명령어 단위로 결과를 캐싱
  • 같은 명령어 = 같은 결과라고 가정
  • 캐시를 잘 활용하면 빌드 속도 향상
  • 하지만:
    • 같은 명령어라도 상황에 따라 결과가 달라야 한다면
    • 캐시로 인해 예상치 못한 오류 발생 가능
  • 따라서 명령어 순서와 캐시 전략이 중요

9. 좋은 Dockerfile의 조건

  1. 빌드 속도가 빠르다
    • 캐시 히트율 증가
  2. 이해하기 쉽다
    • 명확한 명령어 순서
  3. 작업이 간결하다
    • 적절한 베이스 이미지 사용
  4. 이미지 크기가 작다
    • 빌드용/런타임용 이미지 분리
  5. 보안 취약점이 적다
    • 최소 패키지
    • 최소 권한