Docker Compose Redis healthcheck 설정 - 앱 시작 순서 보장하기

문제

depends_on만 설정하면 Redis 컨테이너가 “시작”된 것만 보장하지, “준비”된 것은 보장하지 않는다. Redis가 아직 초기화 중인데 앱이 연결을 시도하면 Connection refused 에러가 발생한다.

해결

services:
  app:
    build: .
    depends_on:
      redis:
        condition: service_healthy  # healthy 상태일 때만 시작
    environment:
      - REDIS_URL=redis://redis:6379

  redis:
    image: redis/redis-stack:latest
    environment:
      - REDIS_ARGS=--maxmemory 512mb --maxmemory-policy allkeys-lru
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s
    volumes:
      - redis-data:/data
    deploy:
      resources:
        limits:
          memory: 768M

volumes:
  redis-data:

핵심 포인트

  • redis-cli pingPONG을 반환하면 healthy 상태가 된다. start_period: 30s는 컨테이너 시작 후 30초 동안은 실패해도 unhealthy로 표시하지 않는다.
  • --maxmemory-policy allkeys-lru는 메모리가 가득 차면 가장 오래된 키부터 자동 삭제한다. 캐시 용도라면 이 정책이 가장 무난하다.
  • deploy.resources.limits.memory로 Redis가 호스트 메모리를 다 먹는 것도 방지한다. maxmemory와 별개로 컨테이너 레벨에서도 제한을 걸어야 안전하다.