Docker Compose란?
Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구다.
기존 multi-container 환경에서는 각각의 container를 다루기 위한 커맨드가 필요했다.
| 기존 방식 | Docker Compose |
| 여러 개의 docker build 실행 | 하나의 구성 파일(docker-compose.yaml) |
| 여러 개의 docker run 명령 | 하나의 명령 (docker-compose up) |
| 긴 명령어를 매번 입력 | 설정을 파일로 저장하여 재사용 |
| 네트워크 수동 생성 | 자동으로 네트워크 생성 및 연결 |
Docker Compose의 역할이 아닌 것
- Dockerfile을 대체하는 것은 아니다.
- 이미지나 컨테이너를 대체하는 것은 아니다.
- 다수의 호스트에서 컨테이너를 관리하는 도구가 아니다. (단일 호스트 전용이다.)
Orchestration이란?
오케스트레이션은 여러 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화하는 것을 의미한다.
오케스트라에 비유하면
| 오케스트라 | 컨테이너 오케스트레이션 |
| 지휘자 | 오케스트레이션 도구 (Docker Compose, Kubernetes) |
| 악기 연주자들 | 개별 컨테이너들 |
| 악보 | 구성 파일 (docker-compose.yaml) |
| 연주 | 컨테이너 간 협력 동작 |
Docker Compose vs k8s
| Docker Compose | Kubernetes |
| 단일 호스트 | 다중 호스트 (클러스터) |
| 개발 환경에 적합 | 프로덕션 환경에 적합 |
| 간단한 설정 | 복잡하지만 강력한 기능 제공 |
| 자동 복구 없음 | 자동 복구, 스케일링 지원 |
docker-compose.yaml 구조
기존 프로젝트 구조
.
├── backend
│ ├── app.js
│ ├── Dockerfile
│ ├── logs
│ │ └── access.log
│ ├── ...
├── env
│ ├── backend.env
│ └── mongo.env
└── frontend
├── Dockerfile
├── ...
└── src
├── App.js
├── components
...
docker-compose.yaml을 프로젝트의 최상위 폴더에 만든 뒤 아래와 같이 만든다.
version: "3.8" # Compose 사양 버전
services: # 컨테이너 정의
mongodb: # 서비스 이름
image: 'mongo'
volumes:
- data:/data/db
environment:
MONGO_INITDB_ROOT_USERNAME: max
MONGO_INITDB_ROOT_PASSWORD: secret
backend:
build: ./backend # Dockerfile 위치
ports:
- '80:80'
volumes:
- logs:/app/logs
- ./backend:/app # 바인드 마운트 (상대경로도 가능하다)
- /app/node_modules
env_file:
- ./env/backend.env
depends_on:
- mongodb # mongodb가 먼저 시작된다. 의존성을 부여하는 것
frontend:
build: ./frontend
ports:
- '3000:3000'
volumes:
- ./frontend/src:/app/src
stdin_open: true # -i 플래그
tty: true # -t 플래그
depends_on:
- backend
volumes: # 명명된 볼륨은 여기에 선언하는 것이 필수다.
data:
logs:
주요 설정 옵션
1. 이미지 설정
# 방법 1: 기존 이미지 사용
image: 'mongo'
# 방법 2: Dockerfile로 빌드
build: ./backend
# 방법 3: 빌드 상세 설정
build:
context: ./backend
dockerfile: Dockerfile-dev
args:
some-arg: value
2. 볼륨 설정
- 명명된 볼륨만 최상위 volumnes: 키에 선언하는 것이 필요하다.
volumes:
- data:/data/db # 명명된 볼륨
- ./backend:/app # 바인드 마운트 (상대경로!)
- /app/node_modules # 익명 볼륨
3. 환경 변수 설정
# 방법 1: 직접 지정
environment:
MONGO_USERNAME: max
MONGO_PASSWORD: secret
# 방법 2: 파일로 분리
env_file:
- ./env/backend.env
4. 네트워크
- 별도 지정하는 과정이 불필요하다.
- Docker Compose가 자동으로 네트워크 생성 후 모든 서비스 연결
- 서비스 이름(mongodb, backend 등)으로 컨테이너 간 통신 가능
명령어 정리
| docker-compose up | 모든 서비스 시작 (attached 모드) |
| docker-compose up -d | detached 모드로 시작 |
| doker-compose up --build | 이미지 강제 재빌드 후 시작 |
| docker-compose down | 모든 서비스 중지 및 컨테이너 삭제 |
| docker-compose down -v | 볼륨까지 함께 삭제 |
| docker-compose build | 이미지만 빌드 (시작은 안 함) |
자동으로 처리되는 것들
Docker Compose 사용 시 명시하지 않아도 자동 처리 되는 기능들은 아래와 같다.
| -d (detached) | 'up -d'로 간단히 지정 |
| --rm | 서비스 중지 시 자동 삭제 |
| --network | 자동 생성 및 연결 |
| 긴 절대 경로 | 상대 경로 사용 가능 |
컨테이너 이름 규칙
- {프로젝트폴더}_{서비스명}_{번호}
- etc: docker-complete_backend_1
커스텀 이름 지정
services:
mongodb:
container_name: mongodb # 원하는 이름 지정
전체 Workflow 비교
Before
docker network create goals-net
docker run -d --name mongodb --network goals-net -v data:/data/db -e MONGO_INITDB_ROOT_USERNAME=max mongo
docker build -t goals-node ./backend
docker run -d --name goals-backend --network goals-net -v logs:/app/logs -v $(pwd)/backend:/app -p 80:80 goals-node
docker build -t goals-react ./frontend
docker run -d --name goals-frontend -p 3000:3000 -it goals-react
# 종료 시 각각 stop, rm 필요...
After (Docker Compose)
docker-compose up -d
docker-compose down
참고: k8s vs Docker Compose
| 기능 | Docker Compose | Kubernetes |
| 호스트 | 단일 호스트 | 다중 호스트(클러스터) |
| 용도 | 개발/테스트 환경 | 프로덕션 환경 |
| 자동 복구 | 없음 | 컨테이너 죽으면 자동으로 재시작 |
| 자동 스케일링 | 없음 | 트래픽 따라 컨테이너 수 조절 |
| 로드 밸런싱 | 기본 제공 안 됨 | 내장됨 |
| 롤링 업데이트 | 수동 | 무중단 배포 지원 |
| 설정 복잡도 | YAML 1개 | 여러개의 YAML 설정 |
반응형
'Infra > Docker' 카테고리의 다른 글
| Container의 근반이 되는 기술에 대해 알아보자(완) UnionFS (0) | 2025.12.11 |
|---|---|
| Container의 근반이 되는 기술에 대해 알아보자(2) cgroup (0) | 2025.12.11 |
| Container의 근반이 되는 기술에 대해 알아보자(1) namespace (0) | 2025.12.11 |
| 도커(Docker)로 PHP / Laravel 개발 환경 구축하기 (0) | 2025.12.08 |
| Utility Docker에 대해 알아보자 (0) | 2025.12.07 |