설명
컨테이너의 프로세스가 실행 중이어도 서비스가 요청을 처리하지 못할 수 있습니다. 적절한 상태 점검이 없으면 이런 장애를 늦게 발견할 수 있습니다. Dockerfile의 HEALTHCHECK는 컨테이너 상태를 healthy 또는 unhealthy로 표시하는 데 사용할 수 있습니다.
상태가 unhealthy가 된다고 Docker가 자동으로 컨테이너를 재시작하는 것은 아닙니다. Kubernetes에서는 이미지의 HEALTHCHECK 대신 필요한 liveness, readiness, startup 프로브를 별도로 구성해야 합니다.
잠재적 영향
- 응답하지 않는 서비스가 실행 중인 것으로만 보일 수 있습니다.
- 잘못 설계한 점검이나 지나치게 짧은 제한 시간은 정상 서비스를 비정상으로 판단하게 할 수 있습니다.
해결 방법
- 배포 환경이 사용하는 상태 점검을 구성하고 실제 서비스의 준비 상태나 정상 동작을 확인하도록 설계하세요.
- 점검 명령이 이미지 안에서 실행 가능한지 확인하고 시작 시간, 제한 시간과 실패 기준을 조정하세요. 상태에 따른 트래픽 제어와 복구 동작도 별도로 확인하세요.
예시
빌드 컨텍스트에 package.json, 잠금 파일과 server.js가 필요합니다. 변경 후 예제는 /health가 정상일 때 HTTP 200을 반환한다고 가정하며, Node 내장 HTTP 모듈을 사용합니다.
변경 전
dockerfile
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm ci
EXPOSE 3000
CMD ["node", "server.js"]
변경 후
dockerfile
FROM node:22-alpine
WORKDIR /app
COPY . .
RUN npm ci
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=5s CMD node -e "require('http').get('http://127.0.0.1:3000/health', r => process.exit(r.statusCode === 200 ? 0 : 1)).on('error', () => process.exit(1))"
CMD ["node", "server.js"]
설명:
- 변경 전: 이 Dockerfile에는 상태 점검이 선언되어 있지 않습니다. 배포 환경의 별도 점검도 확인해야 합니다.
- 변경 후: 30초마다 /health를 확인하며 응답 코드가 200이 아니거나 연결이 실패하면 점검 실패로 처리합니다. Docker가 명령에 5초 제한 시간을 적용합니다.