ทั้งนี้เป็นการสรุปจากการแปล ภาษาอังกฤษ แบบ งูๆปลาๆ และการทดลองทำเบี้องต้น
เป็นฟีเจอร์ที่มีมาใน 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"
},
....
starting
สถานะเริ่มต้นเมื่อสั่ง run
healthy
สถานะ ปกติดีunhealthy
สถานะ ไม่ปกติสถานะ exit
- exit 0 container เป็น healthy
- exit 1 container เป็น unhealthy