之前在https://rorschachchan.github.io/2018/05/17/%E4%BD%BF%E7%94%A8zabbix%E5%8E%BB%E7%9B%91%E6%8E%A7docker%E5%AE%B9%E5%99%A8/ 介绍了如何使用dockbix去自动监控容器的cpu、mem和端口等值。而本文的内容就是讲述如何使用dockbix监控进程。
服务器情况如下:
172.31.0.77,普通模式安装zabbix-server;
172.16.0.194,服务器里有两个容器,一个是dockbix,另一个是具体的服务,里面是一个centos 7跑着nginx和php两个进程,如图:
如果你启动dockbix的语句是这样的话:
1
2
3
4
5
6
7
8
9
10docker run \
--name=dockbix-agent-xxl \
--net=host \
--privileged \
-v /:/rootfs \
-v /var/run:/var/run \
--restart unless-stopped \
-e "ZA_Server=zabbix-server的IP地址" \
-e "ZA_ServerActive=zabbix-server的IP地址" \
-d monitoringartist/dockbix-agent-xxl-limited:latest
那么发现监控进程是失败的,如图:
原因就是dockbix和具体服务之间是两个独立的进程,所以dockbix无法访问到另一个容器的进程情况,这样就要干掉原有的dockbix,并且更改一下dockbix的启动语句:
1
2
3
4
5
6
7
8
9
10
11docker run \
--name=dockbix-agent-xxl \
--net=host \
--pid=host \ #增加这句话
--privileged \
-v /:/rootfs \
-v /var/run:/var/run \
--restart unless-stopped \
-e "ZA_Server=172.31.0.77" \
-e "ZA_ServerActive=172.31.0.77" \
-d monitoringartist/dockbix-agent-xxl-limited:latest
然后再去重新使用zabbix-get
命令,就可以获取到进程了!
默认下,所有的容器都启用了PID命名空间。PID命名空间提供了进程的分离。PID命名空间删除系统进程视图,允许进程ID可重用,包括pid 1。docker run
的时候添加了--pid=host
就是允许容器内的进程可以查看主机的所有进程。
如果是不要看所有主机的进程,而只是看某一个容器的进程,其他进程pid不看怎么设置呢?
1
2docker run --name my-redis -d redis #假设你启动了一个名叫my-redis的容器
docker run -it --pid=container:my-redis my_strace_docker_image bash #在建立一个my_strace_docker_imag容器,只与my-redis共享pid
如果zabbix-server发现容器内的某个服务死了,要进入容器里重启服务怎么办?答曰:docker exec 容器ID /bin/bash -c "启动服务命令"
参考资料
https://github.com/monitoringartist/dockbix-agent-xxl/issues/42
https://www.zabbix.com/documentation/3.4/zh/manual/appendix/items/proc_mem_num_notes
https://docs.docker.com/engine/reference/run/#imagetag