Dockerfile 이란?
- Dockerfile은 Docker 이미지를 생성하기 위한 스크립트(설정파일)이다.
- Dockerfile 파일은 명령어들로 구성되어 있으며, 이 파일은 Docker에게 애플리케이션이 어떻게 설치되고, 환경이 어떻게 설정되며, 최종적으로 컨테이너가 어떻게 실행되어야 하는지를 알려준다.
Dockerfile 명령어
1. FROM
- Dockerfile의 첫 번째 명령어로, Base 이미지를 지정한다.
- 사용하는 이미지는 보통 Docker Hub에서 제공해주는 오픈소스나 Public Repository을 통해 가져온다.
FROM python:3.9-slim
2. WORKDIR
- WORKDIR은 Dockerfile 내에서 작업할 디렉토리를 설정하는 명령어이다.
- 해당 디렉토리로 이동한 후, 이후의 명령들이 실행된다.
- cd 명령어와 동일
WORKDIR /app
3. COPY / ADD
- COPY는 로컬 파일이나 디렉토리를 컨테이너로 복사하는 명령어이다.
- ADD는 COPY와 비슷하지만, 원격 URL에서 파일을 다운로드하거나 tar 파일을 자동으로 압축 해제하는 기능을 추가적으로 사용가능하다.
- tar 파일과 URL 을 사용하는 상황들을 제외하고 대부분 COPY를 사용.
COPY requirements.txt /app/
4. RUN
- RUN은 Dockerfile 내에서 명령어를 실행할 때 사용된다.
- 주로 패키지 설치나, 애플리케이션 빌드 과정에서 사용
RUN pip install --no-cache-dir -r requirements.txt
RUN ["pip", "install", "--no-cache-dir", "-r", "requirements.txt"]
- exec을 사용하면 좋은 점
- 쉘을 사용하지 않으므로 불필요한 환경 변수를 로드하지 않아 더 빠르고 안전하게 실행된다.
- 명령어가 명확하게 실행되며, 쉘의 의도치 않은 동작을 피할 수 있다.
5. CMD / ENTRYPOINT
- CMD는 컨테이너 내부에서 수행될 작업이나 기본 명령을 실행하며, 컨테이너를 생성할 때만 실행된다.
- CMD는 exec 형태로 많이 사용
- ENTRYPOINT는 컨테이너가 실행될 때 항상 실행되어야 할 명령을 설정한다.
CMD ["python", "app.py"]
"<커맨드>", "<파라미터1>", "<파라미터2>"]
6. EXPOSE
- 컨테이너가 사용하는 연결 포트를 설정한다.
- 컨테이너 생성 시 -p 옵션의 컨테이너 포트 값으로 EXPOSE 값을 적어야한다.
EXPOSE 8080
7. ENV(optional)
- 이미지에서 사용할 환경 변수를 설정한다.
- 기본적으로 Key-Value 쌍으로 구성되어 있으며 환경 경로 설정을 통해 Dockerfile 명령어 작성 시 참고하며 적을 수 있다.
ENV Time 1111
8. LABEL(optional)
- 이미지에 메타데이터를 추가해 구분할 수 있도록 도와주는 역할
- key-value로 작성
LABEL maintainer="yule <email>"
Dockerfile 예시
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["python", "app.py"]
Dockerfile 빌드 및 실행
1. build
docker build -t 이미지명:태그 .
2. run
- -p : 포트 설정
- -d : background 실행
docker run -d -p 호스트포트:컨테이너포트 이미지명:태그
Dockerfile 작성 팁!
1. .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"]