[Docker] container 간 완벽한 의존성 보장하기

alirz-pixel·2026년 1월 8일

backend

목록 보기
11/11

docker container 간의 의존성이 있는 경우에는 실행 순서준비 상태를 보장해야 한다.

단순히 컨테이너를 순서대로 띄우고 싶다면 depends_on
서비스의 연결까지 보장하고 싶다면 healthcheckcondition: service_healthy를 조합

Depends_on

depends_on은 컨테이너 간의 실행 순서를 정의해주는 옵션이다.
특정 컨테이너가 다른 컨테이너보다 먼저 실행되어야 할 때 사용한다.

services:
  redis:
    image: redis:latest
    
  nginx:
    image: nginx:latest
    depends_on:
      - redis # redis 컨테이너가 먼저 실행된 후 nginx가 실행된다.

docker compose는 의존 대상인 컨테이너의 프로세스가 시작되면 즉시 다음 컨테이너를 실행시킨다.
이 점으로 인해 데이터베이스와 같이 내부 초기화(데이터 로딩, 네트워크 연결 등) 시간이 필요한 프로세스는 Connection Refused 같은 에러가 발생될 수 있다.

(정말 단순하게 실행 순서만 보장한다)

Healthcheck

healthcheck는 컨테이너 내부의 서비스가 실제로 요청을 처리할 준비가 되었는지 확인할 때 사용한다.
이러한 점으로 depends_on과 함께 사용하면, 컨테이너의 상태가 healthy로 변경된 시점을 확인하여 의존성을 완벽하게 보장할 수 있게된다.

예시

services:
  redis:
    image: redis:latest
    healthcheck: # 5초마다 redis ping 테스트를 총 5번 진행  (timeout 3초)
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 5
      start_period: 30s
    
  app:
    build: .
    depends_on:
      redis:
        condition: service_healthy # redis가 healthy 상태가 될 때까지 실행 대기

설정 옵션

healthcheck에서 사용되는 옵션은 다음과 같다.

  • test: 상태를 결정할 명렁어 (성공 시 0, 실패 시 1 반환)
  • interval: 검사를 수행할 주기
  • timeout: 설정한 시간 안에 응답이 없으면 실패로 간주
  • retries: 연속으로 실패한 경우 unhealthy 상태로 변경
  • start_period: 컨테이너 부팅 직후, 초기화를 위해 검사 실패를 무시하는 유예 기간
    (이 시간동안 retries를 차감하지 않음)

condition

depends_on에서 condition으로 설정할 수 있는 옵션은 크게 3가지로 구성되어 있다.

service_started (기본값)

의존하는 컨테이너의 프로세스가 시작되면 즉시 다음 컨테이너를 실행
이 옵션은 condition을 별도로 명시하지 않았을 때의 기본 동작이며, 실제 서비스가 준비되었는지 보장하지 않는다.

service_healthy

의존하는 컨테이너의 healthcheck 결과가 healthy (준비 완료)가 될 때까지 기다린다.
이 옵션을 지정해야지만 Connection Refused와 같은 문제를 해결할 수 있다.

service_completed_successfully

의존하는 컨테이너가 실행을 마치고 정상적으로 종료 (exit code 0)될 때까지 기다린다.
일회성 작업 (초기 데이터 삽입, 빌드 스크립트 등)들이 완전히 끝난 후에 메인 앱을 실행해야 할 때 사용한다.

0개의 댓글