Dockerfile은 Docker 이미지를 빌드하기 위한 설정 파일입니다. 이 파일은 애플리케이션을 어떻게 컨테이너로 패키징할지 정의하는 스크립트입니다. Dockerfile을 통해 필요한 베이스 이미지부터 애플리케이션의 의존성 설치, 환경 변수 설정, 실행 명령어까지 정의할 수 있습니다. 아래는 Dockerfile을 작성하는 방법을 단계별로 설명합니다.
1. Dockerfile 기본 구조
Dockerfile의 기본적인 구성 요소는 다음과 같습니다:
- 베이스 이미지 설정: FROM 키워드를 사용하여 어떤 베이스 이미지를 사용할지 정의합니다.
- 의존성 설치: RUN 명령어로 애플리케이션이 실행되는 데 필요한 패키지나 의존성을 설치합니다.
- 작업 디렉토리 설정: WORKDIR 명령어로 애플리케이션을 실행할 디렉토리를 설정합니다.
- 파일 복사: COPY나 ADD 명령어로 호스트 시스템의 파일을 컨테이너로 복사합니다.
- 명령어 실행: CMD나 ENTRYPOINT 명령어로 컨테이너가 실행될 때 기본으로 실행할 명령을 설정합니다.
2. Dockerfile 작성 예제
1. 간단한 Node.js 애플리케이션의 Dockerfile 예제
# 1. 베이스 이미지 설정 (Node.js LTS 버전 사용)
FROM node:16
# 2. 애플리케이션의 작업 디렉토리 설정
WORKDIR /usr/src/app
# 3. 패키지 파일을 컨테이너로 복사
COPY package*.json ./
# 4. 의존성 설치
RUN npm install
# 5. 소스 코드를 컨테이너로 복사
COPY . .
# 6. 애플리케이션 실행 포트 설정
EXPOSE 8080
# 7. 컨테이너가 실행될 때 실행할 명령어
CMD ["npm", "start"]
이 Dockerfile은 다음 단계를 수행합니다:
- 베이스 이미지 설정: Node.js 16 버전을 사용하는 이미지에서 시작.
- 작업 디렉토리 설정: /usr/src/app 디렉토리를 컨테이너의 기본 작업 디렉토리로 지정.
- 의존성 설치: package.json을 복사하고 npm install 명령어로 의존성을 설치.
- 애플리케이션 복사: 현재 디렉토리의 파일을 컨테이너로 복사.
- 포트 설정: 8080 포트를 컨테이너에서 노출.
- 명령어 설정: 컨테이너가 실행되면 npm start로 애플리케이션을 시작.
2. Python Flask 애플리케이션 Dockerfile 예제
# 1. 베이스 이미지 설정
FROM python:3.9-slim
# 2. 환경 변수 설정
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 3. 작업 디렉토리 설정
WORKDIR /app
# 4. 의존성 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 5. 애플리케이션 소스 복사
COPY . .
# 6. 애플리케이션 실행 명령어
CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
이 Dockerfile은:
- Python 3.9을 베이스 이미지로 사용하고 있습니다.
- ENV 명령어로 환경 변수를 설정하여 Python 실행 시 캐시 파일을 기록하지 않게 설정.
- requirements.txt 파일을 복사한 후 pip로 의존성을 설치.
- 애플리케이션을 복사한 후 Flask 애플리케이션을 실행.
3. 주요 Dockerfile 명령어 설명
1. FROM
Dockerfile의 첫 번째 명령으로, 사용할 베이스 이미지를 지정합니다. 이 이미지는 모든 Dockerfile이 필수로 포함해야 합니다.
2. WORKDIR
작업 디렉토리를 설정합니다. 이후에 실행되는 모든 명령은 이 디렉토리에서 실행됩니다.
3. COPY
호스트 시스템의 파일을 컨테이너의 특정 경로로 복사합니다.
4. RUN
컨테이너가 빌드될 때 실행할 명령어를 지정합니다. 주로 패키지 설치, 파일 권한 설정 등 이미지 빌드 시 필요한 작업을 처리합니다.
5. CMD
컨테이너가 실행될 때 기본적으로 실행할 명령어를 설정합니다. 컨테이너가 시작할 때마다 이 명령어가 실행됩니다.
6. EXPOSE
컨테이너가 사용할 포트를 지정합니다. 실제 포트 매핑은 docker run 명령어에서 설정합니다.
7. ENTRYPOINT
CMD와 비슷하지만, 컨테이너 실행 시 항상 실행되며 주로 스크립트를 실행할 때 사용합니다. CMD는 추가 명령을 받을 수 있지만, ENTRYPOINT는 고정된 명령을 실행합니다.
4. Dockerfile을 사용하여 이미지 빌드하기
Dockerfile을 작성한 후, Docker 이미지를 빌드하려면 다음 명령어를 실행합니다:
docker build -t my_image_name .
- -t 옵션은 이미지의 태그를 지정하는 데 사용됩니다.
- .는 Dockerfile이 위치한 디렉토리를 의미합니다.
이미지 빌드가 완료되면 docker images 명령어로 빌드된 이미지를 확인할 수 있습니다.
docker images
5. 최적화된 Dockerfile 작성 팁
- 캐시 활용: RUN, COPY 명령어는 Docker 빌드 중 캐시가 사용됩니다. 의존성을 먼저 설치한 후, 애플리케이션 파일을 복사하면 소스 코드 변경 시에도 의존성 설치 단계는 캐시를 사용하게 되어 빌드 시간을 줄일 수 있습니다.
- 멀티스테이지 빌드: 애플리케이션 빌드와 런타임 환경을 분리하여 이미지 크기를 줄일 수 있습니다.
- 이미지 최소화: 불필요한 패키지를 설치하지 않거나, slim 버전과 같은 경량 이미지를 사용하여 이미지 크기를 최소화합니다.
Dockerfile을 통해 애플리케이션을 컨테이너화하고, 어디서나 동일한 환경에서 실행할 수 있는 이미지로 패키징할 수 있습니다. 이를 통해 배포 자동화와 일관된 개발 환경을 유지할 수 있습니다.
'Computer Science > linux' 카테고리의 다른 글
Argo workflow 설치와 예제 (0) | 2024.09.22 |
---|---|
Docker Compose 사용하기 (0) | 2024.09.20 |
Docker 사용하기 (0) | 2024.09.15 |
Slurm 설치 (0) | 2024.06.05 |
사용자 계정 관리 및 조직의 구조화 툴 (LDAP) (0) | 2024.05.17 |