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를 둔다.
- 검사 명령 자체가 부하를 만들지 않아야 한다.
컨테이너가 살아 있다는 문장을 서비스가 정상이라는 문장으로 번역하지 않기로 했다.