docker image를 생성하기 위해서 는 Dockerfile을 먼저 만들어줘야한다. Dockerfile에는 해당 어플리케이션을 구동하기 위한 기본적인 동작이 작성되어야 한다.

기본적인 도커 파일 확장자는 다음과 같다.

⚡Tip

Dockerfile을 만든는 방법은 docker image로 만드려는 환경(언어, 패키지 파일 등등)에 따라 다르다. 예를 들어 pyhon으로 만들어진 스크립트를 이미지로 만드는 방법과 윈도우 응용프로그램 또는 자바 응용프로그램을 Dockerfile을 작성하는 방법이 상이하다. 따라서 반드시 각 환경에서 docker를 지원하는지 확인 후, 적합한 Dockerfile을 만드는 방법을 참고하여야 한다.

❗Dockerfile 작명법

현대적인 애자일(Agile) 개발 환경에서는 ‘개발 → 테스트 → 배포’의 사이클이 짧은 주기로 쉴 새 없이 반복된다. 그런데 이 과정에서 우리는 한가지 문제에 직면한다.

“개발할 때 필요한 환경과 실제 서비스될 환경이 과연 같을까”

당연히 다르다. 개발 환경은 디버깅이 편해야하지만, 실제 배포 환경은 보안이 철저하고 가벼워야한다. 목적이 다르니 담겨야할 내용도 달라야한다.

만약 하나의 Dockerfile로 이 모든 상황을 처리한다면 파일이 복잡해 질것이다(상황에 따라 if문으로 처리해야되기 때문에).그렇기 때문에 환경별로 최적화된 여러개의 Dockerfile을 나누어 관리해야한다.

가장 기본적인 방법은 다음과 같다.

# 로컬 개발용
Dockerfile.dev

# CI 서버 테스트용
Dockerfile.test (or) Dockerfile.ci

# 배포용
Dockerfile (or) Dockerfile.prod

사용법에 대해서는 Docker Build 내용 참조.

❗Dockerfile 명령어 가이드

Dockerfile 내에 입력하는 내용은 다양한 옵션이 있다.

  1. 베이스 이미지 및 메타테이터 설정
  2. 파일 시스템 및 환경설정
  3. 명령어 실행

해당 카테고리 별 명령어는 각 애플리케이션 환경 및 실행에 따라 옯바른 명령어 입력이 필요하다. 따라서 각 애플리케이션 환경에 맞는 Dockerfile 지원 Document를 확인해보자.

예시) 해당 어플리케이션은 java로 개발된 jar 파일에 대한 설정이다.

스크린샷 2025-11-30 오전 12.49.51.png

1️⃣ 베이스 이미지 및 메타데이터

FROM

새로운 빌드 단계를 초기화하고 베이스 이미지를 설정한다. 반드시 Dockerfile의 첫 번째 명령어여야 한다(ARG 제외 - 빌드 인수).

FROM node:18-alpine

LABEL

이미지에 메타데이터(버전, 작성자, 설명 등)을 추가한다. (기존 Maintainer는 deprecated 되었음)

LABEL version="1.0" description="My App"

2️⃣ 파일 시스템 및 환경설정

WORKDIR

명령어(RUN, CMD, COPY 등) 실행될 작업 디렉토리를 지정함. 해당 리렉토리가 없으면 생성한다.

WORKDIR /app

COPY

로컬 호스트의 파일이나 디렉토리를 이미지 내의 경로로 복사함. 가장 일반적으로 사용.

COPY package.json ./

ADD

COPY와 비슷하지만 두 가지 기능이 더 있음. - 특별한 이유가 없다면 COPY 사용

  1. 원격 URL에서 파일 다운로드 가능.
  2. 로컹의 tar 압축 파일을 자도응로 풀어서 복사함.
ADD package.json ./

ENV

환경 변수를 설정한다. 이 변수는 빌드 중에도 사용되고, 컨테이너 실행중에도 지속됨.

ENV NODE_ENV=production

3️⃣ 명령어 실행(빌드 vs 런타임)

RUN

이미지를 빌드하는 과정에서 실행되는 명령어. 주로 패키지 설치에 사용됨. 레이어가 생성.

RUN apt-get update && apt-get install -y pythone3

CMD

컨테이너가 시작할 때 실행할 기본 명령어

  • Dockerfile에서 한 번만 사용할 수 있음.
  • docker run 시 인자(파라미터)를 주면 CMD 내용은 무시.
CMD ["npm", "start"]

ENTRYPOINT

컨테이더가 시작될 떄 무조건 실행되는 명령어.

  • 주로 컨테이너를 실행파이러럼 다룰 떄 사용.
ENTRYPOINT ["python", "main.py"]

❗명령어 사용 시 유의점

명령어 사용할 시 가장 혼동하는 두가지 개념 비교.

  1. COPY vs ASS

    압축을 자동으로 풀어야 하는 경우(tar.gz)가 아니라면, 항상 COPY 사용. COPY가 더 직관적이고 명시적임.

    tar 파일을 언급하는 이유는 docker image를 저장할 때, save 명령어를 사용하여 .tar로 압축하여 저장하는 경우가 있어서 tar.gz를 언급한 것임.

  2. CMD vs ENTRYPOINT

    특징CMDENTRYPOINT
    목적기본 실행 명령어 및 인자 설정컨테이너를 실행 파일처럼 설정
    오버라이드docker run 뒤에 명령어를 입력하면 쉽게 변경됨docker run 뒤의 인가자 ENTRYPOINT의 파라미터로 추가됨
    주 사용처일반적인 웹 서버 실행 등CLI 도구, 고정된 데몬 실행
    # 파이썬 스크립트를 실행파일처럼 고정 (ENTRYPOINT)
    ENTRYPOINT ["python", "script.py"]
    
    # 기본 인자값 설정(CMD) - 사용자가 변경 가능
    CMD ["--help"]
    • 그냥 실행 시: python script.py - -help 실행됨
    • docker run my-image —version 실행 시: python script.py - -version 실행됨
profile
힘이 들면 힘들 내라.

0개의 댓글