Docker(1.12)容器的健康检查命令(不在Dockerfile中!)

7

Docker版本1.12, 我从这里拿到了一个Dockerfile

FROM nginx:latest

RUN touch /marker

ADD ./check_running.sh /check_running.sh
RUN chmod +x /check_running.sh

HEALTHCHECK --interval=5s --timeout=3s CMD ./check_running.sh

我能使用 check_running.sh shell脚本来滚动更新和进行健康检查。在这里,check_running.sh 脚本被复制到 image 中,所以启动的容器可以使用它。
现在,我的问题是有没有办法从容器外部进行健康检查,而且脚本也位于容器外部。
我期望有一个健康检查命令来获取容器的性能(取决于我们在脚本中编写的内容),如果容器表现不佳,则应回滚到先前的版本(一种监视容器的过程,如果表现不好,就应该回滚到先前版本)。
谢谢
5个回答

5

有没有一种方法可以从容器外部进行健康检查并且脚本也位于外部。

一种监视容器的进程,如果它不好,它应该回滚到以前的状态。

你有几个选择:

  1. 从外部,您可以通过docker exec运行容器内的进程来检查其健康状态。这可以是任何一系列shell命令。如果您想将脚本保留在容器之外,可以使用类似于 cat script.sh | docker exec -it container sh -s 的方法。
  2. 您可以从容器外部检查容器的健康状态,例如,通过查找应该在容器内运行的进程(尝试设置安全配置文件并使用 ps -Zax 或尝试查找守护程序的子进程),或者您可以为每个容器分配特定的用户ID,然后查找该用户ID或连接到其服务。您必须确保它正在正确的容器内运行。您可以访问容器文件系统下的 /var/lib/docker/devicemapper/mnt/<hash>/rootfs
  3. 您可以在容器内运行HEALTHCHECK,并结合Dockerfile中的一行代码使用docker inspect --format='{{json .State.Health.Status}}' <containername>来检查其健康状态,例如: HEALTHCHECK CMD wget -q -s http://some.host 检查容器是否具有互联网访问权限。
我建议选择选项3,因为它未来更有可能与其他工具兼容。

1
关于选项3:不要每5秒执行一次。如果你的容器有100万用户,每5秒连接一次网站会很疯狂的 ;) - mgutt

2

我刚刚从一篇博客中得到了评论!他提到了Docker文档中的HealthCheck部分。在docker命令中有一个健康检查“选项”,可以“覆盖”dockerfile默认值。我还没有检查过!但这对我来说似乎是个好东西,可以得到我想要的。将会检查并更新答案!


1
docker run --health-cmd ... 只是覆盖 Dockerfile 中 HEALTHCHECK 的值。它并不改变脚本运行的位置,主要是在容器内部。 - BMitch

1
Docker inspect命令允许您查看成功或失败的命令输出。
docker inspect --format='{{json .State.Health}}' your-container-name

0

这与 Dockerfile 中的 HEALTHCHECK 选项不可用,所有检查都在容器内部运行。对我来说,这是一件好事,因为它避免了可能不受信任的代码直接在主机上运行,并且它允许您在容器内部包含健康检查的依赖项。

如果您需要从外部监视您的容器,则需要使用其他工具或监视应用程序,现在有很多这样的工具可供选择。


0
您可以通过在容器上运行 docker inspect 来查看健康检查的结果。
另一种方法是根据您的应用程序公开一个/healthz端点,以便健康检查也会探测它,这样它就可以根据需要在外部或内部进行查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接