Dockerfile은 Docker 이미지를 빌드하기 위한 설명서 역할을 하는 텍스트 파일입니다. 이 파일에는 Docker가 이미지를 생성할 때 수행해야 하는 명령과 설정이 단계적으로 작성되어 있습니다. Dockerfile을 기반으로 Docker 이미지를 생성하면 컨테이너 실행에 필요한 환경이 포함된 상태로 배포할 수 있습니다.


Dockerfile의 주요 개념

1. Docker 이미지

  • Dockerfile은 Docker 이미지를 생성하기 위한 템플릿입니다.
  • Docker 이미지는 컨테이너 실행에 필요한 파일, 의존성, 애플리케이션 코드 등을 포함합니다.

2. 빌드 과정

  • Dockerfile에 정의된 명령어를 기반으로 docker build 명령어를 실행하면, 해당 명령어 순서대로 단계를 수행하여 최종 이미지를 생성합니다.

Dockerfile의 기본 구조

Dockerfile은 여러 명령어로 구성됩니다. 각 명령어는 이미지 빌드의 특정 단계를 정의합니다.

1. FROM

  • 기반 이미지를 지정합니다.
  • 예: Python, Node.js, Ubuntu 등 기존 Docker 이미지를 기반으로 빌드.
    FROM ubuntu:latest

2. RUN

  • 이미지 빌드 시 실행할 명령어를 정의합니다.
  • 예: 필요한 패키지 설치.
    RUN apt-get update && apt-get install -y curl

3. COPY 또는 ADD

  • 호스트 시스템에서 Docker 컨테이너로 파일을 복사합니다.
    COPY app.py /app/app.py

4. WORKDIR

  • 컨테이너 내에서 작업 디렉토리를 설정합니다.
    WORKDIR /app

5. CMD

  • 컨테이너가 실행될 때 기본으로 실행할 명령어를 지정합니다.
  • CMD는 단일 명령만 정의할 수 있습니다.
    CMD ["python3", "app.py"]

6. EXPOSE

  • 컨테이너가 사용할 네트워크 포트를 지정합니다.
    EXPOSE 8080

7. ENTRYPOINT

  • CMD와 유사하지만 고정적으로 실행할 명령을 지정합니다.
    ENTRYPOINT ["python3"]
    CMD ["app.py"]

Dockerfile 예제

Python 웹 애플리케이션 Dockerfile

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

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

# Step 3: 필요한 파일 복사
COPY requirements.txt .

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

# Step 5: 애플리케이션 파일 복사
COPY . .

# Step 6: 네트워크 포트 노출
EXPOSE 8080

# Step 7: 애플리케이션 실행
CMD ["python", "app.py"]

빌드 및 실행

  1. Dockerfile이 있는 디렉토리에서 이미지를 빌드:

    docker build -t my-python-app .
  2. 컨테이너 실행:

    docker run -p 8080:8080 my-python-app

Dockerfile의 장점

  1. 자동화:
    • 이미지를 생성하는 과정을 자동화하여, 동일한 환경을 반복적으로 생성 가능.
  2. 버전 관리:
    • Dockerfile을 코드와 함께 저장소에 저장하여, 애플리케이션과 환경 설정을 함께 버전 관리 가능.
  3. 이식성:
    • Docker 이미지는 특정 환경에 종속되지 않으므로, 어디서나 동일한 설정으로 실행 가능.

Dockerfile의 단점

  1. 복잡한 설정:
    • 많은 의존성과 커스터마이징이 필요한 경우, Dockerfile이 복잡해질 수 있음.
  2. 이미지 크기:
    • 불필요한 파일이 포함되거나, 최적화되지 않으면 이미지 크기가 커질 수 있음.

결론

Dockerfile은 Docker 이미지를 정의하고 생성하는 데 핵심적인 도구입니다. 개발자는 Dockerfile을 통해 필요한 애플리케이션 환경을 정확히 정의하고, 빌드 및 배포 과정을 단순화할 수 있습니다. 😊

'Docker' 카테고리의 다른 글

[/tmp] 리눅스의 템프 디렉토리(Temporary Directory)  (0) 2024.12.03
리눅스 시그널  (0) 2024.12.03
Alpine  (0) 2024.12.03
Docker Redis  (0) 2024.12.03
[Mac] AWS EC2 Docker 설치 및 Docker 권한 추가  (0) 2024.12.03

+ Recent posts