Docker 容器监控

监控方案

监控方案我选择了 Zabbix,要实现对每个容器信息的监控,需要 zabbix-docker-monitoring 插件。

配置服务端

Zabbix 是 C/S 架构,服务端最好能配置在一台独立的宿主机上。

服务端 docker-compose 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '2'
services:
zabbix:
image: monitoringartist/zabbix-xxl
ports:
- 8080:80
- 10051:10051
volumes:
- /etc/localtime:/etc/localtime:ro
depends_on:
- zabbix.db
environment:
ZS_DBHost: zabbix.db
ZS_DBUser: zabbix
ZS_DBPassword: zabbix_password
zabbix.db:
image: monitoringartist/zabbix-db-mariadb
volumes:
- /backups:/backups
- /etc/localtime:/etc/localtime:ro
volumes_from:
- zabbix-db-storage
environment:
MARIADB_USER: zabbix
MARIADB_PASS: zabbix_password
zabbix-db-storage:
image: busybox:latest
volumes:
- /var/lib/mysql

容器方式运行 Zabbix-agent

可以无需在宿主机安装 Zabbix-agent,直接运行官方的容器即可。

运行 Zabbix-agent 容器:

1
2
3
4
5
6
7
8
docker run \
--name=zabbix-agent-xxl \
-h $(hostname) \
-p 10050:10050 \
-v /:/rootfs \
-v /var/run:/var/run \
-e "ZA_Server=<ZABBIX SERVER IP/DNS NAME>" \
-d monitoringartist/zabbix-agent-xxl-limited:latest

配置容器

  • 修改 ZA_Server,直接改成服务器 ip。

如果想覆盖容器中 agent 的配置变量,可以在 run 的时候使用 -e ZA_Variable=value 的方法,但是对 AllowRoot, LoadModulePath, LoadModule, LogType 的配置无法覆盖,其中 AllowRoot 的默认值就是 1,参看 Github Issue

宿主机直接运行 Zabbix-agent

容器的方式运行 zabbix-agent 不支持 docker.xnet 数据的监控,想要监控 docker.xnet 数据,得直接在宿主机上运行 zabbix-agent,并加载 zabbix_module_docker.so,参看 Github Issue

1. 添加 zabbix 用户和组

1
2
groupadd zabbix
useradd -g zabbix zabbix

2. 编译安装 zabbix-agent

1
2
3
4
5
6
7
8
apt-get install -y wget autoconf automake gcc subversion make pkg-config
cd ~
mkdir zabbix32
cd zabbix32
svn co svn://svn.zabbix.com/branches/3.2 .
./bootstrap.sh
./configure --enable-agent
make install

3. 编译 zabbix_module_docker.so:

1
2
3
4
5
6
7
cd ~/zabbix32
mkdir src/modules/zabbix_module_docker
cd src/modules/zabbix_module_docker
wget https://raw.githubusercontent.com/monitoringartist/Zabbix-Docker-Monitoring/master/src/modules/zabbix_module_docker/zabbix_module_docker.c
wget https://raw.githubusercontent.com/monitoringartist/Zabbix-Docker-Monitoring/master/src/modules/zabbix_module_docker/Makefile
make
cp zabbix_module_docker.so /usr/local/lib/zabbix/agent/

4. 启动 zabbix_agentd

使用 systemd 管理进程,创建 /lib/systemd/system/zabbix-agentd.service 文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/usr/local/etc/zabbix_agentd.conf"
Type=forking
Restart=on-failure
PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/usr/local/sbin/zabbix_agentd -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s

[Install]
WantedBy=multi-user.target

执行下面命令告知 systemctl 如何启动 zabbix-agentd

1
sudo systemctl enable zabbix-agentd.service

5. 配置加载项

修改 zabbix-agentd 配置文件 /usr/local/etc/zabbix_agentd.conf 中的下面几个参数:

1
2
3
4
5
6
Server=Zabbix-Server-IP
ServerActive=Zabbix-Server-IP
Hostname=Current-Host-Name
Timeout=30
LoadModulePath=/usr/local/lib/zabbix/agent
LoadModule=zabbix_module_docker.so

运行下面命令启动 zabbix-agentd

1
systemctl start zabbix-agentd.service

6. 启动失败分析

  • 如果启动失败,查看 /tmp/zabbix_agentd.log 文件,如不存在,可手动创建,所属用户为 zabbix:zabbix

  • 报错:

    1
    2
    zabbix_agentd [xxxxx]: cannot attach to existing shared memory: [13] Permission denied
    cannot allocate shared memory for collector

    可能是 zabbix_module_docker.so 编译错误,重新编译一次即可。

设置监控

1. 登录管理系统

浏览器访问 http://ZabbixServerIP:Port,可以看到 zabbix 服务器 web 管理界面,默认登录帐号是 Admin/zabbix (注意 Admin 首字母大写)。

为了方便操作,可将系统语言设置为中文。

2. 导入模板

注:模板里有一些已经配置好的监控方案,可以参考取舍。

3. 创建主机群组

  • 配置 > 主机群组 里创建主机群组,命名为 Docker Servers

4. 创建主机

  • 配置 > 主机 里面创建一个主机。
  • 群组选择 Docker Servers
  • agent代理程序的接口 填写要监控的 agent ip。
  • 模板 选项卡中选择第二步中导入的模板,添加更新。
  • 监控 > 最新数据 中查看监控数据。