HEALTHCHECK命令是用来嵌入在container内部用来标识当前container状态的。
只有当HEALTHCHECK指定的命令返回正确,docker才认为contaier已经到正常(healthy)状态了,否则docker会认为contianer还在启动(starting)。
HEALTHCHECK的语法
HEALTHCHECK [<options>] CMD <cmd>
<options>是可选的。
例如:
$ cat Dockerfile
...
HEALTHCHECK --interval=30s --timeout=30s --retries=120 CMD curl --fail http://localhost:8080/heartbeat || exit 1
...
这样当启动由此Dockerfile创建的image的container时,docker会把当前container标记为starting, 直到curl --fail http://localhost:8080/heartbeat返回正确的值。
当然这个例子你必须在container里面自己实现localhost:8080/heartbeat请求服务,docker本身不会提供给这个服务的。
如果本身container没有提供web服务的,那么可以使用其他的任何检测方法,也可以提供一个脚本文件,让docker执行这个脚本都行,只要命令能够返回0标识heartbeat正常就行。
在测试这个功能时,有一个意外发现,就是实际验证了docker swarm service在更新container的时候是一个一个更新的,而不是一次性把所有的container全干掉,然后一次性都重启。举例来说:
如果一个swarm service有三个containers(--replicas=3),当接到类似重启命令(docker service update --force <servicename>)时。
- docker会先重启其中一个container。
- 等待直到这个container状态已经变成healthy后。
- 然后再重启第二个container
- 然后再等待直到第二个container状态也已经变成healthy后。
- 最后再重启第三个container
- 直到第三个container也变成healthy之后,service的重启命令才算完成,命令行退出。
这样做的目的是可以一定程度上保证zero-downtime,即总是有service的container当前还是在活的提供服务的。
网友评论