如何监控多个Docker容器的状态

54次阅读
没有评论

问题描述

在家庭服务器上运行了大约15个不同的服务,每个服务都由一个Docker容器表示。根据开发人员实现Dockerfile的方式,有些服务具有健康检查,但大多数没有。目前,用户没有办法确保这些服务保持健康和运行。用户设置了restart: always选项,但最坏的情况是,如果服务器启动失败或崩溃,Docker将无休止地重新启动服务器。或者在更新过程中,docker pull命令导致问题。这些服务不启动或在一天中停止运行的原因有很多。用户希望能够在这些服务停止时得到通知,比如通过电子邮件,这样他就可以及时解决问题,而不是在家人或自己使用服务时才发现问题。用户想知道是否有一种合理的方法来监控这些Docker容器。是否需要手动编写一些检查进程运行时间的脚本?最好有一个开箱即用的解决方案。请注意,用户在所有事情上都使用Docker Compose,并且只有一台物理机器来运行这些服务,所以不需要担心复杂的设置。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

如果你选择使用脚本,可以选择比ps更高级的工具,比如:
– 使用docker-compose events命令行工具:

docker-compose events [options] [SERVICE...]

该命令可以为项目中的每个容器流式传输容器事件。
– 使用docker events命令行工具:

docker events

该命令可以从服务器获取实时事件。
你需要关注容器的die事件(参考扩展描述)。
这个事件似乎与重启策略无关(参考Docker Events Explained)。
你可以尝试使用一些监控工具,可能已经实现了你所需的功能。
你还可以参考Implementing Docker event monitoring from scratch

方案2

如果你不介意在家中运行一些其他服务,我建议你尝试使用以下工具:
– Prometheus:用于存储从dockerd-exporter收集的时间序列数据。
– Grafana:以非常好的方式显示数据。
– AlertManager:允许你根据需要配置警报。
你可以参考swarmprom项目

方案3

如果大多数服务都是网络服务,或者至少有一些管理TCP/IP端口打开,那么通过curlnetcat监控它们可能不是最糟糕的解决方案。这就是一个完整的编排解决方案(如OpenShift)的工作原理。你可以按照以下步骤逐渐增加监控的复杂性:
1. 检查TCP/IP端口是否打开(使用netcat -z命令)。
2. 检查端口是否打开并响应特定提示符(使用netcat | grep HELLO命令)。
3. 检查端口是否返回特定的HTML(例如,使用curl ... | grep <p>I'm alive</p>命令)。
4. 如果以上方法都无法解决问题,可以编写一个自定义脚本来返回true

方案4

你可以使用check_mk来监控容器的健康状态,就像监控其他任何机器一样。你可以在这里了解更多信息。
希望对你有所帮助。

正文完