현재 최신인 v2.39.3 Docker Compose는 컨테이너 여러 개를 한번에 관리하는 도구다. 웹서버, DB, Redis 이런 거 하나하나 띄우면서 명령어 치기 귀찮으니까 YAML 파일 하나에 정리해서 한방에 올리자는 거다.
왜 쓰는가?
docker run
여러 번 치면서 포트 번호 외우고 네트워크 설정 삽질하는 거 진짜 개짜증난다. 특히 신입이 와서 "이거 왜 안 돼요?" 소리 듣기 싫으면 Docker Compose 써라.
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: myapp
POSTGRES_PASSWORD: password
이거면 끝이다. docker compose up
치면 웹서버랑 PostgreSQL이 알아서 연결되서 뜬다.
실제로 어떻게 도움되는가?
프로젝트 클론받고 docker compose up
한 번이면 개발 환경 끝이다. "내 컴퓨터에서는 잘 됐는데"라는 개소리 이제 안 들어도 되고, 신입 와서 환경 설정으로 반나절 날려먹는 일도 없다.
DB 버전 바꾸고 싶으면 YAML에서 postgres:15
를 postgres:16
으로 바꾸고 다시 띄우면 끝이다. Redis 추가하고 싶으면 서비스 하나 더 추가하면 된다.
문제점도 존나 많다
메모리 개많이 먹는다. 특히 M1/M2 맥에서는 x86 이미지 쓰면 에뮬레이션 때문에 개느리다. ARM 이미지 쓰거나 Rosetta 설정 건드려라.
볼륨 마운트도 느리다. 특히 node_modules 같이 파일 많은 폴더는 정말 개느리다. 코드 수정했는데 반영되는 데 몇 초 걸리는 건 그냥 감수해야 한다. Mutagen 같은 파일 동기화 도구 써봤자 조금 나아질 뿐이다.
실제 사용 팁
depends_on
은 거짓말쟁이다. 컨테이너만 시작시키고 서비스 준비까지는 안 기다린다. PostgreSQL 컨테이너는 떴는데 아직 DB 초기화 중이면 웹서버가 연결 못하고 뒤진다. 이럴 때는 healthcheck 쓰거나 연결 재시도 로직 넣어라.
db:
image: postgres:15
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
retries: 5
이렇게 하면 DB가 진짜 준비될 때까지 기다린다.