Docker

[Docker] Dockerfile 작성법

TaeHuiLee 2024. 11. 18. 21:30
반응형

이전 포스팅에서 다뤘던 [Docker란 무엇인가?] 내용을 참고하시면, 이번 주제에 대한 배경 지식이나 기초 정보를 확인하실 수 있습니다!

 

[Docker] Docker란 무엇인가?

🐳 1. Docker란 무엇인가요?Docker는 애플리케이션을 컨테이너라는 독립된 환경에 격리시켜 실행할 수 있게 도와주는 오픈 소스 플랫폼입니다. 애플리케이션과 그에 필요한 모든 라이브러리, 종속

tae-hui.tistory.com

 


1. 🛠️ Dockerfile이란?

Dockerfile은 컨테이너 이미지를 정의하는 스크립트 파일로, 이미지 빌드에 필요한 설정과 명령을 담고 있습니다.

🧩 주요 특징

  • Dockerfile은 단계별로 이미지를 정의합니다.
  • 빌드 시 각 단계가 레이어(layer)로 저장됩니다.
  • Docker는 레이어를 캐싱해 빌드 속도를 최적화합니다.

2. 🧩 Dockerfile 명령어: 기본부터 심화까지

Dockerfile은 다양한 명령어로 구성됩니다. 명령어와 역할을 하나씩 살펴보겠습니다.


2.1. 🖼️ FROM: 베이스 이미지 설정

Docker 이미지는 항상 베이스 이미지에서 시작합니다. 공식 이미지를 사용하는 것이 일반적입니다.

# Python 3.9 슬림 버전 사용
FROM python:3.9-slim

슬림(slim) 이미지는 경량화된 베이스 이미지로, 불필요한 라이브러리가 포함되지 않아 최적화에 유리합니다.


2.2. 🔨 RUN: 명령 실행

이미지 빌드 과정에서 실행할 명령어를 정의합니다. 주로 패키지 설치, 환경 구성에 사용됩니다.

# 패키지 업데이트 및 설치
RUN apt-get update && apt-get install -y curl git

🧑‍🔬 최적화 팁

  1. 명령어 병합: 여러 RUN 명령을 하나로 합쳐 레이어를 줄이세요.
  2. RUN apt-get update && \ apt-get install -y curl git && \ apt-get clean && rm -rf /var/lib/apt/lists/*
  3. 캐싱 활용: 빈번히 변경되는 파일(코드)보다 의존성 설치 명령을 먼저 작성하세요.

2.3. 📂 COPYADD: 파일 복사

컨테이너로 파일을 복사합니다.

  • COPY: 단순 파일 복사.
  • ADD: URL 다운로드, 압축 해제 기능 지원.
# 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사
COPY . /app

COPY 추천: 대부분의 경우 COPY가 더 효율적입니다. ADD는 URL이나 압축 파일 처리 시에만 사용하세요.


2.4. 🗂️ WORKDIR: 작업 디렉토리 설정

명령어 실행의 기본 경로를 설정합니다. 이후 명령(RUN, CMD, COPY)은 이 디렉토리를 기준으로 실행됩니다.

WORKDIR /app

2.5. 🌱 ENV: 환경 변수 설정

컨테이너 내부에서 사용할 환경 변수를 설정합니다.

ENV APP_ENV=production
ENV DEBUG=false

환경 변수는 모든 명령어와 애플리케이션에서 참조 가능합니다.


2.6. 🌐 EXPOSE: 포트 공개

컨테이너가 외부와 통신할 포트 번호를 지정합니다.

EXPOSE 8080

주의: EXPOSE는 포트를 명시적으로 지정하는 역할만 합니다. 컨테이너 실행 시 실제로 열려면 docker run -p 옵션이 필요합니다.


2.7. 🛠️ CMDENTRYPOINT: 컨테이너 실행 명령 설정

컨테이너가 실행될 때 명령어를 정의합니다.

  • CMD: 컨테이너 시작 시 기본 실행 명령.
  • ENTRYPOINT: 고정 실행 명령.

CMD 예제

CMD ["python", "app.py"]

ENTRYPOINT 예제

ENTRYPOINT ["python"]
CMD ["app.py"]

동시 사용: ENTRYPOINT는 고정된 실행 파일, CMD는 옵션으로 함께 사용할 수 있습니다.


2.8. 🧹 Multi-stage Build: 이미지 최적화

Multi-stage Build는 빌드와 런타임 환경을 분리해 이미지 크기를 최소화합니다.

# 1단계: 빌드
FROM node:16 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build

# 2단계: 런타임
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

이점: 빌드에 필요한 도구와 의존성을 최종 이미지에 포함하지 않아 더 작은 이미지를 생성합니다.


3. 🚀 종합 Dockerfile 예제

Python Flask 프로젝트 예제

# 베이스 이미지 설정
FROM python:3.9-slim

# 환경 변수 설정
ENV PYTHONUNBUFFERED=1 APP_ENV=production

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 코드 복사
COPY . .

# 포트 공개
EXPOSE 5000

# 실행 명령 설정
CMD ["python", "app.py"]

Node.js 프로젝트 예제

# 1단계: 빌드
FROM node:16 AS builder
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build

# 2단계: 런타임
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

4. 🔑 Dockerfile 작성 시 주의사항 및 체크리스트

  1. 최소한의 베이스 이미지 사용: slim 또는 alpine 추천.
  2. 불필요한 파일 제외: .dockerignore 파일로 빌드에 포함되지 않을 파일 정의.
  3. 캐싱 최적화: 변경 빈도가 높은 명령은 아래쪽에 배치.
  4. 명령어 병합: RUN 명령을 한 줄로 합쳐 레이어 수 줄이기.
  5. 환경 변수 활용: 설정값을 코드에서 분리.
  6. Multi-stage Build 사용: 빌드와 런타임 환경 분리.

5. ✨ 최종 요약

Dockerfile 작성 프로세스

  1. FROM: 베이스 이미지 선택.
  2. WORKDIR: 작업 디렉토리 설정.
  3. COPY / ADD: 파일 복사.
  4. RUN: 의존성 설치 및 환경 구성.
  5. ENV: 환경 변수 설정.
  6. EXPOSE: 외부 통신 포트 정의.
  7. CMD / ENTRYPOINT: 컨테이너 실행 명령 설정.

실전 팁

  • Multi-stage Build로 이미지 크기 최소화.
  • 불필요한 레이어 줄이기.
  • .dockerignore로 빌드 최적화.
반응형