[Docker] Healthcheck 설정을 통한 컨테이너 상태 점검

healthcheck 설정은 컨테이너가 healthy 상태인지 여부를 확인하기 위해 사용합니다. 컨테이너의 상태를 확인하는 방법을 정의하여 주기적으로 작동 중인지 검사합니다.

 

기본 설정

nginx 컨테이너 이미지를 사용하여 웹 서비스를 구동시키고 healthcheck 옵션을 추가하여 상태를 확인해봅시다.

httpd 컨테이너 이미지를 사용하고자 하였으나 컨테이너에 curl 등 확인 명령어가 없어 nginx 컨테이너 이미지를 사용하였습니다.

# cat docker-compose.yml
services:
  nginx:
    image: nginx:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    healthcheck:
      test: curl -f http://localhost:80 || exit 1

healthcheck 옵션을 사용하지 않으면 disable: true 옵션이 적용되어 별도로 healthcheck 옵션은 동작하지 않습니다.

 

 

nginx 서비스를 구동시킨 후 docker ps 명령어로 컨테이너 상태를 확인해보면 healthcheck 옵션을 추가하지 않은 것과 달리 STATUS 에 (health: {STATUS}) 항목이 추가된 것을 확인하실 수 있습니다.

# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                             PORTS                               NAMES
b91ed9482b75   nginx:latest   "/docker-entrypoint.…"   30 seconds ago   Up 26 seconds (health: starting)   0.0.0.0:80->80/tcp, :::80->80/tcp   my-web-server

 

healthcheck 를 통해 정상을 확인한 후 health 상태가 starting 에서 healthy로 변경된 것을 확인하실 수 있습니다.

# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                   PORTS                               NAMES
b91ed9482b75   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes (healthy)   0.0.0.0:80->80/tcp, :::80->80/tcp   my-web-server

healthcheck 옵션을 통해 상태 검사를 시작하면 starting 상태이며 이후 상태 검사를 통과할 때마다 healthy 상태가 됩니다. 일정 횟수를 실패한 후에는 unhealthy 상태로 변경되며 총 3가지의 상태가 존재합니다.

 

옵션 설정

healthcheck 옵션을 통해 검사를 진행하는 주기와 시간 등을 설정할 수 있습니다. 기본 설정은 아래와 같이 적용되며 각각의 설정 값을 설정하여 상황에 따른 설정을 적용할 수 있습니다.

 

서비스의 특성에 따라 검사 주기(interval)을 짧게 설정할 수도 있고, 반대로 네트워크가 안정적이지 않은 환경에서는 재시도(retries) 횟수나 타임아웃(timeout) 시간을 늘려서 설정할 수도 있습니다.

[ healthcheck 옵션 ]
--interval=DURATION (default: 30s)
--timeout=DURATION (default: 30s)
--start-period=DURATION (default: 0s)
--retries=N (default: 3)
// start_period 옵션은 3.4 버전에 추가되었습니다.

 

healthcheck 옵션을 아래와 같이 추가하였으며 10초마다 검사하도록 설정하고 10초간 응답이 없으면 타임아웃, 그리고 2회 재시도해도 응답이 없으면 unhealthy 상태가 되도록 설정하였습니다.

# cat docker-compose.yml
services:
  nginx:
    image: nginx:latest
    container_name: "my-web-server"
    ports:
      - "80:80"
    healthcheck:
      test: curl -f http://localhost:80 || exit 1
      interval: 10s
      timeout: 10s
      retries: 2

10초마다 검사하도록 설정하였으므로 docker-compose up -d 명령어로 컨테이너 시작 후 starting 상태에서 healthy 까지 기본 설정(30초)가 아닌 10초가 경과한 이후에 상태가 변경되는 것을 확인하실 수 있습니다.

 

Health 상태 상세 확인

docker inspect 명령어는 도커 컨테이너의 정보 및 상태를 확인할 수 있는 명령어로 healthcheck 옵션을 통한 검사 결과를 확인하실 수 있습니다.

# docker inspect my-web-server
====================== 생략 ======================
"Health": {
  "Status": "healthy",
  "FailingStreak": 0,
  "Log": [
    {
      "Start": "2022-10-19T22:42:46.673233+09:00",
      "End": "2022-10-19T22:42:46.807225+09:00",
      "ExitCode": 0,
      "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n
      ====== 생략 ======
    }

상태 정보는 healthy이고 실패 횟수(FailingStreak)가 0 값인 것을 확인하실 수 있습니다. 또한 검사 명령어를 요청한 시간과 응답 시간, 응답 값 등을 확인하실 수 있습니다.

 

healthcheck 설정을 통해 컨테이너의 상태를 검사하여 사용해보시기 바랍니다.

'Docker' 카테고리의 다른 글

[Docker] Logging 설정  (0) 2022.11.07
[Docker] Syslog 서버 구축  (0) 2022.11.01
[Docker] Volumes 설정  (0) 2022.10.11
[Docker] Restart 설정  (0) 2022.09.20
[Docker] Container name 설정  (0) 2022.09.19

+ Recent posts