Docker Compose

도커 컴포즈(Docker Compose)는 여러 개의 도커 컨테이너(Container)를 정의하고 한 번에 실행・관리할 수 있게 해주는 도구입니다.

이해하기 쉽게 비유하자면, 도커(Docker)가 개별 ‘악기 연주자(컨테이너)‘라면, 도커 컴포즈는 이들이 지정된 악보에 맞춰 조화롭게 연주할 수 있도록 이끄는 ‘오케스트라 지휘자’라고 할 수 있습니다.


1. 왜 도커 컴포즈를 사용할까요? (사용 배경)

일반적인 웹 서비스를 띄우려면 보통 서버 하나만으로 끝나지 않습니다.

  • Web 서버 (예: Nginx, Apache)
  • Backend 서버 (예: Node.js, Spring Boot, Django)
  • Database (예: MySQL, PostgreSQL)
  • Cache (예: Redis)

이 4개의 서버를 도커로만 실행하려면 docker run 명령어를 4번이나 길고 복잡하게(포트, 네트워크, 환경변수 등을 설정하며) 입력해야 합니다. 또한, 이 4개의 컨테이너가 서로 통신할 수 있도록 네트워크 설정도 해줘야 합니다.

도커 컴포즈는 이 모든 복잡한 설정을 compose.yaml (또는 docker-compose.yml)이라는 문서 하나에 적어두고, 명령어 단 한 줄로 모든 컨테이너를 실행하고 종료할 수 있게 해줍니다.


2. 도커 컴포즈의 핵심 장점

  1. 단일 명령어로 제어: docker compose up 이라는 명령어 하나로 여러 개의 컨테이너를 순서에 맞게 한 번에 실행할 수 있습니다.
  2. 설정 파일 기반(YAML): 실행 옵션들을 YAML 파일에 코드로 저장하기 때문에 (Infrastructure as Code), 명령어를 외울 필요가 없고 다른 팀원과 공유하거나 버전 관리를 하기 좋습니다.
  3. 독립된 네트워크 자동 생성: 같은 compose.yaml 파일 안에 정의된 서비스(컨테이너)들은 자동으로 하나의 네트워크로 묶여, IP 주소 대신 ‘서비스 이름(예: db, web)‘만으로 서로 통신할 수 있습니다.

3. 실제 사용 예시 (compose.yaml)

웹 서버(Nginx)와 데이터베이스(MySQL)를 함께 띄우는 간단한 예시입니다.

# compose.yaml 파일
version: '3.8' # 컴포즈 파일의 버전
 
services: # 실행할 컨테이너들을 정의하는 공간
  
  web: # 웹 서버 서비스 이름
    image: nginx:latest # Nginx 최신 이미지 사용
    ports:
      - "8080:80" # 외부의 8080 포트를 컨테이너의 80 포트와 연결
    depends_on:
      - db # db 컨테이너가 먼저 실행된 후 web이 실행되도록 설정
 
  db: # 데이터베이스 서비스 이름
    image: mysql:8.0 # MySQL 8.0 이미지 사용
    environment: # MySQL 실행에 필요한 환경 변수 설정
      MYSQL_ROOT_PASSWORD: mysecretpassword
      MYSQL_DATABASE: mydatabase
    volumes:
      - db_data:/var/lib/mysql # DB 데이터가 지워지지 않도록 볼륨 마운트
 
volumes:
  db_data: # 볼륨 정의

이 파일을 만들고 터미널에서 명령어 하나만 치면 설정된 웹 서버와 DB가 알아서 다운로드되고 서로 연결되어 실행됩니다.


4. 자주 쓰는 명령어

(주의: 최신 버전에서는 docker-compose 대신 하이픈이 없는 docker compose를 사용합니다.)

  • docker compose up -d
    • compose.yaml에 정의된 모든 컨테이너를 생성하고 실행합니다.
    • -d 옵션은 백그라운드에서 실행하라는 뜻입니다. (터미널을 꺼도 계속 실행됨)
  • docker compose down
    • 실행 중인 모든 컨테이너를 정지하고, 관련된 네트워크도 깔끔하게 삭제합니다.
  • docker compose ps
    • 현재 컴포즈로 실행 중인 컨테이너들의 상태를 확인합니다.
  • docker compose logs -f
    • 실행 중인 컨테이너들의 로그를 실시간으로 확인합니다.
  • docker compose build
    • 설정 파일에 이미지가 아닌 build:(Dockerfile 사용)가 설정되어 있을 때, 이미지를 새로 빌드합니다.

요약

도커 컴포즈는 “여러 개의 도커 컨테이너 설정명세서를 파일로 만들어 놓고, 필요할 때 스위치 하나 켜서(up) 시스템 전체를 작동시키고, 스위치 하나 꺼서(down) 전체를 종료하는 아주 편리한 도구”입니다.

Entities

추가 기록 (2026-05-22T14:33:35Z)

5. Docker Compose의 핵심 요소

docker-compose.yml 파일은 크게 세 가지 요소로 구성됩니다.

  1. Services (서비스): 실행할 각 컨테이너를 정의합니다. (예: web, db)
  2. Networks (네트워크): 컨테이너 간 통신을 위한 가상 네트워크를 정의합니다. 별도로 정의하지 않아도 Compose가 기본 네트워크를 자동 생성하여 같은 파일 내 서비스들을 묶어줍니다.
  3. Volumes (볼륨): 컨테이너 삭제 후에도 데이터를 유지하기 위한 저장소를 정의합니다. docker compose down 시 네트워크는 삭제되지만 볼륨은 기본적으로 삭제되지 않아 데이터가 안전하게 보존됩니다.

6. 추가 예시: WordPress + MySQL (서비스 이름 통신 활용)

아래는 WordPress와 MySQL을 연동하는 docker-compose.yml 예시입니다. 이 예시는 서비스 이름을 호스트명으로 사용하여 컨테이너 간 통신하는 방식을 잘 보여줍니다.

version: '3.8'
 
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: wp_password
 
wordpress:
    image: wordpress:latest
    ports:
      - "8000:80"
    environment:
      WORDPRESS_DB_HOST: db  # 서비스 이름 'db'를 호스트로 사용
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: wp_password
      WORDPRESS_DB_NAME: wordpress
 
volumes:
  db_data:

위 설정에서 WORDPRESS_DB_HOST: db는 Compose가 자동으로 생성한 네트워크 내에서 db 서비스의 컨테이너를 가리키므로, 복잡한 IP 설정 없이 서비스 이름만으로 데이터베이스에 연결할 수 있습니다.

참고: docker compose down과 볼륨 보존

docker compose down 명령어는 실행 중인 컨테이너와 네트워크를 종료·삭제하지만, 명시적으로 -v 옵션을 주지 않는 한 볼륨은 삭제되지 않습니다. 따라서 데이터베이스 데이터와 같은 중요한 정보는 컨테이너를 내려도 안전하게 유지됩니다.

Entities

추가 기록 (2026-05-22T14:51:32Z)

7. Docker Compose의 내부 동작 원리

Docker Compose는 Docker Engine의 기능들을 효율적으로 엮어주는 오케스트레이션 클라이언트 역할을 합니다. 내부적으로는 다음과 같은 기술과 개념을 기반으로 동작합니다.

7.1 Docker Engine API 클라이언트

  • Docker Compose는 Docker Engine API의 클라이언트입니다. docker compose up 명령 시 YAML 파일을 해석한 후 Docker Daemon(dockerd)에 REST API(주로 /var/run/docker.sock 유닉스 소켓)로 명령을 전달합니다.
  • 사용자가 직접 입력해야 할 복잡한 docker run 명령어들을 API 호출로 자동화해 줍니다.

7.2 선언적 IaC와 YAML

  • Compose는 YAML 파일에 원하는 상태를 선언(Declarative)하면, 현재 상태와 비교하여 필요한 작업만 수행합니다(멱등성 보장). 이는 셸 스크립트의 순차적 명령 방식과 대비됩니다.

7.3 네트워킹: CNM, Bridge, 내장 DNS

  • Compose는 프로젝트별로 독립적인 가상 브리지(Bridge) 네트워크를 자동 생성하여 컨테이너 간 통신을 격리합니다. 이는 Docker의 CNM(Container Network Model)을 기반으로 합니다.
  • 동일한 네트워크 내에서는 서비스 이름(예: db, web)을 호스트명처럼 사용할 수 있으며, Docker 내장 DNS 서버가 이를 해당 컨테이너의 IP로 해석해 줍니다.

7.4 구현 언어의 변화: Python에서 Go로

  • Compose V1 (docker-compose): Python으로 작성되어 별도의 Python 런타임이 필요했고 상대적으로 느렸습니다.
  • Compose V2 (docker compose, 현재 표준): Go 언어로 재작성되어 Docker CLI의 기본 플러그인으로 통합되었습니다. 실행 속도가 빠르고 OS 간 호환성이 향상되었습니다.

7.5 기반 Linux 커널 기술

Docker Compose로 실행되는 컨테이너는 결국 Linux 커널 기능 위에서 동작합니다.

  • Namespace: 프로세스, 네트워크, 마운트 등의 자원을 격리하여 독립된 환경을 제공합니다.
  • cgroups: 각 컨테이너의 CPU, 메모리 등 자원 사용량을 제한합니다.
  • UnionFS: 여러 이미지 레이어를 겹쳐 하나의 파일 시스템으로 사용하여 스토리지 효율과 빌드 시간을 절약합니다.

Entities