SteadyDrills

도커 파일 구성 본문

웹개발

도커 파일 구성

Drills 2024. 12. 16. 23:19

241216

 

도커 파일 (Dockerfile)

Dockerfile은 Docker 이미지 빌드 과정의 설명서(Script) 역할을 하며, Docker는 Dockerfile에 정의된 명령어를 단계적으로 읽고 실행하여 최종적으로 이미지를 생성한다. 또한 이 이미지를 통해 애플리케이션이 동작하는 컨테이너를 실행함으로써 도커는 격리된 가상환경을 제공한다.

 

주요 명령어

FROM 필수 베이스 이미지를 지정. 모든 Dockerfile은 반드시 FROM 명령어로 시작.
CMD 필수 컨테이너 실행 시 기본으로 실행할 명령을 지정.
ENTRYPOINT 필수
(CMD 대체)
CMD 대신 ENTRYPOINT를 사용해 컨테이너의 기본 동작을 설정할 수 있음.
WORKDIR 생략 가능 작업 디렉터리를 설정. 생략 시 기본 디렉터리는 /.
COPY 생략 가능 로컬 파일을 컨테이너로 복사. 생략 시 컨테이너에 필요한 파일이 없을 수 있음.
ADD 생략 가능 파일 복사와 URL 다운로드. 잘 사용되지 않음. COPY로 대체 가능.
RUN 생략 가능 빌드 시 필요한 명령어를 실행. 생략하면 의존성 설치가 누락될 수 있음.
EXPOSE 생략 가능 컨테이너에서 외부로 노출할 포트를 지정. 생략해도 동작하지만 명시적 포트 노출 설정이 필요.
ENV 생략 가능 환경 변수를 설정. 생략하면 기본값 사용 또는 수동 설정 필요.

 

명령어의 중요도 및 상세설명

 

필수 명령어

(1) FROM

  • 설명: Dockerfile은 항상 FROM 명령어로 시작해야 한다.
  • 이유: Docker 이미지는 항상 베이스 이미지를 기반으로 생성되기 때문이다. 만약 특정 베이스 이미지가 없다면 FROM scratch를 사용해 빈 이미지를 기반으로 작업할 수 있다.
  • 예시:
     
     
# 파이썬 3.10 경량화 버전
FROM python:3.10-slim

(2) CMD 또는 ENTRYPOINT

  • 설명: CMD나 ENTRYPOINT 중 하나는 포함되어야 한다.
  • 이유: 컨테이너가 실행될 때 수행할 기본 명령을 지정해야 컨테이너가 제대로 동작하기 때문이다.
  • 예시:
    CMD ["python", "app.py"]
    or
    ENTRYPOINT ["python", "app.py"]
     

생략 가능한 명령어

Dockerfile에 포함하지 않아도 이미지를 빌드하고 컨테이너를 실행할 수 있다. 그러나 특정 작업을 수행하거나 설정을 위해 필요로 한다.

(1) WORKDIR

  • 설명: 컨테이너 내부에서 작업 디렉터리를 설정하는 명령어.
  • 생략 시: 기본적으로 루트 디렉터리(/)에서 작업한다.
  • 예시:
     
     
WORKDIR /app

(2) COPY

  • 설명: 로컬 파일을 컨테이너로 복사.
  • 생략 시: 애플리케이션 파일이 포함되지 않으므로 컨테이너가 제대로 동작하지 않을 수 있다.
  • 예시:
     
     
COPY . /app

(3) ADD

  • 설명: COPY와 비슷하지만 잘 사용되지 않는다. 단순 파일을 복제하는 것은 copy를 사용하고, 압축 해제가 필요한 파일이나 url을 통한 다운로드가 필요한 경우에만 사용된다.
  • 생략 시: COPY로 대체 가능.
  • 예시:
ADD https://example.com/file.tar.gz /data/
#OR
ADD software.tar.gz /opt/software/

#압축 해제를 명시적으로 제어하고 싶을 경우
COPY model.tar.gz /app/
RUN tar -xzvf /app/model.tar.gz -C /app/

(4) RUN

  • 설명: 이미지를 빌드할 때 필요한 명령어를 실행한다. 보통 패키지 설치나 설정 파일 준비를 위해 사용한다.
  • 생략 시: 필요한 의존성이 포함되지 않을 수 있다.➡️오류를 야기 할 수 있다.
  • 예시:
RUN pip install -r requirements.txt

(5) EXPOSE

  • 설명: 컨테이너에서 외부로 노출할 포트를 정의.
  • 생략 시: 컨테이너가 동작하지만, 포트를 명시적으로 문서화하지 않는다. 대신 docker run 명령에서 수동으로 포트를 지정해야 한다.
  • 예시:
EXPOSE 8000

(6) ENV

  • 설명: 컨테이너 환경 변수를 설정합니다.
  • 생략 시: 환경 변수를 수동으로 설정하거나 기본값으로 동작할 수 있다.
  • 예시:
ENV DJANGO_SETTINGS_MODULE=myproject.settings

 

 

예시 장고 도커 파일

 

# Dockerfile

#베이스 이미지 설정
FROM python:3.12

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

# 의존성 파일 복사
COPY requirements.txt ./

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

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

# 포트 설정
EXPOSE 8000

# Django 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

 

*RUN 명령어에 pip install --no-cache-dir 옵션은?

 

  • 설명: PIP 명령어에 사용되는 옵션으로, 패키지를 설치할 때 캐시 디렉터리를 사용하지 않도록 설정.
  • 역할: PIP는 기본적으로 설치 과정에서 패키지의 압축 파일(.whl 파일 등)을 캐싱하여, 나중에 다시 사용할 때 다운로드 없이 설치 시간을 단축할 수 있도록 한다. 하지만 도커의 환경에서는 기능이 필요 없으므로 --no-cache-dir 옵션을 사용해 캐시 파일을 생성하지 않도록 하여 이미지 크기를 줄인다.
  • 왜 --no-cache-dir가 중요한가?
    1. 이미지 크기 최적화:
      • Docker 이미지는 레이어(layer) 기반으로 작동 . 불필요한 캐시 파일이 남아 있으면 최종 이미지 크기가 커질 수 있다.
    2. 보안 및 재사용성:
      • 캐시 파일이 남아 있으면 민감한 데이터가 포함될 가능성이 있음.
      • 캐시 파일 없이 설치를 진행하면 재사용 가능한 경량 이미지 생성이 가능.

 

 

 

참조

https://docs.docker.com/reference/dockerfile/#dockerfile-examples

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

 

https://www.docker.com/blog/containerized-python-development-part-1/

 

Containerized Python Development - Part 1 | Docker

Developing Python projects in local environments can get pretty challenging if more than one project is being developed at the same time. Bootstrapping a project may take time as we need to manage versions, set up dependencies and configurations for it. Be

www.docker.com

 

'웹개발' 카테고리의 다른 글

레디스 명령어 모음  (0) 2024.12.23
장고의 세션 저장 원리  (0) 2024.12.19
Docker 기초 명령어 정리  (0) 2024.12.13
WSL(Windows Subsystem for Linux)란?  (0) 2024.12.10
도커 초기 설정  (0) 2024.12.05