본문 바로가기
개발정리 (docker)

[docker] Dockerfile 제대로 이해하기: 실무에서 자주 쓰는 명령어 정리

by 할리갈리0 2025. 9. 19.

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을 작성할 수 있습니다.

반응형