Docker Compose는 여러 컨테이너로 이뤄진 앱 스택을 YAML 파일 하나로 정의하고, 명령 하나로 띄우고 내리는 도구다. 길어지는 docker run 옵션을 선언형 파일로 옮긴 것이라 보면 된다.
# compose.yaml
services:
app:
image: node:22-alpine
command: sh -c "npm install && npm run dev"
working_dir: /app
ports: ["3000:3000"]
volumes: ["./:/app"]
environment:
DB_HOST: db
depends_on: [db]
db:
image: postgres:17
environment:
POSTGRES_PASSWORD_FILE: /run/secrets/db_password
volumes: ["pgdata:/var/lib/postgresql/data"]
secrets: [db_password]
volumes:
pgdata:
secrets:
db_password:
file: ./db_password.txtdocker compose up -d # 네트워크까지 자동 생성
docker compose logs -f app # 서비스 로그를 한 스트림으로
docker compose down # 컨테이너·네트워크 제거(볼륨은 남김, -v면 삭제)- 서비스 이름이 네트워크 별칭이 되어
db로 접속한다(컨테이너 네트워킹) - named volume은 최상위
volumes에 선언해야 한다(도커 볼륨과 바인드 마운트) depends_on은 시작 순서만 보장하고 DB가 접속을 받을 준비가 됐는지는 보장하지 않는다.healthcheck와condition: service_healthy를 함께 쓰거나 앱이 재시도하게 한다- 예전 문서의
version:키와docker-compose(하이픈) 명령은 구식이다. 지금은docker compose플러그인을 쓴다(2026 기준)
비밀값
environment에 비밀번호를 직접 쓰면 파일과 docker inspect에 그대로 남는다. 개발용이 아니라면 secrets로 파일을 마운트하고, 공식 이미지가 지원하는 *_FILE 변수로 읽는다.
선언한 상태를 맞춰 준다는 점에서 쿠버네티스 핵심 개념의 축소판이고, 운영 매니페스트를 git에서 읽어 로컬 compose를 만드는 식으로 GitOps와 엮기도 한다. 선언형 사고방식 자체는 선언형과 명령형 프로그래밍을 본다.
출처: Compose 애플리케이션 모델 · Compose 네트워킹 · 시작 순서 제어 · Compose에서 secrets 쓰기