docker container 간의 의존성이 있는 경우에는 실행 순서와 준비 상태를 보장해야 한다.
단순히 컨테이너를 순서대로 띄우고 싶다면
depends_on
서비스의 연결까지 보장하고 싶다면healthcheck와condition: service_healthy를 조합
depends_on은 컨테이너 간의 실행 순서를 정의해주는 옵션이다.
특정 컨테이너가 다른 컨테이너보다 먼저 실행되어야 할 때 사용한다.
services:
redis:
image: redis:latest
nginx:
image: nginx:latest
depends_on:
- redis # redis 컨테이너가 먼저 실행된 후 nginx가 실행된다.
docker compose는 의존 대상인 컨테이너의 프로세스가 시작되면 즉시 다음 컨테이너를 실행시킨다.
이 점으로 인해 데이터베이스와 같이 내부 초기화(데이터 로딩, 네트워크 연결 등) 시간이 필요한 프로세스는 Connection Refused 같은 에러가 발생될 수 있다.
(정말 단순하게 실행 순서만 보장한다)
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에서 사용되는 옵션은 다음과 같다.
unhealthy 상태로 변경retries를 차감하지 않음)depends_on에서 condition으로 설정할 수 있는 옵션은 크게 3가지로 구성되어 있다.
의존하는 컨테이너의 프로세스가 시작되면 즉시 다음 컨테이너를 실행
이 옵션은 condition을 별도로 명시하지 않았을 때의 기본 동작이며, 실제 서비스가 준비되었는지 보장하지 않는다.
의존하는 컨테이너의 healthcheck 결과가 healthy (준비 완료)가 될 때까지 기다린다.
이 옵션을 지정해야지만 Connection Refused와 같은 문제를 해결할 수 있다.
의존하는 컨테이너가 실행을 마치고 정상적으로 종료 (exit code 0)될 때까지 기다린다.
일회성 작업 (초기 데이터 삽입, 빌드 스크립트 등)들이 완전히 끝난 후에 메인 앱을 실행해야 할 때 사용한다.