3.1 FROM
명령
자, 기억해둬, Dockerfile은 Docker 이미지 생성을 위한 명령어들이 담긴 텍스트 파일이야. Dockerfile의 각 명령은 특정 작업을 수행하고 이미지의 새로운 레이어를 생성해. 이번 강의에서는 Dockerfile의 주요 명령들인 FROM
, RUN
, COPY
, CMD
에 대해 자세히 알아볼 거야. 이 명령어들은 기능적이고 효율적인 Docker 이미지를 만드는 핵심이야.
FROM
명령은 기본 이미지를 지정해, 새 이미지를 생성할 때 사용하는 거야. Dockerfile에서는 가장 첫 번째로 나오는 명령이고, 이미지 병합의 시작점을 결정해.
문법
FROM <image>[:<tag>] [AS <name>]
여기서:
<image>
: 기본 이미지 이름.<tag>
: (선택사항) 기본 이미지의 버전. 기본값은latest
.AS <name>
: (선택사항) 이 빌드 단계에서 사용할 이름 설정 (다단계 빌드에서 사용됨).
예제들
기본 이미지 Ubuntu
사용:
FROM ubuntu:20.04
공식 이미지 Node.js
사용:
FROM node:14
다단계 빌드로 최적화 사용:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
이 예제에서는 두 개의 기본 이미지를 사용하고 있어. 첫 번째 (node:14)는 애플리케이션 빌드를 위해 사용되고, 두 번째 (nginx:alpine)는 정적 파일을 제공할 가벼운 서버를 만들기 위해 사용돼.
다단계 빌드를 사용함으로써 최종 이미지는 최소한의 파일과 프로그램(Nginx
및 빌드된 정적 파일만 포함)만 포함하기 때문에 더 가볍고 배포가 빨라져.
3.2 RUN 명령어
RUN
명령어는 컨테이너 내부에서 명령을 실행하고 image에 새로운 layer를 생성해. 이 명령어는 패키지 설치, 환경 설정, image 준비에 필요한 기타 명령을 실행하는 데 사용돼.
문법:
RUN <command>
여기서:
<command>
: 컨테이너 내부에서 실행될 명령이야.
예시:
Ubuntu image에서 패키지 설치:
RUN apt-get update && apt-get install -y curl git
코드 컴파일:
RUN gcc -o myapp myapp.c
여러 명령어 합치기
layer 수를 줄이고 image
크기를 줄이며 빌드 속도를 높이기 위해 여러 명령어를 하나의 RUN
명령어로 결합하는 게 좋아.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 명령어 COPY
COPY
명령어는 빌드 컨텍스트에서 파일과 디렉토리를 컨테이너의 파일 시스템으로 복사해. 이건 소스 코드, 설정 파일, 그리고 다른 리소스를 컨테이너로 옮길 때 유용해.
문법:
COPY <src> <dest>
여기서:
-
<src>
: 빌드 컨텍스트 안의 파일이나 디렉토리 경로. <dest>
: 컨테이너 안의 목적 경로.
예시:
현재 디렉토리의 모든 내용을 컨테이너의 작업 디렉토리로 복사하기:
COPY . /app
개별 파일 복사하기:
COPY package.json /app/package.json
COPY server.js /app/server.js
.dockerignore
사용하기
복사 과정에서 필요 없는 파일은 .dockerignore
파일을 사용해 제외시킬 수 있어. 이건 .gitignore
와 비슷하게 동작해.
node_modules
dist
*.log
3.4 명령어 CMD
CMD
명령어는 컨테이너를 실행할 때 수행될 명령을 설정해. RUN
이 빌드 단계에서 실행되는 것과는 달리, CMD
는 생성된 이미지에서 컨테이너를 실행할 때 실행돼.
문법:
CMD ["executable","param1","param2"]
혹은
CMD command param1 param2
여기서:
- ["executable","param1","param2"]: exec 형식, 신호 처리를 올바르게 보장하기 위해 선호돼.
- command param1 param2:
shell
형식이며, 명령어를 셸에서 실행해.
예시:
Node.js
애플리케이션 실행:
CMD ["node", "app.js"]
shell
스크립트 실행:
CMD /usr/bin/myscript.sh
CMD
와 ENTRYPOINT
의 차이
CMD
는 기본 명령을 설정하며, 컨테이너 실행 시 재정의될 수 있어. ENTRYPOINT
는 항상 컨테이너가 실행될 때 실행되는 고정된 명령을 설정해.
ENTRYPOINT
사용 예시:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
이 예시에서, ENTRYPOINT
는 Python 스크립트를 실행하고, CMD
는 컨테이너 실행 시 변경 가능한 인자를 전달해.
기본 명령을 포함한 Dockerfile 예시
# Node.js 베이스 이미지를 사용
FROM node:14
# 작업 디렉토리를 설정
WORKDIR /app
# package.json과 package-lock.json 파일 복사
COPY package*.json ./
# 의존성 설치
RUN npm install
# 애플리케이션 소스 코드 복사
COPY . .
# 애플리케이션에서 사용할 포트를 지정
EXPOSE 3000
# 애플리케이션 실행 명령을 정의
CMD ["node", "app.js"]
GO TO FULL VERSION