专栏首页阿冬的运维技术栈关于docker环境运行zabbix时,你可能不知道的事

关于docker环境运行zabbix时,你可能不知道的事

关于docker环境运行zabbix时,可以快速的部署一套zabbix环境,不管是学习docker还是学习zabbix,都是可以作为一个实际项目来进行测试和练习,但是如果对docker的网络模式不熟悉,可能会遇到一些坑,本文就一些你可能不知道的事进行了测试,与试水,希望能给与大家帮助

一、Docker四种网络模式

实现原理

Docker使用Linux桥接(参考《Linux虚拟网络技术》),在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。 Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

四类网络模式

Docker网络模式 配置 说明 host模式 –net=host 容器和宿主机共享Network namespace。 container模式 –net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。kubernetes中的pod就是多个容器共享一个Network namespace none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 bridge模式 –net=bridge (默认为该模式)

host模式

如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。 使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。 Host模式如下图所示:

container模式

这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。 Container模式示意图:

none模式

使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。 这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。

None模式示意图:

bridge模式

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。 bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

bridge模式如下图所示:

二、创建zabbix测试环境

1 新建网络

下面自定义创建一个新的bridge模式的Docker网络

[root@centos-linux-4 ]# docker network create -d bridge my-net
2d19b1c8d144a6367810998bc5e001404d34ea1a0f51a52a5246aaeeba04e97a
[root@centos-linux-4 ]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1b86c2f5b04b bridge bridge local
36d9d40bf276 cmp_zabbix_agent_default bridge local
9a3d2b9e95d5 cmp_zabbix_server_default bridge local
f0d6e6c30c66 host host local
2d19b1c8d144 my-net bridge local
bfaa333252cf none null local

-d参数指定Docker网络类型,有bridge、overlay类型,overlay类型适用于Swarm mode,这里我们使用bridge

2 启动一个空的Mysql服务器实例

[root@centos-linux-4 cmp_zabbix_agent]# docker run --name mysql-server --network=my-net -it --restart=always -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="root" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456"  -d mysql:5.7 --character-set-server=utf8 --collation-server=utf8_bin
bb6a9117ffec928971b819a1dacb1e62fb748cd9a2d5c9c5f193e5e1cc32eb4f
[root@centos-linux-4 cmp_zabbix_agent]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb6a9117ffec mysql:5.6 "docker-entrypoint.s…" 6 seconds ago Up 5 seconds 3306/tcp

3 启动Zabbix server实例,并关联这个实例到已创建的MySQL服务器实例

[root@centos-linux-4 cmp_zabbix_agent]# docker run --name zabbix-server-mysql --network=my-net -it --restart=always -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="root" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456"  -v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro --link mysql-server:mysql -p 10051:10051 -d zabbix/zabbix-server-mysql:latest
2ef64b4ca60aaf4db2d82d0ac77139675c5ef7ab98f71e6f1c27217e9fb54d66
[root@centos-linux-4 cmp_zabbix_agent]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ef64b4ca60a zabbix/zabbix-server-mysql:latest "/sbin/tini -- /usr/…" 23 seconds ago Up 22 seconds 0.0.0.0:10051->10051/tcp zabbix-server-mysql
bb6a9117ffec mysql:5.6 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp mysql-server

4 启动Zabbix web 接口,并将它与MySQL服务器实例和Zabbix server实例关联

[root@centos-linux-4 cmp_zabbix_agent]# docker run --name zabbix-web-nginx-mysql --network=my-net -it --restart=always -e DB_SERVER_HOST="mysql-server" -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="root" -e MYSQL_PASSWORD="123456" -e MYSQL_ROOT_PASSWORD="123456" --link mysql-server:mysql --link zabbix-server-mysql:zabbix-server -p 8080:80 -d zabbix/zabbix-web-nginx-mysql:latest
effdf23c761b7f4536bf99ef9fea2999a44f6f2eec8b285763708033a3b7ffa7
[root@centos-linux-4 cmp_zabbix_agent]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
effdf23c761b zabbix/zabbix-web-nginx-mysql:latest "docker-entrypoint.sh" 4 seconds ago Up 3 seconds 443/tcp, 0.0.0.0:8088->80/tcp zabbix-web-nginx-mysql
2ef64b4ca60a zabbix/zabbix-server-mysql:latest "/sbin/tini -- /usr/…" 2 minutes ago Up 2 minutes 0.0.0.0:10051->10051/tcp zabbix-server-mysql
bb6a9117ffec mysql:5.6 "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp mysql-server

三、测试场景

前面的zabbix的数据库、server、web都是使用自定义的网桥分配ip地址,正式环境切记需要对一些关键数据进行持久化,同时网络模式也可以不需要指定,使用默认的即可,可以使用如下命令查看自定义的网桥下的容器ip

[root@elk-master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
39cad5014ee8 bridge bridge local
e7aa5925d508 host host local
f8d5b552a9e8 my-net bridge local
f4ea566b5201 none null local
[root@elk-master ~]# docker network inspect f8d5b552a9e8
[
    {
        "Name": "my-net",
        "Id": "f8d5b552a9e879a8b973393fff52892c12f9f31a12412cb70b5a16e5bed606b6",
        "Created": "2020-01-19T10:51:01.317838046+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.20.0.0/16",
                    "Gateway": "172.20.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "033bc75eae7d20ec1940a9588bf150eff52575076ea53abe5db7a67e663621bc": {
                "Name": "zabbix-web-nginx-mysql",
                "EndpointID": "bcb44b716858b5b2bd5c4431bf37367771aaade7df5de6fc388f76890d3c64dd",
                "MacAddress": "02:42:ac:14:00:04",
                "IPv4Address": "172.20.0.4/16",
                "IPv6Address": ""
            },
            "b8177b394cac1676e945019d7d6b7252ee6fec88fb6072a197ead2096610aa66": {
                "Name": "zabbix-server-mysql",
                "EndpointID": "78f77f1bc9ad066f2173147c5e342b80ec46f9cc3c93b63be7e0e3d2897c5c93",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/16",
                "IPv6Address": ""
            },
            "fb7d8240a307f184e5458f54f5a1b2b0e58aba1668af6eefb6a416176b5f9b19": {
                "Name": "mysql-server",
                "EndpointID": "a271a5ca6e58003650169a644558ec68c31ae76f56d0898368c63961209a5f06",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

当我们想采集zabbix server上的数据的时候,分别进行了如下几个场景的,可以根据自己的需求选择合适的方式

场景1:

当server服务器上的agent也用docker安装的时候,如果网络模式选择bridge,并且agent和server如果是在同一个网桥时,agent的配置文件中server需要填写成zabbix-server容器名或者ip地址,web端需要配置成agent容器的ip地址,最终发现采集到的将会是agent容器自己的数据,具体操作如下:

  • 选择跟server一样的网桥my-net启动agent
docker run --name zabbix-agent --network=my-net -p 10051:10050 -e ZBX_HOSTNAME="zabbix-server" -e ZBX_SERVER_HOST="zabbix-server-mysql" --link zabbix-server-mysql:zabbix-server-mysql  -d zabbix/zabbix-agent:latest
  • 首先我们看一下web端的server端的agent配置地址为容器ip
[root@elk-master ~]# docker exec -it b8177b394cac bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
15: eth0@if16: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ zabbix_get -s 172.20.0.5 -p 10050 -k "system.uptime"
1858
bash-5.0$ zabbix_get -s zabbix-agent -p 10050 -k "system.uptime"
1878
  • 然后进入容器查看agent中的server地址
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:05 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.5/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ cat /etc/zabbix/zabbix_agentd.conf|grep -Ev '#|^$'
LogType=console
Server=zabbix-server-mysql
ServerActive=zabbix-server-mysql:10051
Hostname=zabbix-server
User=zabbix
Include=/etc/zabbix/zabbix_agentd.d/
LoadModulePath=/var/lib/zabbix/modules/
  • 进入agent容器验证数据和web端采集的数据

1 查看磁盘工具agent中的数据于web采集的是一致

2 查看进程数量

发现web的数据也是和agent容器是一致的

宿主机进程

server容器进程

结论:这种方式是可行的,但是采集的是agent的容器数据,不能完全代表server服务器的数据

场景2

当server服务器上的agent用安装的时候,使用的网桥模式,但是agent和server如果不是在同一个网桥,相当于两个容器的ip地址将是两个网段,那么这种同主机两个网段的容器,是否可以使用宿主机ip+容器暴露的端口来采集呢,采集是否也是agent容器自己的数据?

  • 使用如下命令,则可以通信
[root@elk-master ~]# docker rm -f zabbix-agent
zabbix-agent
[root@elk-master ~]#docker run --name zabbix-agent --network=bridge -p 10050:10050 -e ZBX_HOSTNAME="Zabbix server" -e ZBX_SERVER_HOST="192.168.73.133" -e ZBX_SERVER_PORT=10054  -d zabbix/zabbix-agent:latest
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.3/16 brd 172.20.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ exit
exit
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
bash-5.0$ ping 172.20.0.3
PING 172.20.0.3 (172.20.0.3) 56(84) bytes of data.
^C
--- 172.20.0.3 ping statistics ---
41 packets transmitted, 0 received, 100% packet loss, time 44ms

bash-5.0$ cat /etc/zabbix/zabbix_agentd.conf |grep -Ev '#|^$'
LogType=console
Server=192.168.73.133
ServerActive=192.168.73.133:10051
Hostname=Zabbix server
User=zabbix
Include=/etc/zabbix/zabbix_agentd.d/
LoadModulePath=/var/lib/zabbix/modules/
bash-5.0$

可以看到容器和zabbix-agent的ip地址和zabbix-server的ip地址是不一致,不能互相通信,因为我在启动容器的时候指定环境变量了,因此此时的server ip为宿主机ip

  • 然后我们看一下web端的server端的agent配置地址为宿主机地址,端口配置为agent映射出来的端口,在server端使用zabbix_get看能否通过宿主机ip地址+映射端口进行数据采集
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ zabbix_get -s 192.168.73.133 -p 10050 -k "system.uptime"
zabbix_get [185]: Check access restrictions in Zabbix agent configuration
bash-5.0$

同主机这种配置方式四没法获取到值,当另外找一台主机使用默认网桥模式,使用宿主机ip+暴露的端口,是可以进行通信的

bash-5.0$ zabbix_get -s 192.168.73.135 -p 10050 -k "system.uptime"
1988
  • 基于docker网络的配置,可以添加iptables的链规则,让两个网桥上的容器可以互相通信
[root@elk-master ~]# iptables -t filter -I DOCKER-ISOLATION-STAGE-2 1 -j ACCEPT   -s  172.20.0.0/16 -d 172.17.0.0/16
[root@elk-master ~]# iptables -t filter -I DOCKER-ISOLATION-STAGE-2 1 -j ACCEPT   -s  172.17.0.0/16 -d 172.20.0.0/16
[root@elk-master ~]# docker exec -it zabbix-server-mysql
bash-5.0$ zabbix_get -s 172.17.0.2 -p 10050 -k "system.uptime"
zabbix_get [196]: Check access restrictions in Zabbix agent configuration
bash-5.0$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=63 time=0.068 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=63 time=0.096 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1ms
rtt min/avg/max/mdev = 0.068/0.082/0.096/0.014 ms
bash-5.0$

结果发现就算两个容器互相通信了,但不是在一个网桥,所以还是不能够采集到数据(我删除了容器,从新配置server的ip启动)

  • 最终可以使用一个容器多网桥的概念,把zabbix-agent也加入到zabbix-server所使用的my-net网桥
[root@elk-master ~]# docker network connect my-net zabbix-agent
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
25: eth0@if26: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
27: eth1@if28: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:14:00:05 brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.5/16 brd 172.20.255.255 scope global eth1
       valid_lft forever preferred_lft forever
bash-5.0$ exit
exit
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ zabbix_get -s 192.168.73.133 -p 10050 -k "system.uptime"
zabbix_get [203]: Check access restrictions in Zabbix agent configuration
bash-5.0$ zabbix_get -s 172.20.0.5 -p 10050 -k "system.uptime"
6748

场景3

当server服务器上的agent用安装的时候,使用的host模式,server使用的是网桥模式,采集的是否将会是agent容器自己的数据?

  • 首先,使用网络模式host启动agent,并且server配置成容器ip,这样agent将会与宿主机一样公用一个网络
[root@elk-master ~]# docker rm -f zabbix-agent
zabbix-agent
[root@elk-master ~]# docker run --name zabbix-agent --network=host  -e ZBX_HOSTNAME="Zabbix server" -e ZBX_SERVER_HOST="172.20.0.3" -e ZBX_SERVER_PORT=10051  -d zabbix/zabbix-agent:latest
05f9576a0e8384ea509d47dd974d410886556aecee391beb6ed96269ce3642d2
[root@elk-master ~]# docker exec -it zabbix-agent bash
bash-5.0$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:0b:95:34 brd ff:ff:ff:ff:ff:ff
    inet 192.168.73.133/24 brd 192.168.73.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe0b:9534/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:64:f5:ce:26 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:64ff:fef5:ce26/64 scope link
       valid_lft forever preferred_lft forever
6: br-f8d5b552a9e8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:bf:8c:b4:5a brd ff:ff:ff:ff:ff:ff
    inet 172.20.0.1/16 brd 172.20.255.255 scope global br-f8d5b552a9e8
       valid_lft forever preferred_lft forever
    inet6 fe80::42:bfff:fe8c:b45a/64 scope link
       valid_lft forever preferred_lft forever
14: veth7292b59@if13: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master br-f8d5b552a9e8 state UP
    link/ether 56:9f:c2:70:eb:36 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::549f:c2ff:fe70:eb36/64 scope link
       valid_lft forever preferred_lft forever
18: vetha3f4946@if17: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master br-f8d5b552a9e8 state UP
    link/ether 86:71:f9:d9:83:93 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::8471:f9ff:fed9:8393/64 scope link
       valid_lft forever preferred_lft forever
22: veth36efc5f@if21: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue master br-f8d5b552a9e8 state UP
    link/ether fe:62:61:ad:8a:de brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc62:61ff:fead:8ade/64 scope link
       valid_lft forever preferred_lft forever
bash-5.0$ exit
exit
[root@elk-master ~]# docker exec -it zabbix-server-mysql bash
bash-5.0$ zabbix_get -s 192.168.73.133 -p 10050 -k "system.uptime"
6946
  • 然后,我们需要把web端的server端的agent配置地址为宿主机地址,端口为默认端口

这样是可以采集到数据,但是采集的也是容器的数据,不是宿主机的数据

  • 如果想让zabbix-agent启动的时候注入的ip地址为宿主机ip地址的话,需要把zabbix-server启动的网络模式也改成host,这样才采集到数据

四、结论 1 当使用docker环境部署zabbix的时候,对于zabbix-server和zabbix-agent容器的网络模式需要注意,如果设置的不对会导致采集不到agent的数据 2 只有当zabbix-server和zabbix-agent启动的时候在一个网桥下,或者zabbix-agent使用宿主机网络的时候才可以采集到数据 3 如果是容器启动的agent,那么server端采集到的数据是agent容器的数据,不能全部代表宿主机的指标 4 如果想准确的采集宿主机的指标,应该是用rpm源码包进行安装agent服务

CentOS 7.x 下安装Zabbix Agent 4.4 操作指引
=====
第一步:安装rpm包
rpm -ivh https://repo.zabbix.com/zabbix/4.4/rhel/7/x86_64/zabbix-agent-4.4.4-1.el7.x86_64.rpm

注:此处的RPM安装包可以根据URL查找更多版本的RPM包

第二步:安装agent
yum install zabbix-agent

第三步:启动agent并检查是否成功
systemctl start zabbix-agent
systemctl status zabbix-agent

第四步:配置Zabbix Agent
vim /etc/zabbix/zabbix_agentd.conf
更改Server的地址为zabbix server的ip地址或域名

第五步:重启zabbix并将Zabbix Agent加入开机启动项
systemctl restart zabbix-agent
systemctl enable zabbix-agent

第六步:配置防火墙允许被访问10050端口
firewall-cmd --zone=public --add-port=10050/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

参考文章: https://www.jianshu.com/p/22a7032bb7bd

本文分享自微信公众号 - 阿冬的运维技术栈(gh_fa71be5df518),作者:Double冬

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Ansible 批量部署 zabbix-agent

    ansible基于python开发,集合了众多优秀运维工具的优点,实现了批量运行命令、部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行...

    用户6641876
  • ZABBIX 对接 LDAP实现用户登陆统一认证

    注意:实现LDAP用户账户统一认证需要AD和ZABBIX共有用户帐号并且保证LDAP设置中 Test authentication 选项中用户和密码和AD中的相...

    用户6641876
  • Zabbix与ELK整合实现对安全日志数据的实时监控告警

    ELK大家应该比较熟悉了,zabbix应该也不陌生,那么将ELK和zabbix放到一起的话,可能大家就有疑问了?这两个放到一起是什么目的呢,听我细细道来

    用户6641876
  • 9102 年了,还在兼容 IE11 是什么样的体验

    kmokidd
  • HTTP API 设计指南HTTP API 设计指南

    这篇指南介绍描述了 HTTP+JSON API 的一种设计模式,最初摘录整理自 Heroku 平台的 API 设计指引 Heroku 平台 API 指引。

    Originalee
  • opencv 7 -- 边界矩形

    一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转。 所以边界矩形的面积不是最小的。 可以使用函数 cv2.boundingRect() 查找得...

    wust小吴
  • KeUserModeCallback用法详解(Ring0调用Ring3代码)

    ring0调用ring3早已不是什么新鲜事,除了APC,我们知道还有KeUserModeCallback.其原型如下: 代码:

    战神伽罗
  • 微信小程序使用wxParse解析html

    首先我们在github上下载wxParse https://github.com/icindy/wxParse 下载完之后我们需要用到目录下的wxParse文件...

    KEVINGUO_CN
  • 分布式任务调度框架 Elastic-Job 之动态任务发布实现详解

    任务调度 JDK 的几种实现方式如下: 1)多线程: 通过开启一个线程,while 循环执行业务逻辑,让线程 sleep 休眠,达到任务间隔执行。代码清单如...

    IT技术小咖
  • 缓存架构之史上讲的最明白的RabbitMQ可靠消息传输实战演练

    比如:某个广告主(如:天猫)想在我们的平台(如:今日头条)投放广告,当通过我们的广告系统新建广告的时候,该消息在同步给redis缓存(es)的时候丢失了,而我们...

    用户1263954

扫码关注云+社区

领取腾讯云代金券