docker image를 생성하기 위해서 는 Dockerfile을 먼저 만들어줘야한다. Dockerfile에는 해당 어플리케이션을 구동하기 위한 기본적인 동작이 작성되어야 한다.
기본적인 도커 파일 확장자는 다음과 같다.

⚡Tip
Dockerfile을 만든는 방법은 docker image로 만드려는 환경(언어, 패키지 파일 등등)에 따라 다르다. 예를 들어 pyhon으로 만들어진 스크립트를 이미지로 만드는 방법과 윈도우 응용프로그램 또는 자바 응용프로그램을 Dockerfile을 작성하는 방법이 상이하다. 따라서 반드시 각 환경에서 docker를 지원하는지 확인 후, 적합한 Dockerfile을 만드는 방법을 참고하여야 한다.
현대적인 애자일(Agile) 개발 환경에서는 ‘개발 → 테스트 → 배포’의 사이클이 짧은 주기로 쉴 새 없이 반복된다. 그런데 이 과정에서 우리는 한가지 문제에 직면한다.
“개발할 때 필요한 환경과 실제 서비스될 환경이 과연 같을까”
당연히 다르다. 개발 환경은 디버깅이 편해야하지만, 실제 배포 환경은 보안이 철저하고 가벼워야한다. 목적이 다르니 담겨야할 내용도 달라야한다.
만약 하나의 Dockerfile로 이 모든 상황을 처리한다면 파일이 복잡해 질것이다(상황에 따라 if문으로 처리해야되기 때문에).그렇기 때문에 환경별로 최적화된 여러개의 Dockerfile을 나누어 관리해야한다.
가장 기본적인 방법은 다음과 같다.
# 로컬 개발용
Dockerfile.dev
# CI 서버 테스트용
Dockerfile.test (or) Dockerfile.ci
# 배포용
Dockerfile (or) Dockerfile.prod
사용법에 대해서는 Docker Build 내용 참조.
Dockerfile 내에 입력하는 내용은 다양한 옵션이 있다.
해당 카테고리 별 명령어는 각 애플리케이션 환경 및 실행에 따라 옯바른 명령어 입력이 필요하다. 따라서 각 애플리케이션 환경에 맞는 Dockerfile 지원 Document를 확인해보자.
예시) 해당 어플리케이션은 java로 개발된 jar 파일에 대한 설정이다.
FROM
새로운 빌드 단계를 초기화하고 베이스 이미지를 설정한다. 반드시 Dockerfile의 첫 번째 명령어여야 한다(ARG 제외 - 빌드 인수).
FROM node:18-alpine
LABEL
이미지에 메타데이터(버전, 작성자, 설명 등)을 추가한다. (기존 Maintainer는 deprecated 되었음)
LABEL version="1.0" description="My App"
WORKDIR
명령어(RUN, CMD, COPY 등) 실행될 작업 디렉토리를 지정함. 해당 리렉토리가 없으면 생성한다.
WORKDIR /app
COPY
로컬 호스트의 파일이나 디렉토리를 이미지 내의 경로로 복사함. 가장 일반적으로 사용.
COPY package.json ./
ADD
COPY와 비슷하지만 두 가지 기능이 더 있음. - 특별한 이유가 없다면 COPY 사용
ADD package.json ./
ENV
환경 변수를 설정한다. 이 변수는 빌드 중에도 사용되고, 컨테이너 실행중에도 지속됨.
ENV NODE_ENV=production
RUN
이미지를 빌드하는 과정에서 실행되는 명령어. 주로 패키지 설치에 사용됨. 레이어가 생성.
RUN apt-get update && apt-get install -y pythone3
CMD
컨테이너가 시작할 때 실행할 기본 명령어
CMD ["npm", "start"]
ENTRYPOINT
컨테이더가 시작될 떄 무조건 실행되는 명령어.
ENTRYPOINT ["python", "main.py"]
명령어 사용할 시 가장 혼동하는 두가지 개념 비교.
COPY vs ASS
압축을 자동으로 풀어야 하는 경우(tar.gz)가 아니라면, 항상 COPY 사용. COPY가 더 직관적이고 명시적임.
tar 파일을 언급하는 이유는 docker image를 저장할 때, save 명령어를 사용하여 .tar로 압축하여 저장하는 경우가 있어서 tar.gz를 언급한 것임.
CMD vs ENTRYPOINT
| 특징 | CMD | ENTRYPOINT |
|---|---|---|
| 목적 | 기본 실행 명령어 및 인자 설정 | 컨테이너를 실행 파일처럼 설정 |
| 오버라이드 | docker run 뒤에 명령어를 입력하면 쉽게 변경됨 | docker run 뒤의 인가자 ENTRYPOINT의 파라미터로 추가됨 |
| 주 사용처 | 일반적인 웹 서버 실행 등 | CLI 도구, 고정된 데몬 실행 |
# 파이썬 스크립트를 실행파일처럼 고정 (ENTRYPOINT)
ENTRYPOINT ["python", "script.py"]
# 기본 인자값 설정(CMD) - 사용자가 변경 가능
CMD ["--help"]