실제 서비스를 운영하다 보면 하나의 컨테이너만 사용하는 경우는 거의 없습니다.
예를 들어 웹 서비스 하나를 운영한다고 해도 다음과 같이 여러 개의 컨테이너가 필요합니다.
- Nginx
- Spring Boot 또는 Node.js
- MySQL
- Redis
이들을 하나씩 실행하면 매우 번거롭습니다.
Docker Compose는 이러한 문제를 해결하기 위해 등장했습니다.
이번 글에서는 Docker Compose의 개념부터 docker-compose.yml 작성법, 여러 컨테이너를 동시에 실행하는 방법, 실무에서 가장 많이 사용하는 명령어까지 자세히 알아보겠습니다.
Docker Compose란?
Docker Compose는 여러 개의 Docker 컨테이너를 하나의 설정 파일로 관리하는 도구입니다.
모든 컨테이너의 설정을 docker-compose.yml 파일에 작성한 뒤 한 번의 명령으로 실행할 수 있습니다.
구조는 다음과 같습니다.
docker-compose.yml
↓
docker compose up
↓
Nginx
MySQL
Redis
Application
복잡한 서비스를 간단하게 관리할 수 있는 것이 가장 큰 장점입니다.
Docker Compose가 필요한 이유
Docker만 사용할 경우
docker run nginx
docker run mysql
docker run redis
docker run node
처럼 여러 명령을 각각 실행해야 합니다.
Docker Compose를 사용하면
docker compose up
명령 한 줄이면 모든 컨테이너가 동시에 실행됩니다.
docker-compose.yml이란?
Compose 설정을 저장하는 파일입니다.
YAML 형식을 사용합니다.
파일 구조는 다음과 같습니다.
services:
...
모든 서비스는 services 아래에 정의됩니다.
가장 간단한 Compose 예제
services:
nginx:
image: nginx
실행
docker compose up
Nginx 컨테이너가 생성됩니다.
웹 서버와 데이터베이스 함께 실행
다음은 Nginx와 MySQL을 동시에 실행하는 예제입니다.
services:
nginx:
image: nginx
ports:
- "80:80"
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: password
실행하면 두 개의 컨테이너가 함께 생성됩니다.
Compose 주요 구성 요소
가장 많이 사용하는 옵션은 다음과 같습니다.
- image
- build
- ports
- volumes
- environment
- networks
- depends_on
- restart
실무에서도 대부분 이 항목을 중심으로 작성합니다.
image
기존 이미지를 사용할 경우
services:
nginx:
image: nginx:1.27
Docker Hub에서 이미지를 다운로드합니다.
build
직접 Dockerfile을 빌드합니다.
services:
app:
build: .
또는
services:
app:
build:
context: .
dockerfile: Dockerfile
프로젝트를 직접 빌드할 때 사용합니다.
ports
호스트와 컨테이너 포트를 연결합니다.
ports:
- "8080:80"
의미
Host
8080
↓
Container
80
volumes
데이터를 영구 저장합니다.
volumes:
- ./data:/var/lib/mysql
컨테이너가 삭제되어도 데이터는 유지됩니다.
environment
환경 변수를 지정합니다.
environment:
MYSQL_ROOT_PASSWORD: password
또는
environment:
NODE_ENV: production
애플리케이션 설정에 자주 사용됩니다.
depends_on
서비스 실행 순서를 지정합니다.
depends_on:
- mysql
애플리케이션보다 MySQL을 먼저 실행합니다.
단, 서비스가 완전히 준비될 때까지 기다려주는 것은 아니므로 애플리케이션에서 재시도 로직이나 헬스체크를 함께 사용하는 것이 좋습니다.
restart
자동 재시작 정책입니다.
restart: always
또는
restart: unless-stopped
운영 환경에서는 자주 사용됩니다.
전체 예제
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
실무에서도 비슷한 형태로 많이 사용합니다.
Compose 실행
모든 컨테이너 실행
docker compose up
백그라운드 실행
docker compose up -d
실무에서는 대부분 -d 옵션을 사용합니다.
실행 중인 서비스 확인
docker compose ps
실행 중인 모든 Compose 서비스를 확인할 수 있습니다.
로그 확인
전체 로그
docker compose logs
실시간 로그
docker compose logs -f
특정 서비스만 확인
docker compose logs mysql
컨테이너 종료
docker compose stop
컨테이너는 남아 있습니다.
컨테이너 종료 및 삭제
docker compose down
컨테이너와 네트워크가 삭제됩니다.
볼륨까지 삭제하려면
docker compose down -v
를 사용합니다.
서비스 재시작
docker compose restart
특정 서비스만 재시작
docker compose restart mysql
설정 파일 검증
Compose 파일 문법을 확인합니다.
docker compose config
YAML 문법 오류를 찾을 때 매우 유용합니다.
실무에서 자주 사용하는 명령어
Compose 실행
docker compose up -d
서비스 확인
docker compose ps
로그 보기
docker compose logs -f
서비스 중지
docker compose stop
서비스 삭제
docker compose down
볼륨 삭제
docker compose down -v
설정 확인
docker compose config
실무 사례
예를 들어 쇼핑몰 서비스를 운영한다고 가정해 보겠습니다.
필요한 구성은 다음과 같습니다.
- Nginx
- Spring Boot
- MySQL
- Redis
운영자는 docker-compose.yml에 모든 서비스를 정의합니다.
이후 새로운 서버에서는 다음 명령만 실행하면 됩니다.
docker compose up -d
Docker Compose는 필요한 이미지를 자동으로 다운로드하고, 네트워크를 생성하며, 모든 컨테이너를 실행합니다.
서비스를 업데이트할 때도 Compose 파일만 수정하면 되므로 유지보수가 훨씬 쉬워집니다.
자주 묻는 질문
Docker Compose와 Docker의 차이는 무엇인가요?
Docker는 개별 컨테이너를 관리하는 도구이고, Docker Compose는 여러 컨테이너를 하나의 프로젝트로 묶어 관리하는 도구입니다.
docker-compose.yml과 compose.yaml은 같은 것인가요?
기능은 같습니다. 최신 Docker에서는 compose.yaml 또는 compose.yml 사용도 지원하며, 기존의 docker-compose.yml도 계속 널리 사용되고 있습니다.
운영 환경에서도 Docker Compose를 사용하나요?
네. 중소규모 서비스나 개발·테스트 환경에서는 많이 사용됩니다. 다만 대규모 서비스에서는 Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼을 사용하는 경우가 많습니다.
마무리
Docker Compose는 여러 개의 컨테이너를 하나의 설정 파일로 관리할 수 있게 해주는 매우 강력한 도구입니다. 웹 서버, 애플리케이션, 데이터베이스, 캐시 서버 등을 함께 실행하고 관리할 수 있어 개발과 운영의 효율성을 크게 높여줍니다. Docker를 실무에 활용하려면 Compose 사용법은 반드시 익혀두는 것이 좋습니다.