← 전체 글로 돌아가기

Docker

Docker 컨테이너가 살아 있는데 서비스는 죽어 있던 healthcheck 비교

프로세스 존재와 실제 요청 가능 상태를 나눠 Docker healthcheck를 설계한 비교 노트다

Up이라는 표시를 잘못 읽었다

서버에서 docker ps를 확인했을 때 컨테이너는 Up이었다. 그런데 프록시는 502를 계속 반환했다. 프로세스가 멈춘 것이 아니라 내부 작업만 막힌 상황이라 컨테이너는 종료되지 않았다.

두 점검 방법을 나눴다

프로세스 확인은 주 프로세스가 존재하는지만 보여준다. HTTP healthcheck는 포트를 열고 실제 응답을 만들 수 있는지 확인한다.

HEALTHCHECK --interval=30s --timeout=3s --start-period=20s --retries=3 \
  CMD wget -qO- http://127.0.0.1:3000/health || exit 1

health 엔드포인트는 외부 결제 API까지 부르지 않는 가벼운 검사로 만들었다. DB가 꼭 필요한 서비스라면 준비 상태용 ready 검사를 별도로 둔다.

실제 확인 명령

docker inspect --format '{{json .State.Health}}' app | python3 -m json.tool
docker compose ps
curl -fsS http://127.0.0.1:3000/health

검사 주기를 5초에서 30초로 늘리고 프록시 오류율과 검사 실패를 한 알림으로 묶었다. 짧은 장애 때 로그가 너무 시끄러웠기 때문이다.

선택 기준

  • 프로세스 존재만 필요하면 기본 상태로 충분하다.
  • 트래픽 수신 가능 여부는 HTTP 또는 TCP로 확인한다.
  • 시작이 오래 걸리면 start-period를 둔다.
  • 검사 명령 자체가 부하를 만들지 않아야 한다.

컨테이너가 살아 있다는 문장을 서비스가 정상이라는 문장으로 번역하지 않기로 했다.