이전 포스팅에서 다뤘던
[Docker란 무엇인가?]
내용을 참고하시면, 이번 주제에 대한 배경 지식이나 기초 정보를 확인하실 수 있습니다!
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
🧑🔬 최적화 팁
- 명령어 병합: 여러
RUN
명령을 하나로 합쳐 레이어를 줄이세요. RUN apt-get update && \ apt-get install -y curl git && \ apt-get clean && rm -rf /var/lib/apt/lists/*
- 캐싱 활용: 빈번히 변경되는 파일(코드)보다 의존성 설치 명령을 먼저 작성하세요.
2.3. 📂 COPY
와 ADD
: 파일 복사
컨테이너로 파일을 복사합니다.
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. 🛠️ CMD
와 ENTRYPOINT
: 컨테이너 실행 명령 설정
컨테이너가 실행될 때 명령어를 정의합니다.
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 작성 시 주의사항 및 체크리스트
- 최소한의 베이스 이미지 사용:
slim
또는alpine
추천. - 불필요한 파일 제외:
.dockerignore
파일로 빌드에 포함되지 않을 파일 정의. - 캐싱 최적화: 변경 빈도가 높은 명령은 아래쪽에 배치.
- 명령어 병합:
RUN
명령을 한 줄로 합쳐 레이어 수 줄이기. - 환경 변수 활용: 설정값을 코드에서 분리.
- Multi-stage Build 사용: 빌드와 런타임 환경 분리.
5. ✨ 최종 요약
Dockerfile 작성 프로세스
FROM
: 베이스 이미지 선택.WORKDIR
: 작업 디렉토리 설정.COPY
/ADD
: 파일 복사.RUN
: 의존성 설치 및 환경 구성.ENV
: 환경 변수 설정.EXPOSE
: 외부 통신 포트 정의.CMD
/ENTRYPOINT
: 컨테이너 실행 명령 설정.
실전 팁
- Multi-stage Build로 이미지 크기 최소화.
- 불필요한 레이어 줄이기.
.dockerignore
로 빌드 최적화.
'Docker' 카테고리의 다른 글
[Docker] SSH 연결 문제와 Docker 설정: 원인부터 해결까지 (0) | 2024.11.20 |
---|---|
[Docker] 리눅스에서 Docker 설치 및 실행 방법 (0) | 2024.11.19 |
[Docker] Docker란 무엇인가? (5) | 2024.11.10 |
[Docker] 네트워크 변경(네트워크 중복으로 인한 접속 불가능), HTTP 허용, Root 경로 수정 daemon.json 설정 (0) | 2023.12.04 |
[Docker] MariaDB 실행 방법 (0) | 2023.05.02 |