Dockerfile은 애플리케이션을 실행하기 위한 환경을 코드로 기록한 문서입니다.
운영체제, 패키지 설치, 코드 복사, 실행 방법 등을 모두 순서대로 적어두면, 언제 어디서든 동일한 실행 환경을 재현할 수 있습니다.
이번 글에서는 실무에서 자주 쓰이는 핵심 명령어 6가지를 정리하겠습니다.
1. FROM – 베이스 이미지 지정하기
Dockerfile은 항상 FROM으로 시작합니다.
어떤 환경에서 애플리케이션을 실행할지를 정하는 단계입니다.
FROM node:20-slim
위 예시는 Debian 기반의 최소 Node.js 20 환경을 불러옵니다.
slim, alpine 같은 태그는 불필요한 패키지를 줄여 용량을 최소화합니다.
Python과 Go 예시:
FROM python:3.11-slim
FROM golang:1.22-alpine
2. RUN – 빌드 과정에서 실행할 명령
RUN은 컨테이너 이미지가 생성될 때 실행할 명령어를 기록합니다.
보통 패키지 설치나 의존성 다운로드에 사용합니다.
RUN은 여러 번 쓸 수 있지만, 보통 패키지 설치 과정을 최소한의 단계로 합쳐 캐싱을 효율적으로 활용합니다.
RUN npm install
RUN pip install -r requirements.txt
RUN go build -o app main.go
3. COPY – 로컬 파일을 이미지에 복사
내 프로젝트 소스를 컨테이너 안으로 가져오려면 COPY를 사용합니다.
COPY . .
위처럼 쓰면 Dockerfile이 있는 위치의 모든 파일을 이미지 내부의 현재 경로에 복사합니다.
단, 불필요한 파일은 .dockerignore로 제외해야 합니다.
예: .dockerignore
node_modules
.git
__pycache__
4. WORKDIR – 작업 디렉토리 설정
컨테이너 내부에서 명령이 실행될 위치를 바꿀 수 있습니다.
WORKDIR /app
이제 이후 모든 명령어는 /app 디렉토리를 기준으로 실행됩니다.
COPY와 RUN을 함께 사용하면 깔끔합니다:
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
5. CMD – 컨테이너 실행 시 기본 명령
컨테이너가 시작될 때 어떤 명령을 실행할지 정의합니다.
하나의 Dockerfile에는 CMD가 하나만 유효합니다.
CMD는 컨테이너 실행 시 다른 명령으로 쉽게 덮어쓸 수 있습니다.
CMD ["node", "server.js"]
CMD ["python", "app.py"]
CMD ["./app"]
6. EXPOSE – 포트 명시
EXPOSE는 외부와 연결할 포트를 표시합니다. 실제 포트를 열지는 않지만, 문서화 역할을 합니다.
EXPOSE 8080
이미지를 실행할 때는 -p 옵션으로 매핑해야 합니다.
docker run -p 8080:8080 myapp
7. 실무에서 자주 쓰는 패턴
[Node.js]
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
EXPOSE 8080
CMD ["node", "server.js"]
[Python (Flask)]
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
[Go]
Go는 보통 멀티 스테이지 빌드를 활용해 빌드 단계와 실행 단계를 분리합니다.
FROM golang:1.22-alpine AS builder
WORKDIR /src
COPY . .
RUN go build -o myapp main.go
FROM alpine:latest
WORKDIR /app
COPY --from=builder /src/myapp .
EXPOSE 8080
CMD ["./myapp"]
Dockerfile은 단순한 설정 파일이 아니라 환경을 코드로 기록하는 핵심 도구입니다.
- FROM으로 시작해
- RUN으로 패키지를 설치하고
- COPY로 소스를 가져오고
- WORKDIR로 작업 디렉토리를 정한 뒤
- CMD와 EXPOSE로 실행 방식을 정의
이 기본 패턴만 이해하면, 어떤 언어든 동일한 방식으로 컨테이너화할 수 있습니다.
실무에서는 캐시 최적화와 보안, 멀티스테이지 빌드 같은 고급 패턴까지 익히면 더 효율적인 Dockerfile을 작성할 수 있습니다.
'개발정리 (docker)' 카테고리의 다른 글
| [docker] 컨테이너 다루기 필수 명령어 모음 (0) | 2025.09.24 |
|---|---|
| [docker] 내 애플리케이션을 Docker 이미지로 만들기 (0) | 2025.09.22 |
| [docker] Docker의 장점과 단점 (0) | 2025.09.18 |
| [docker] Docker 설치할 때 자주 만나는 오류와 해결법 (0) | 2025.09.16 |
| [docker] Dockerfile 기본 문법과 작성법: 환경을 코드로 기록하기 (0) | 2025.09.15 |