[Docker] Dockerfile 알아보기

IBLOG·2024년 12월 6일

Docker

목록 보기
1/1
post-thumbnail

Dockerfile 이란?

  • Dockerfile은 Docker 이미지를 생성하기 위한 스크립트(설정파일)이다.
  • Dockerfile 파일은 명령어들로 구성되어 있으며, 이 파일은 Docker에게 애플리케이션이 어떻게 설치되고, 환경이 어떻게 설정되며, 최종적으로 컨테이너가 어떻게 실행되어야 하는지를 알려준다.

Dockerfile 명령어

1. FROM

  • Dockerfile의 첫 번째 명령어로, Base 이미지를 지정한다.
  • 사용하는 이미지는 보통 Docker Hub에서 제공해주는 오픈소스나 Public Repository을 통해 가져온다.
FROM python:3.9-slim
# FROM <image>[:<tag>] [AS <name>]

2. WORKDIR

  • WORKDIR은 Dockerfile 내에서 작업할 디렉토리를 설정하는 명령어이다.
  • 해당 디렉토리로 이동한 후, 이후의 명령들이 실행된다.
  • cd 명령어와 동일
WORKDIR /app
# WORKDIR /<directory>

3. COPY / ADD

  • COPY는 로컬 파일이나 디렉토리를 컨테이너로 복사하는 명령어이다.
  • ADD는 COPY와 비슷하지만, 원격 URL에서 파일을 다운로드하거나 tar 파일을 자동으로 압축 해제하는 기능을 추가적으로 사용가능하다.
  • tar 파일과 URL 을 사용하는 상황들을 제외하고 대부분 COPY를 사용.
COPY requirements.txt /app/
# COPY <file or directory> <container directory>

4. RUN

  • RUN은 Dockerfile 내에서 명령어를 실행할 때 사용된다.
  • 주로 패키지 설치나, 애플리케이션 빌드 과정에서 사용
RUN pip install --no-cache-dir -r requirements.txt # shell 형식
RUN ["pip", "install", "--no-cache-dir", "-r", "requirements.txt"] # exec 형식
  • exec을 사용하면 좋은 점
    • 쉘을 사용하지 않으므로 불필요한 환경 변수를 로드하지 않아 더 빠르고 안전하게 실행된다.
    • 명령어가 명확하게 실행되며, 쉘의 의도치 않은 동작을 피할 수 있다.

5. CMD / ENTRYPOINT

  • CMD는 컨테이너 내부에서 수행될 작업이나 기본 명령을 실행하며, 컨테이너를 생성할 때만 실행된다.
  • CMD는 exec 형태로 많이 사용
  • ENTRYPOINT는 컨테이너가 실행될 때 항상 실행되어야 할 명령을 설정한다.
CMD ["python", "app.py"]
# CMD ["<커맨드>", "<파라미터1>", "<파라미터2>"]

6. EXPOSE

  • 컨테이너가 사용하는 연결 포트를 설정한다.
  • 컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다.
EXPOSE 8080
# EXPOSE <port>

7. ENV(optional)

  • 이미지에서 사용할 환경 변수를 설정한다.
  • 기본적으로 Key-Value 쌍으로 구성되어 있으며 환경 경로 설정을 통해 Dockerfile 명령어 작성 시 참고하며 적을 수 있다.
ENV Time 1111
# ENV <key>=<value>

8. LABEL(optional)

  • 이미지에 메타데이터를 추가해 구분할 수 있도록 도와주는 역할
  • key-value로 작성
LABEL  maintainer="yule <email>"

Dockerfile 예시

# 1. 파이썬 이미지 기반
FROM python:3.9-slim

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

# 3. 파일 복사
COPY requirements.txt /app/

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

# 5. 애플리케이션 소스 복사
COPY . /app/

# 6. 애플리케이션 실행 명령어 설정
CMD ["python", "app.py"]

Dockerfile 빌드 및 실행

1. build

docker build -t 이미지명:태그 .
#   docker build -t [이미지 이름:버전(태그)] [Dockerfile의 경로]

2. run

  • -p : 포트 설정
  • -d : background 실행
docker run -d -p 호스트포트:컨테이너포트 이미지명:태그

Dockerfile 작성 팁!

1. .dockerignore로 불필요한 파일 제외하기

  • dockerignore 파일을 사용하여 이미지에 포함되지 않아야 할 파일들을 제외할 수 있다.
  • 이미지 크기를 줄일 수 있는 방법
# .dockerignore
__pycache__
Dockerfile
.git
*.pyc

2. 캐시를 활용한 빌드 속도 최적화

  • Docker는 각 명령어를 실행할 때 캐시를 사용
  • requirements.txt 파일을 먼저 복사하고 패키지를 설치한 후, 애플리케이션 소스를 복사하는 방식으로 최적화
  • 의존성 설치가 변경되지 않는 한, Docker는 pip install을 다시 실행하지 않는다.
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/

3. Multi-Stage builds를 활용한 이미지 최적화

  • 빌드 단계에서만 필요한 도구들을 포함한 이미지를 만들고, 최종 이미지에는 애플리케이션 코드만 포함시킬 수 있다.
  • Dockerfile들을 최적화하는 과정에서 읽기 쉽고 유지보수하기 좋게 만들기 위해 사용
  • 여러 RUN 명령어는 가능한 하나로 결합하여 레이어 수를 줄여서 사용한다.
# 빌드 단계
FROM python:3.9-slim AS build
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt

# 실행 단계
FROM python:3.9-slim
WORKDIR /app
COPY --from=build /app /app
COPY . /app/
CMD ["python", "app.py"]
profile
✢ 천천히 하나씩 기록해보자!

0개의 댓글