기본 개념
Dockerfile은 Docker 이미지를 생성하기 위한 스크립트(설정 파일)입니다. Docker는 Dockerfile에 작성된 명령어를 순차적으로 실행하여 자동으로 이미지를 생성합니다. 도커 이미지는 서버 프로그램, 소스코드, 실행 파일을 포함한 프로그램 구동을 위한 "종합선물세트"라고 볼 수 있습니다.
Dockerfile 주요 명령어
FROM
- 기본 이미지를 지정하는 명령어입니다
- 모든 Dockerfile은 FROM 명령어로 시작해야 합니다
- 예: FROM ubuntu:18.04 - Ubuntu 18.04를 기본 이미지로 사용
RUN
- 컨테이너 내에서 명령어를 실행하는 데 사용됩니다
- 주로 패키지 설치 등의 작업에 사용됩니다
- 예: RUN apt-get update && apt-get install -y python3
COPY와 ADD
- 파일을 이미지로 복사하는 명령어입니다
- COPY: 로컬 파일을 컨테이너로 단순 복사
- ADD: 압축 파일 자동 해제, URL에서 다운로드 등 추가 기능 제공
WORKDIR
- 작업 디렉토리를 설정하는 명령어입니다
- 이후의 명령어(RUN, CMD, ENTRYPOINT 등)가 실행될 디렉토리를 지정
- 예: WORKDIR /app
ENV
- 환경변수를 설정하는 명령어입니다
- 예: ENV NODE_ENV production
EXPOSE
- 컨테이너가 실행 중에 수신 대기할 포트를 지정합니다
- 예: EXPOSE 80
CMD
- 컨테이너가 시작될 때 실행할 명령어를 지정합니다
- Dockerfile에서 하나만 실행 가능하며, 여러 개 있을 경우 마지막 하나만 적용됨
- 예: CMD ["node", "app.js"]
ENTRYPOINT
- 컨테이너가 시작될 때 실행할 명령어를 지정하지만, CMD와 달리 덮어쓰기가 되지 않음
- 예: ENTRYPOINT ["echo", "hello"]
VOLUME
- 데이터를 컨테이너가 아닌 호스트에 저장할 디렉토리를 설정합니다
- 예: VOLUME /data
USER
- 명령어를 실행할 사용자를 지정합니다
- 예: USER appuser
ARG
- 빌드 시 전달할 변수를 정의합니다
- 예: ARG VERSION=latest
HEALTHCHECK
LABEL
- 메타데이터를 추가하는 명령어입니다
- 예: LABEL version="1.0" description="This is my application"
Dockerfile 작성 모범 사례
- 적절한 베이스 이미지 선택: OS와 버전을 정확히 지정 (예: ubuntu:18.04)
- 레이어 최소화: RUN 명령어를 && 연산자로 연결하여 레이어 수 줄이기
- 불필요한 패키지 설치 방지: 필요한 패키지만 설치
- 빌드 캐시 활용: 자주 변경되지 않는 명령어를 Dockerfile 상단에 배치
- 컨테이너 특성 이해: 컨테이너는 격리된 공간에서 프로세스가 동작하도록 하는 기술
이미지 빌드 방법
Dockerfile을 작성한 후 다음 명령어로 이미지를 빌드할 수 있습니다
작성 기준 최신의 이미지 빌드 명령어입니다
Usage: docker buildx build [OPTIONS] PATH | URL | -
docker buildx build -t 이미지이름:태그 .
이 명령어는 현재 디렉토리의 Dockerfile을 기반으로 Docker 이미지를 생성합니다.
이미지 빌드 관련해서는 새로운 게시글을 올리겠습니다.
결론
Dockerfile은 Docker 컨테이너화의 핵심 요소로, 애플리케이션과 그 실행 환경을 코드로 정의하는 방법입니다. 위에 설명된 명령어들을 활용하여 재현 가능하고 일관된 환경을 구축할 수 있습니다.
참고: https://docs.docker.com/reference/dockerfile/