DockerCompose와 멀티컨테이너

depends_on과 healthcheck

Compose에서 서비스 시작 순서를 제어하되, 실행 순서와 준비 완료 상태는 다르다는 점을 healthcheck와 함께 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

yaml
services:
  web:
    build: .
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5

설명

  • depends_on은 서비스 생성과 시작 순서를 제어하지만, 짧은 문법만으로는 "완전히 준비됨"까지 보장하지 않습니다.
  • 예를 들어 DB 컨테이너가 실행 상태가 되었더라도, 실제 쿼리를 받을 준비는 아직 안 됐을 수 있습니다.
  • 이때 healthcheckcondition: service_healthy를 함께 쓰면, 의존 서비스가 건강 상태를 만족한 뒤 다음 서비스가 시작되게 만들 수 있습니다.
  • 따라서 "실행 중"과 "준비 완료"를 구분하는 감각이 멀티컨테이너에서 중요합니다.
  • 운영뿐 아니라 로컬 개발에서도 이 차이를 잡아 주면, 앱이 먼저 켜졌다가 DB 연결 실패로 바로 죽는 문제를 줄일 수 있습니다.

짧은 예제

text
문제:
- app와 db를 같이 올렸더니
- db는 컨테이너가 떴지만 아직 준비 전
- app가 먼저 접속해 실패

개선:
- db에 healthcheck 추가
- app는 service_healthy를 기다리게 설정

빠른 정리

항목의미
depends_on의존 서비스의 시작 순서를 정의
service_started컨테이너가 시작됐는지만 확인
service_healthyhealthcheck 통과까지 기다림
healthcheck준비 상태를 판정하는 명령
핵심 구분실행 중과 준비 완료는 다름

주의할 점

depends_on만 넣고 안심하면 안 됩니다. 특히 DB, 캐시, 메시지 큐처럼 준비 시간이 있는 서비스는 healthcheck까지 같이 설계해야 실제 실패를 줄일 수 있습니다.

참고 링크

2 sources