ตรวจสุขภาพ Container Docker


ทั้งนี้เป็นการสรุปจากการแปล ภาษาอังกฤษ แบบ งูๆปลาๆ และการทดลองทำเบี้องต้น

HealthCheck

เป็นฟีเจอร์ที่มีมาใน Version 1.12 สำหรับตรวจเช็ค สถานะของ container ว่า สามารถทำงานได้ปกติอย่างที่้องการได้มั้ย

ทำ ทำไม?

จุดประสงค์ในการทำ Health Check เพื่อเป็นการตรวจเช็คว่า container ของเราที่ มี พร้อมที่จะใช้งานหรือตรงตามที่เรา ต้องการให้เป็นหรือยัง

ตัวอย่างการใช้ health-check cmd

# dockerfile
HEALTHCHECK [OPTIONS] CMD command
---
# run
$ docker run -d --health-cmd "xxx" <image>

Default Option เมื่อสั่งใช้คำสั่ง

  • --interval=DURATION (default: 30s)
  • --timeout=DURATION (default: 30s)
  • --start-period=DURATION (default: 0s)
  • --retries=N (default: 3)

1). ทำการตรวจเช็คแบบ Healthly

$ docker run -d --health-cmd "curl localhost:80 || exit 0" nginx
...
8a6f8ff6d43b531d38f26ca75d42259ca3289c2115ad0fd8c5a3f07c416e90a3
$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                           PORTS               NAMES
803fb63c88c0        nginx               "/docker-entrypoint.…"   2 seconds ago       Up 1 second (health: starting)   80/tcp              affectionate_nash

จะเห็นได้ ว่าตรง status จะมี (health: starting) ขึ้นมา เป็นการแสดงสถานะ ว่า กำลัง start จนกระทั่งมันทำการตรวจเสร็จ จะขึ้นประมาณนี้

$ docker ps 
...
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS               NAMES
803fb63c88c0        nginx               "/docker-entrypoint.…"   54 seconds ago      Up 54 seconds (healthy)   80/tcp              affectionate_nash

สถานะจะเป็น heathly ซึ่งหมายความว่า สุขภาพของ container เราปกติดี เมื่อทำการ run


ที่นี้ จะทำให้ผิดปกติ

2). ทำการตรวจเช็คแบบ Unhealthy

$ docker run -d --health-cmd "curl localhost:8888 || exit 1" nginx
...
1452cf0ed834cba5b02af7238afccb21344be6c76b8ff48c53eeede6c50ea253
$ docker ps
...
ONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
1452cf0ed834        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes (unhealthy)   80/tcp              elegant_hellman

จะเห็นได้ว่าสถานะของ container จะเป็น unhealthy


ผลลัพท์

จาก ตัวอย่าง ข้างบน

การทดสอบ คาดหวัง ผลลัพธ์
:80 exit 1 Healthly
:80 exit 0 Healthly
:8888 exit 1 Unhealthly
:8888 exit 0 Healthly
$ docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
a253d8aa4869        nginx               "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes (unhealthy)   80/tcp              nginx-fail-exit1
d441c55846c5        nginx               "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes (healthy)     80/tcp              nginx-fail-exit0
4501c66db801        nginx               "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes (healthy)     80/tcp              nginx-exit1
23379ff63940        nginx               "/docker-entrypoint.…"   6 minutes ago       Up 6 minutes (healthy)     80/tcp              nginx-exit0

ทั้งนี้สามารถทำได้ตั้งแต่ Dockerfile

FROM nginx

HEALTHCHECK CMD curl -f http://localhost/ || exit 1
$ docker build -t hc .
$ docker run -d --name nginx1 hc
...
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                        PORTS               NAMES
59e713c80bf1        hc                  "/docker-entrypoint.…"   About a minute ago   Up About a minute (healthy)   80/tcp              nginx1

เพิ่มเติม Dockerfile reference | Docker Documentation


สามารถ เช็คด้วย docker inspect

$ docker inspect --format="{{json .State.Health}}" nginx1 | jq
...
{
  "Status": "healthy",
  "FailingStreak": 0,
  "Log": [
    {
      "Start": "2020-08-07T04:27:05.5602603Z",
      "End": "2020-08-07T04:27:05.6799436Z",
      "ExitCode": 0,
      "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\
r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100   612  100   612    0     0  87428      0 --:--:-- --:--:-- --:--<!DOCTYPE html>\n<html>\n<he
ad>\n<title>Welcome to nginx!</title>\n<style>\n    body {\n        width: 35em;\n        margin: 0 auto;\n        font-family: Tahoma, Verdana, Arial, sans-serif;\n    }\n</styl
e>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<
p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx
.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n:--   99k\n"
    },
    {
      "Start": "2020-08-07T04:27:35.6540711Z",
      "End": "2020-08-07T04:27:35.7535527Z",
      "ExitCode": 0,
      "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100   612  100   612    0     0   298k      0 --:--:-- --:--:-- --:--:--  298k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n    body {\n        width: 35em;\n        margin: 0 auto;\n        font-family: Tahoma, Verdana, Arial, sans-serif;\n    }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
    },
    {
      "Start": "2020-08-07T04:28:05.7278205Z",
      "End": "2020-08-07T04:28:05.8489965Z",
      "ExitCode": 0,
      "Output": "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n                                 Dload  Upload   Total   Spent    Left  Speed\n\r  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r100   612  100   612    0     0  68000      0 --:--:-- --:--:-- --:--:-- 76500\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n    body {\n        width: 35em;\n        margin: 0 auto;\n        font-family: Tahoma, Verdana, Arial, sans-serif;\n    }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
    },
  ....

สรุป ( ตามความเข้าใจ )

  • การทำ HealthCheck เป็นการทดสอบหรือตรวจสอบสภาพของ container ของเราว่าเมื่อทำการ run container นั้นๆ แล้วจะเป็นอย่างไร เช่นจากตัวอย่างเป็นการ ตรวจสอบ container จาก image nginx ว่า เมื่อทำการ run แล้ว การทำงาน จะทำงานได้ หรือตรงตามที่เราคาดหวังไว้หรือป่าว
  • ทั้งนี้ เป็นการทดสอบการทำงานของ docker container ก่อนจะใช้งานจริงเพื่อให้ได้ผลลัพธ์ อย่างที่เราต้องการ

สรุปเพิ่มเติม

  • starting สถานะเริ่มต้นเมื่อสั่ง run
  • healthy สถานะ ปกติดี
  • unhealthy สถานะ ไม่ปกติ

สถานะ exit - exit 0 container เป็น healthy - exit 1 container เป็น unhealthy