1. 개요
실제 서비스는 웹 서버 하나로만 돌아가지 않습니다. DB(MySQL)도 필요하고, 캐시(Redis)도 필요합니다.
만약 도커 컴포즈가 없다면 우리는 매번 이렇게 해야 합니다.
docker network create my-net(네트워크 만들기)docker run --network my-net --name db mysql...(DB 띄우기)docker run --network my-net --name app my-app...(앱 띄우기)
Docker Compose는 이 복잡한 과정과 옵션들을 yaml 파일 하나에 정의해두고, 실행 한 번으로 모든 컨테이너를 오케스트레이션(지휘)하는 도구입니다.
2. 전체 구조 요약 (Run vs Compose)
명령어로 칠 때는 매번 옵션을 기억해야 하지만, 컴포즈는 '문서(Code)'로 남습니다.
[ 기존 방식 (Imperative) ]
$ docker run -d -p 80:80 node-app
$ docker run -d -p 3306:3306 mysql
(옵션 까먹으면 접속 불가, 순서 꼬임)
vs
[ Docker Compose (Declarative) ]
docker-compose.yml 파일에 정의
├── web (node-app)
└── db (mysql)
↓
$ docker-compose up -d (끝!)
3. 구성 준비물
| 항목 | 설명 |
|---|---|
| Docker Desktop | 컴포즈가 기본 내장되어 있습니다. |
| docker-compose.yml | 컨테이너 설정을 담을 설정 파일 |
| VS Code | YAML 파일 편집을 위한 에디터 |
4. 단계별 구성 절차
4-1. docker-compose.yml 작성 (핵심 ⭐)
프로젝트 루트 경로에 docker-compose.yml 파일을 만들고 아래 내용을 작성합니다.
(예시: Node.js 웹 앱과 Redis 데이터베이스를 같이 띄우는 상황)
version: '3.8' # 컴포즈 파일 규격 버전
services: # 실행할 컨테이너들의 모음
my-app: # 서비스 이름 1 (웹 서버)
build: . # 현재 폴더의 Dockerfile로 빌드해서 써라
ports:
- "3000:3000"
depends_on: # 이게 다 켜져야 나를 켜라 (순서 보장)
- my-redis
my-redis: # 서비스 이름 2 (DB)
image: redis:alpine # 도커 허브 이미지를 그대로 사용
ports:
- "6379:6379"
4-2. 마법의 네트워크 (Magic DNS)
도커 컴포즈의 가장 큰 장점은 자동 네트워크 연결입니다.my-app 컨테이너 안에서 코드를 짤 때, Redis 접속 주소를 IP(192.168.x.x)가 아닌 서비스 이름(my-redis)으로 적으면 알아서 찾아갑니다.
// Node.js 코드 예시
const client = redis.createClient({
url: 'redis://my-redis:6379' // 서비스 이름이 곧 호스트명!
});
4-3. 실행 및 관리 명령어
이제 터미널에서 딱 한 줄만 입력하세요.
# 1. 모든 서비스 실행 (백그라운드)
docker-compose up -d
# 2. 실행 상태 확인
docker-compose ps
# 3. 로그 확인 (전체 컨테이너 로그가 섞여서 나옴)
docker-compose logs -f
# 4. 종료 및 삭제 (컨테이너, 네트워크 모두 정리)
docker-compose down
5. 실무 운영 꿀팁
5-1. 코드 수정 후 재배포 (--build)
docker-compose up은 이미지가 이미 있으면 새로 빌드하지 않습니다. 코드를 수정했다면 반드시 --build 옵션을 붙여야 합니다.
docker-compose up -d --build
5-2. DB 데이터 영구 저장 (Volumes)
컨테이너를 삭제(down)하면 DB 데이터도 날아갑니다. 이를 막기 위해 볼륨(Volume)을 설정해야 합니다.
my-db:
image: mysql:8.0
volumes:
- ./db_data:/var/lib/mysql # 내 컴퓨터 ./db_data 폴더와 동기화
5-3. 환경 변수 분리 (.env)
비밀번호 같은 민감한 정보는 docker-compose.yml에 직접 적지 말고 .env 파일로 빼세요.
[.env 파일]
MYSQL_PASSWORD=secret1234
[docker-compose.yml]
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
'개발 환경 | 도구 > Docker | 컨테이너' 카테고리의 다른 글
| [Kubernetes] 쿠버네티스가 너무 어렵다면? 초경량 MicroK8s(마이크로 k8s)로 입문하기 (0) | 2026.02.08 |
|---|---|
| [Docker] Dockerfile 작성법과 이미지 빌드(Build) 최적화 가이드 (0) | 2026.02.04 |
| [Docker] 도커 명령어 완전 정복 및 컨테이너 생명주기(Lifecycle) 관리 (0) | 2026.02.01 |
| [Docker] 도커(Docker)란? 가상머신과의 차이점 및 완벽 기초 개념 정리 (0) | 2026.01.28 |