본문 바로가기

가상 머신/Docker

[ VM / Docker ] Dockerfile 작성하기

반응형

Dockerfile은 Docker 이미지를 빌드하기 위해 사용되는 파일로, 각 명령어는 컨테이너 이미지의 레이어를 정의합니다. Dockerfile에서 사용할 수 있는 주요 옵션(명령어)에 대해 설명드리겠습니다.

1. Docker, Docker-compose 설치

  • 옵션

--f : dockerfile의 위치가 ./ 가 아닐 경우 경로를 준다.
--t : 빌드되는 이미지의 이름을 준다.

2. Dockerfile 기본 옵션 (명령어)

  1. FROM
    • 설명: 베이스 이미지를 지정합니다. Docker 이미지는 다른 이미지 위에 쌓여서 만들어지기 때문에 FROM 명령어는 첫 번째로 사용됩니다.
    • 예시:
      FROM ubuntu:20.04
  2. RUN
    • 설명: 컨테이너 내부에서 명령어를 실행하고, 그 결과를 새로운 이미지 레이어로 커밋합니다. 주로 패키지 설치나 설정에 사용됩니다.
    • 예시:
      RUN apt-get update && apt-get install -y nginx
  3. CMD
    • 설명: 컨테이너가 시작될 때 실행될 명령어를 지정합니다. CMD는 Docker 이미지가 실행될 때 기본적으로 실행되는 명령을 설정합니다. 단, docker run 명령어로 다른 명령을 지정하면 CMD는 무시됩니다.
    • 예시:
      CMD ["nginx", "-g", "daemon off;"]
  4. ENTRYPOINT
    • 설명: 컨테이너가 시작될 때 실행될 명령어를 지정합니다. CMD와 달리 ENTRYPOINT는 반드시 실행되며, docker run 명령어의 인자는 ENTRYPOINT의 인수로 추가됩니다.
    • 예시:
      ENTRYPOINT ["nginx"]
  5. COPY
    • 설명: 로컬 파일이나 디렉토리를 이미지의 파일 시스템으로 복사합니다.
    • 예시:
      COPY ./local-file /container-path
  6. ADD
    • 설명: 로컬 파일, 디렉토리 또는 URL에서 파일을 이미지로 복사합니다. COPY와 달리 압축 파일을 자동으로 풀 수 있습니다.
    • 예시:
      ADD https://example.com/file.tar.gz /container-path
  7. WORKDIR
    • 설명: 이후의 명령어가 실행될 작업 디렉토리를 설정합니다.
    • 예시:
      WORKDIR /app
  8. ENV
    • 설명: 환경 변수를 설정합니다.
    • 예시:
      ENV APP_ENV=production
  9. EXPOSE
    • 설명: 컨테이너가 사용하는 네트워크 포트를 명시합니다. 실제로 포트를 열지는 않지만, 문서화 목적으로 사용됩니다.
    • 예시:
      EXPOSE 80
  10. VOLUME
    • 설명: 컨테이너와 호스트 간의 볼륨을 정의합니다.
    • 예시:
      VOLUME ["/data"]
  11. USER
    • 설명: 컨테이너 내에서 명령어를 실행할 사용자 또는 사용자와 그룹을 설정합니다.
    • 예시:
      USER appuser
  12. ARG
    • 설명: Dockerfile 빌드 시에 사용할 수 있는 변수(인수)를 정의합니다. ENV와 비슷하지만 빌드 과정에만 사용됩니다.
    • 예시:
      ARG VERSION=1.0.0
      RUN echo $VERSION
  13. LABEL
    • 설명: 이미지에 메타데이터를 추가합니다.
    • 예시:
      LABEL maintainer="you@example.com"
  14. ONBUILD
    • 설명: 베이스 이미지로 사용될 때 실행될 명령어를 정의합니다.
    • 예시:
      ONBUILD RUN echo "Building on top of this image"
  15. STOPSIGNAL
    • 설명: 컨테이너를 종료할 때 사용할 시스템 호출을 정의합니다.
    • 예시:
      STOPSIGNAL SIGTERM
  16. HEALTHCHECK
    • 설명: 컨테이너의 상태를 확인하는 명령어를 설정합니다.
    • 예시:
      HEALTHCHECK --interval=30s --timeout=10s --retries=3 CMD curl -f http://localhost/ || exit 1
  17. SHELL
    • 설명: RUN, CMD, ENTRYPOINT 등의 명령어를 실행할 쉘을 지정합니다.
    • 예시:
      SHELL ["powershell", "-Command"]

3. Dockerfile 작성 팁

  • 명령어 체이닝: RUN 명령어에서 여러 명령어를 한 번에 실행하여 이미지를 최적화할 수 있습니다. 예: RUN apt-get update && apt-get install -y nginx.
  • 멀티스테이지 빌드: 복잡한 빌드 프로세스를 여러 단계로 나누어 이미지 크기를 줄일 수 있습니다.
  • 캐싱 활용: Docker는 각 명령어를 레이어로 캐시합니다. 자주 변경되는 명령어는 아래에 두는 것이 빌드 성능에 유리합니다.

이러한 옵션들을 잘 활용하면 효율적이고 유지 관리가 쉬운 Docker 이미지를 만들 수 있습니다.

반응형