问题描述
在家庭服务器上运行了大约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端口是开放的,那么通过curl
或netcat
监控它们可能不是最糟糕的解决方案。这就是一个完整的编排解决方案(如OpenShift)的工作原理。你可以按照以下步骤逐渐增加监控的方式:
1. 检查TCP/IP端口是否开放(使用netcat -z
命令)。
2. 检查端口是否开放并响应特定提示符(使用netcat | grep HELLO
命令)。
3. 检查端口是否返回特定的HTML(例如,使用curl ... | grep <p>I'm alive</p>
命令)。
4. 如果以上方法都无法解决问题,可以编写一个手动脚本来返回true
。
方案4
你可以使用check_mk
来监控容器的健康状态,就像监控其他任何机器一样。你可以在这里了解更多信息。
希望对你有所帮助。