도커 컴포즈
도커 컴포즈(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
추가 기록 (2026-05-22T14:33:35Z)
추가 예제: WordPress + MySQL
WordPress 블로그와 MySQL 데이터베이스를 함께 실행하는 compose.yaml 예제입니다. 서비스 이름을 호스트명처럼 사용하여 연결하는 패턴을 보여줍니다.
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 환경 변수를 통해 워드프레스 컨테이너가 db 서비스와 통신합니다. 도커 컴포즈가 자동 생성한 네트워크 덕분에 서비스 이름이 내부 DNS로 resolve되어 복잡한 IP 설정 없이 연결됩니다. 또한 volumes로 MySQL 데이터를 영구 보존하여 컨테이너 종료 후에도 데이터가 유지됩니다.
Entities
추가 기록 (2026-05-22T14:51:32Z)
기술적 기반
1. Docker Engine API와 추상화
Docker Compose는 Docker Engine API의 클라이언트(Client)로서 동작합니다. docker compose up 명령은 YAML 파일을 해석하여 Docker Daemon(dockerd)에게 REST API(주로 /var/run/docker.sock 유닉스 소켓 사용)로 컨테이너, 네트워크, 볼륨 생성을 자동 요청합니다. 이는 사용자가 직접 입력해야 하는 복잡한 docker run 명령어를 API 호출로 추상화해 주는 래퍼(Wrapper) 역할입니다.
2. IaC와 선언적 모델
YAML로 작성된 compose.yaml은 Infrastructure as Code(IaC)를 선언적(Declarative)으로 구현합니다. 순차적인 셸 스크립트와 달리 “원하는 상태”를 기술하면, Compose가 현재 상태와 비교하여 필요한 작업만 수행(멱등성)합니다.
3. 네트워킹: CNM과 내장 DNS
Compose는 프로젝트별로 독립된 가상 브리지 네트워크를 생성해 컨테이너 간 통신을 격리합니다. 동일 네트워크 안에서는 IP 주소 대신 서비스 이름(예: db, web)을 호스트명처럼 사용할 수 있으며, 이는 도커 엔진의 내장 DNS 서버(Embedded DNS)가 해석해 주기 때문입니다.
4. 볼륨과 데이터 지속성
Compose는 호스트 디렉토리나 Docker Named Volume을 컨테이너 내부에 연결하는 바인딩을 쉽게 설정할 수 있습니다. 컨테이너가 삭제되더라도 볼륨에 저장된 데이터는 유지되므로 데이터베이스 등의 상태를 안전하게 보존할 수 있습니다.
5. 구현 언어 변화: Python에서 Go로
- Compose V1 (
docker-compose) : Python으로 작성되어 별도 런타임이 필요했고 상대적으로 느렸습니다. - Compose V2 (
docker compose, 현재 표준) : Docker CLI와 동일한 Go 언어로 재작성되어 내장 플러그인 형태로 통합되었습니다. 실행 속도와 OS 간 호환성이 크게 향상되었습니다.
6. Linux 커널 기능
Docker Compose가 생성하는 컨테이너의 근간이 되는 기술:
- Namespace : 프로세스, 네트워크, 마운트 등 자원을 격리하여 독립된 환경처럼 보이게 함
- cgroups : 컨테이너(서비스)가 사용할 수 있는 CPU, 메모리 등의 자원 사용량을 제한
- UnionFS : 여러 이미지 레이어를 겹쳐 하나의 파일 시스템으로 사용하여 스토리지 효율성과 빌드 시간 절감