← 아티클 목록

Docker Compose와 Dockerfile 차이 — 역할 구분 가이드

2028-06-26#docker#compose#dockerfile

도커를 배우다 보면 Dockerfiledocker-compose.yml이 둘 다 등장해서 "둘이 뭐가 다르지?"라는 질문에 막힙니다. 둘은 경쟁 관계가 아니라 역할이 다른 도구입니다. 한 줄로 요약하면 Dockerfile은 이미지를 굽는 레시피이고, Compose는 그렇게 구운 컨테이너 여러 개를 함께 띄우는 조립 설명서입니다. 이 구분이 잡히면 둘을 자연스럽게 같이 쓰게 됩니다.

역할의 핵심 차이

Dockerfile은 "이미지를 어떻게 만들 것인가"를 정의합니다. 베이스 이미지, 복사할 파일, 설치 명령, 실행 진입점이 들어갑니다. Compose는 "어떤 컨테이너들을, 어떤 설정으로, 어떻게 연결해 띄울 것인가"를 정의합니다.

구분Dockerfiledocker-compose.yml
다루는 단위이미지 1개여러 컨테이너(서비스)
답하는 질문무엇을 어떻게 빌드?무엇을 어떻게 실행?
주요 명령FROM, COPY, RUNservices, ports, depends_on
실행 시점docker builddocker compose up

Dockerfile — 이미지를 굽는다

Dockerfile은 내 앱을 컨테이너로 만들기 위한 단계를 적습니다. 결과물은 어디서든 실행할 수 있는 하나의 이미지입니다.

Dockerfile
FROM node:20-slim
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
CMD ["node", "server.js"]

Compose — 컨테이너를 조립한다

실제 앱은 웹 서버 하나로 끝나지 않고 DB, 캐시 같은 동료 컨테이너가 필요합니다. Compose는 이들을 한 파일에 모아 한 번에 띄우고, 네트워크로 연결해 줍니다. 아래에서 build는 위 Dockerfile을 가리키고, db는 기존 이미지를 그대로 씁니다.

YAML
services:
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
Docker
docker compose up -d
docker compose ps

여기서 핵심은 Compose가 Dockerfile을 대체하지 않는다는 점입니다. web 서비스는 여전히 Dockerfile로 빌드되고, Compose는 그 결과를 db와 묶어 함께 실행할 뿐입니다. 만약 빌드할 이미지가 없고 기존 이미지(postgres 등)만 쓴다면 Dockerfile 없이 Compose만으로도 됩니다.

언제 무엇을 쓰나

이미지를 직접 만들어야 하면 Dockerfile이 반드시 필요합니다. 컨테이너가 둘 이상이거나 포트·환경변수·볼륨 설정을 반복해서 입력하기 번거로우면 Compose가 답입니다. 대부분의 로컬 개발 환경은 둘을 함께 씁니다 — 내 앱은 Dockerfile로 굽고, 그 앱과 DB를 Compose로 묶는 식입니다.

요점 정리

  • Dockerfile은 이미지를 빌드하는 레시피, Compose는 컨테이너들을 실행하는 조립서다.
  • 둘은 경쟁이 아니라 빌드 단계와 실행 단계로 역할이 나뉜다.
  • Compose의 build는 Dockerfile을 호출하고, image는 기존 이미지를 쓴다.
  • 단일 이미지 빌드는 Dockerfile, 다중 컨테이너 실행은 Compose가 맡는다.

Dockerfile로 이미지를 굽고 Compose로 여러 컨테이너를 묶어 띄우는 실습은 도커 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.