Dockerfile
Dockerfile
Dockerfile은 Docker 이미지를 자동으로 빌드하기 위한 텍스트 기반의 스크립트 파일로, 컨테이너화된 애플리케이션 배포의 핵심 구성 요소입니다. 이 문서는 Dockerfile의 구조, 주요 지시어, 모범 사례 및 활용 예시를 통해 효율적인 이미지 구성 방법을 설명합니다.
개요
Dockerfile은 일련의 명령어를 통해 애플리케이션 실행에 필요한 환경을 정의하는 텍스트 파일입니다. 사용자는 Dockerfile을 기반으로 docker build 명령어를 통해 컨테이너 이미지를 생성할 수 있으며, 이 과정에서 빌드 캐싱, 레이어 최적화 등의 기능을 활용할 수 있습니다. CI/CD 파이프라인과 DevOps 워크플로우에서 Dockerfile은 일관된 환경 구성을 보장하는 핵심 도구로 사용됩니다.
Dockerfile 구성 요소
기본 구조
Dockerfile은 일반적으로 다음과 같은 순서로 작성됩니다:
1. 베이스 이미지 지정 (FROM)
2. 依存성 설치 및 환경 설정 (RUN, COPY)
3. 실행 환경 구성 (WORKDIR, ENV)
4. 컨테이너 시작 시 실행 명령어 정의 (CMD, ENTRYPOINT)
주요 지시어
| 지시어 | 설명 | 예시 |
|---|---|---|
FROM |
베이스 이미지 지정 | FROM python:3.9-slim |
RUN |
빌드 시 실행할 명령어 | RUN apt-get update && apt-get install -y gcc |
COPY |
호스트 파일을 이미지에 복사 | COPY . /app |
CMD |
컨테이너 실행 시 기본 명령어 | CMD ["python", "app.py"] |
EXPOSE |
포트 개방 | EXPOSE 8000 |
ENV |
환경 변수 설정 | ENV PATH="/app:${PATH}" |
문법 규칙
- 대소문자 구분: 대부분의 지시어는 대문자를 사용하지만, 일부는 예외입니다.
- 주석:
#기호로 주석을 작성할 수 있습니다. - 체인 명령어:
&&를 사용해 여러 명령어를 한 줄에 결합하여 레이어 수를 줄일 수 있습니다.
주요 지시어 상세 설명
FROM
베이스 이미지를 지정하는 첫 번째 지시어입니다. 공식 이미지(예: alpine, ubuntu)나 사용자 정의 이미지를 사용할 수 있습니다.
FROM node:18-alpine
RUN
빌드 단계에서 실행할 명령어를 정의합니다. 패키지 설치, 파일 생성 등에 사용됩니다.
RUN apt-get update && apt-get install -y curl
CMD vs ENTRYPOINT
- CMD: 컨테이너 실행 시 기본 명령어를 지정하지만,
docker run명령어로 오버라이드됩니다. - ENTRYPOINT: 컨테이너 실행 시 항상 실행되는 메인 명령어를 고정합니다.
# CMD 예시 CMD ["echo", "Hello World"] # ENTRYPOINT 예시 ENTRYPOINT ["java", "-jar", "app.jar"]
COPY vs ADD
- COPY: 호스트의 파일/디렉토리를 이미지에 복사합니다.
- ADD: COPY 기능에 추가로 URL 다운로드 및 압축 해제 기능이 포함됩니다.
COPY requirements.txt /app/ ADD https://example.com/file.tar.gz /app/
WORKDIR
작업 디렉토리를 설정하여 이후 지시어의 기본 경로를 지정합니다.
WORKDIR /app
ENV
환경 변수를 설정하여 빌드 및 실행 시 사용할 수 있도록 합니다.
ENV PORT=8000
EXPOSE
컨테이너 내부에서 사용할 포트를 명시합니다. 실제 포트 매핑은 docker run -p로 수행됩니다.
EXPOSE 8000
모범 사례
.dockerignore 사용
불필요한 파일을 빌드 컨텍스트에서 제외하여 성능을 개선합니다:
*.log
.git
node_modules/
레이어 최소화
하나의 RUN 지시어로 여러 명령어를 결합해 레이어 수를 줄입니다:
RUN apt-get update && apt-get install -y \
package1 \
package2 \
&& rm -rf /var/lib/apt/lists/*
멀티스테이지 빌드
빌드 단계와 실행 단계를 분리하여 최종 이미지 크기를 줄입니다:
# 빌드 단계
FROM golang:1.19 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 실행 단계
FROM alpine:latest
COPY --from=builder /app/myapp .
CMD ["./myapp"]
보안 고려사항
root권한 대신 비특권 사용자를 생성합니다.- 최소한의 패키지만 설치하여 공격 표면을 줄입니다.
예제
Python 애플리케이션
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Node.js 애플리케이션
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
관련 문서
- Docker 공식 문서
- Best practices for writing Dockerfiles
- Docker Hub - 공식 이미지 저장소
Dockerfile은 컨테이너 기술의 효율성과 일관성을 보장하는 핵심 도구로, 지시어의 정확한 이해와 최적화된 작성법을 익히는 것이 중요합니다. 위 지침을 참고하여 반복 가능한 빌드 환경을 구축하세요.
이 문서는 AI 모델(qwen-3-235b-a22b)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.