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. 도커 컴포즈의 핵심 장점
- 단일 명령어로 제어:
docker compose up이라는 명령어 하나로 여러 개의 컨테이너를 순서에 맞게 한 번에 실행할 수 있습니다. - 설정 파일 기반(YAML): 실행 옵션들을 YAML 파일에 코드로 저장하기 때문에 (Infrastructure as Code), 명령어를 외울 필요가 없고 다른 팀원과 공유하거나 버전 관리를 하기 좋습니다.
- 독립된 네트워크 자동 생성: 같은
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 -dcompose.yaml에 정의된 모든 컨테이너를 생성하고 실행합니다.-d옵션은 백그라운드에서 실행하라는 뜻입니다. (터미널을 꺼도 계속 실행됨)
docker compose down- 실행 중인 모든 컨테이너를 정지하고, 관련된 네트워크도 깔끔하게 삭제합니다.
docker compose ps- 현재 컴포즈로 실행 중인 컨테이너들의 상태를 확인합니다.
docker compose logs -f- 실행 중인 컨테이너들의 로그를 실시간으로 확인합니다.
docker compose build- 설정 파일에 이미지가 아닌
build:(Dockerfile 사용)가 설정되어 있을 때, 이미지를 새로 빌드합니다.
- 설정 파일에 이미지가 아닌
요약
도커 컴포즈는 “여러 개의 도커 컨테이너 설정명세서를 파일로 만들어 놓고, 필요할 때 스위치 하나 켜서(up) 시스템 전체를 작동시키고, 스위치 하나 꺼서(down) 전체를 종료하는 아주 편리한 도구”입니다.
Entities
- Docker Compose
- YAML
- Container
- docker compose up
- docker compose down
- Nginx
- MySQL
- Infrastructure as Code
- Docker
- Service
추가 기록 (2026-05-22T14:33:35Z)
5. Docker Compose의 핵심 요소
docker-compose.yml 파일은 크게 세 가지 요소로 구성됩니다.
- Services (서비스): 실행할 각 컨테이너를 정의합니다. (예:
web,db) - Networks (네트워크): 컨테이너 간 통신을 위한 가상 네트워크를 정의합니다. 별도로 정의하지 않아도 Compose가 기본 네트워크를 자동 생성하여 같은 파일 내 서비스들을 묶어줍니다.
- 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
- Docker Compose
- Docker
- YAML
- WordPress
- MySQL
- Container
- Docker Service
- Docker Network
- Docker Volume
- docker-compose.yml
추가 기록 (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: 여러 이미지 레이어를 겹쳐 하나의 파일 시스템으로 사용하여 스토리지 효율과 빌드 시간을 절약합니다.