Docker容器化部署Zabbix

简介与概述

Docker是一个开源的应用容器引擎,基于Go语言开发遵从Apache License 2.0开源协议。可以让开发者打包他们的应用以及相关依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或windows操作系统的机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口。

使用Docker的好处

  1. 简化配置,构建一次打包后可以用于多个环境,可以省去很多配置的过程。
  2. 解决开发人员部署环境困难的问题。
  3. 每个docker中的应用隔离,服务器整合,可以在一台服务器上部署多套应用,并且隔离性很高。
  4. DevOps开发与运维一体化减少沟通的成本(docker或者k8s实现)
  5. 对运维来说,可以快速的进行扩容。
  6. 可以多平台部署。

Docker快速安装

Docker在安装时对centos7系统的内核版本要求在3.10以上。

1、 通过uname -r命令查看你当前的内核版本;

2、 确保你的yum包更新到最新yum -y update;

3、 卸载旧版本(如果安装过旧版本的话)

yum remove docker docker-common docker-selinux docker-engine

4、2、 安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

5、 设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

6、 可以查看所有仓库中的docker版本,并选择特定版本安装

yum list docker-ce --showduplicates | sort -r

7、 安装docker

sudo yum install -y docker-ce     #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版18.03.1

8、 启动并添加开机启动

# 启动Docker
systemctl start docker
# 设置docker开机自启
systemctl enable docker

9、验证docker是否安装成功(有client和service两部分表示docker安装启动都成功了)

docker version

Zabbix部署

创建专用于 Zabbix 组件容器的网络:

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

启动MySQL 服务器实例:

此处注意:Zabbix6.0+是需要MySQL8.0+才能够进行部署

docker run --name mysql-server -t \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --network=zabbix-net \
      -d mysql:8.0 \
      --restart unless-stopped \
      --character-set-server=utf8 --collation-server=utf8_bin \
      --default-authentication-plugin=mysql_native_password

此次部署数据部署采用传统部署方式

删除原有的MySQL数据库
  1. 检查是否有mariadb数据库

    rpm - qa | grep mariadb
    

    将查询出来的安装文件删除

    普通删除模式
    rpm -e xxx(mysql_libs)
    强力删除模式,如果上述命令删除时,提示有依赖其他文件,则可以用该命令对其进行强力删除
    rpm -e --nodeps xxx(mysql_libs)

  2. 删除原来安装的MySQL

    find / -name mysql
    

在这里插入图片描述

  1. 删除配置文件

    rm -rf /etc/my.cnf
    

    删除 /etc/init.d/ 下跟mysql有关的全部文件

    ls /etc/init.d/ |grep mysql
    
  2. 删除mysql的用户和组

    userdel mysql
    
安装MySQL

MySQL下载地址
在这里插入图片描述

  1. 下载MySQL

    wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
    

在这里插入图片描述

  1. 解压文件

    tar -xvf mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz
    
  2. 将解压后文件移动到/usr/local/目录下并进入MySQL文件夹

    mv mysql-8.0.30-linux-glibc2.12-x86_64 /usr/local/mysql-8.0
    cd /usr/local/
    ls
    cd mysql-8.0/
    
  3. 创建data文件夹存放数据

    mkdir data
    
  4. 创建用户组和用户并授权用户

    groupadd mysql
    useradd -g mysql mysql
    chown -R mysql.mysql /usr/local/mysql-8.0
    
  5. MySQL初始化

    cd ./bin/
    ./mysqld --user=mysql --basedir=/usr/local/mysql-8.0 --datadir=/usr/local/mysql-8.0/data/ --initialize
    

    img

    记下MySQL密码

  6. 编辑my.cnf

    vim /etc/my.cnf
    

    将以下内容粘贴到my.cnf中

    [mysqld]
    # 设置3306端口
    port=3306
    # 设置mysql的真正的安装目录 (看自己的是在哪里)
    basedir=/usr/local/mysql-8.0
    # 设置mysql数据库的数据的存放目录 (看自己的是在哪里)
    datadir=/usr/local/mysql-8.0/data
    # 允许最大连接数
    max_connections=20000
    # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
    max_connect_errors=100
    # 服务端使用的字符集默认为UTF8
    character-set-server=utf8
    # 创建新表时将使用的默认存储引擎
    default-storage-engine=INNODB
    
    [mysql]
    # 设置mysql客户端默认字符集
    default-character-set=utf8
    
    [client]
    # 设置mysql客户端连接服务端时默认使用的端口
    port=3306
    default-character-set=utf8
    
  7. 添加mysqld服务 返回mysql-8.0目录下,添加mysqld服务到系统

    cd ..
    cp -a ./support-files/mysql.server /etc/init.d/mysql
    
  8. 授权及添加服务

    chmod +x /etc/init.d/mysql
    chkconfig --add mysql
    
  9. 启动MySQL

    systemctl start mysql   # 启动MySQL
    systemctl status mysql  # 查看MySQL状态
    systemctl enable mysql	# 设置MySQL开机自启
    

    在这里插入图片描述

  10. 将MySQL命令添加到服务

    ln -s /usr/local/mysql-8.0/bin/mysql /usr/bin
    
  11. 登陆MySQL

    mysql -u root -p
    

    输入之前初始化时生成的随机密码
    在这里插入图片描述

  12. 修改root密码

    接下来修改root密码,将123456换成你的密码

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
    flush privileges;
    
  13. 修改远程连接并生效

    选中mysql数据库

    use mysql;
    

    设置允许远程连接并生效

    update user set host='%' where user='root';
    flush privileges;
    

    至此完成数据库安装工作。

Zabbix Java网关实例部署

从 Zabbix 2.0 开始,以 Zabbix 守护进程方式原生支持监控JMX 应用程序就存在了,称之为“Zabbix Java gateway”。Zabbix Java gateway 的守护进程是用 Java 编写。为了在特定主机上找到 JMX 计数器的值,Zabbix server 向 Zabbix Java gateway 发送请求,后者使用 JMX 管理 API 来远程查询相关的应用。该应用不需要安装额外的软件。只需要在启动时,命令行添加-Dcom.sun.management.jmxremote选项即可。

用Zabbix监控Java项目,在监控Java项目的时候,我们可以通过JMXJava Gateway两种监控方式。

JMX是一种用于监视和管理Java应用程序的标准API,允许你收集应用程序的运行时信息,如内存使用情况、线程状态、CPU负载等,并且还可以通过JMX远程连接进行配置和管理。你可以使用JMX客户端来连接到运行JMX的Java应用程序,以收集信息和执行管理操作。

Java Gateway则是使用JMX技术来远程管理和监控分布式Java应用程序的代理。它位于Java应用程序和JMX客户端之间,充当中间件,将JMX请求转发到Java应用程序中的相应MBean,并返回结果给JMX客户端。Java Gateway可以处理与多个Java应用程序的连接,从而提供集中的监控和管理接口。

下面为部署zabbix-java-gateway命令

docker run --name zabbix-java-gateway -t \
      --network=zabbix-net \
      --restart unless-stopped \
      -d zabbix/zabbix-java-gateway:alpine-5.4-latest

Zabbix server 部署

默认情况下,容器内创建的所有文件都存储在可写容器上,这就意味着:

  • 当这个容器被删除时,数据也会被删除,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。

  • 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序提供了一个联合文件系统,使用 Linux内核。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。

  • Docker 有两个选项让容器在主机上存储文件,以便即使在容器停止后文件也能持久保存:volumesbind mounts

    Docker 还支持将文件存储在主机内存中的容器。此类文件不会持久保存。如果您在 Linux 上运行 Docker,则使用tmpfs mount将文件存储在主机的系统内存中。

    挂载类型:

    • volumes:由 Docker(/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式
    • bind mounts:可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。
    • tmpfs mounts:挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统

    Docker映射文件原理和具体操作

  1. 创建容器映射目录

    docker volume create -d local zabbix_server_config
    docker volume create -d local zabbix_server_lib
    docker volume create -d local zabbix_server_script_lib
    
  2. 启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例

    docker run --name zabbix-server-mysql -t \
                 -v zabbix_server:/etc/zabbix \
                 -v zabbix_server_script_lib:/usr/lib \
                 -v zabbix_server_lib:/var/lib \
                 -e DB_SERVER_HOST="数据库服务器IP" \
                 -e MYSQL_DATABASE="zabbix" \
                 -e MYSQL_USER="zabbix" \
                 -e MYSQL_PASSWORD="zabbix" \
                 -e MYSQL_ROOT_PASSWORD="root" \
                 -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
                 -v zabbix_server:/etc/zabbix \
                 --network=zabbix-net \
                 -p 10051:10051 \
                 --restart unless-stopped \
                 -d zabbix/zabbix-server-mysql:alpine-5.4-latest
    

    注意:MYSQL_ROOT_PASSWORD="root" \这里的root是数据库中root用户的密码!MYSQL_PASSWORD="zabbix"这个为zabbix用户密码!

    此时还需将Zabbix server 实例将 10051/TCP 端口(Zabbix trapper)暴露给主机。

  3. 命令执行完成后查看Zabbix server是否启动成功

    docker ps -a
    

    状态如下图所示则Zabbix server启动成功并正常运行,为其他状态则容器运行存在问题需查看日志解决

在这里插入图片描述

zabbix-proxy部署

docker run --name zabbix-proxy-mysql02 \
           -v zabbix_config:/etc/zabbix \
           -v zabbix_proxy_var_lib:/usr/lib \
           -v zabbix_usr_lib:/var/lib \
           -e DB_SERVER_HOST="数据库 IP " \
           -e ZBX_HOSTNAME="zabbix-proxy-mysql01" \
           -e MYSQL_DATABASE="zabbix_proxy" \
           -e MYSQL_USER="root" \
           -e MYSQL_PASSWORD="root" \
           -e ZBX_SERVER_HOST="zabbix-server IP" \
           -p 10051:10051 --restart=unless-stopped \
           -d zabbix/zabbix-proxy-mysql:alpine-5.4-latest

Zabbix web部署

  1. 创建容器映射目录

    docker volume create -d local zabbix_web_ssl
    docker volume create -d local zabbix_web_config
    
  2. 启动 Zabbix Web 界面,并将其关联到已创建的 MySQL 和 Zabbix server 实例

    docker run --name zabbix-web-nginx-mysql -t \
          -v zabbix_web_ssl:/etc/ssl \
          -v zabbix_web_config:/etc/zabbix \
          -e ZBX_SERVER_HOST="Zabbix server服务器IP" \
          -e DB_SERVER_HOST="MySQL 服务器 IP" \
          -e MYSQL_DATABASE="zabbix" \
          -e MYSQL_USER="zabbix" \
          -e MYSQL_PASSWORD="zabbix" \
          -e MYSQL_ROOT_PASSWORD="root" \
          --network=zabbix-net \
          -p 80:8080 \
          --restart unless-stopped \
          -d zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest
    
  3. 命令执行完成后查看Zabbix web是否启动成功

    docker ps -a
    

    状态如下图所示则Zabbix server启动成功并正常运行,为其他状态则容器运行存在问题需查看日志解决

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

zabbix主动模式和被动模式

  • zabbix的主动模式和被动模式都是相对被监控的主机而言
  • zabbix默认使用被动监控
    • 被动监控:server向agent发起监控
    • 主动监控:agent向server发起监控

img

img

  • 主动和被动的区别

    • 被动模式:动模式就是由zabbix server向zabbix agent发出指令获取数据, 即zabbix agent被动的去获取数据并返回给zabbix server, zabbix server周期性的向agent 索取数据, 这总模式的最大问题就是会加大zabbix server的工作量, 在数百台服务器的环境下zabbix server不能及时获取到最新数据, 但这也是默认的工作方式。
    • 主动模式:是有zabbix agent主动采集数据并返回给zabbix server, 不再需要zabbix server进行干预, 因此主动模式在一定程度上可减轻zabbix server的压力。
  • 在被监控主机数量过多的场景下,主动模式可以大大较少zabbix server的压力

    被动模式就是zabbix-sevrer主动向zabbix-agent索要数据,好几千台服务器每次都要索要的话会非常的慢,从而影响监控值的刷新,主动模式就是zabbix-agent主动向zabbix-sever汇报数据,也就好比发了个通知,大家来这里集合一样,这样可以大大减轻zabbix server的压力,被动模式每次刷新监控项几乎都是一秒一个,而主动模式则是一秒全部刷新。

Zabbix 配置

zabbix-agent下载

安装配置Zabbix-agent

  1. 下载Zabbix-agent并将Zabbix-agent上传到服务器上

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 安装Zabbix-agent

    rpm -ivh zabbix-agent2-5.4.0-8.el7.x86_64.rpm
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 安装完成后确认Zabbix-Agent安装成功后启动Zabbix-Agent

    # 查看Zabbix-Agent状态
    systemctl status zabbix-agent2.service
    # 启动zabbix-Agent
    systemctl start zabbix-agent2.service
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 配置zabbix-agent

    zabbix-agent配置文件默认在/etc/zabbix/目录下

    vim /etc/zabbix/zabbix_agent2.conf
    

    将server=的IP改为zabbix-proxy的IP或zabbix-server的IP

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 修改完配置后重启zabbix-agent

    systemctl restart zabbix-agent2.service
    

配置Zabbix自动发现

配置发现规则
  1. 点击配置——>自动发现——>创建发现规则

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 填写相关信息,并设置为Zabbix客户端

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置发现动作
  1. 点击配置——>动作——>Discovery actions——创建动作

  2. 添加如下参数

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自动注册动作
  1. 点击配置——>动作——>Autoregistration actions——创建动作

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

配置Zabbix模板

  1. 点击配置——模板——创建模板

    创建模板并填写相关信息。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 创建监控项

    创建模板后点击添加,然后在进入模板配置页面点击监控项。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  3. 填写监控项信息

    由于我们所设置的Zabbix监控模式为主动模式,所以类型需要选择主动式,键值由于我们现在所监控的3306端口为tcp协议所以选择tcp协议监控端口,还需将[port]改为[3306]更新间隔一般填30s,填写完成后点击添加。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  4. 配置触发器

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  5. 配置图形

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

监控Nginx

  1. 在NGINX中配置stub_status

    location /basic_status {
                stub_status on;
                access_log off;
                allow 127.0.0.1;
                allow 127.0.0.0/8;
                deny all;
            }
    

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  2. 在Zabbix主机中添加NGINX监控项

    在Zabbix中添加Nginx by Zabbix agent模板用于监控Nginx

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

部署过程中Docker常用命令

docker volume 容器卷

  1. 创建容器卷

    docker volume create centos9
    
  2. 查看容器卷

    docker volume ls
    
  3. 删除容器卷

    删除容器卷时需注意,需先删除docker容器后才能删除,只是停止容器是无法删除卷的

    docker volume centos.9
    

    容器未删除时删除卷报错如下:

    Error response from daemon: remove 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496: volume is in use - [857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49]

docker logs 容器日志查看

  1. 查看日志

    docker logs 容器名称/容器ID
    
  2. 实时查看日志

    docker logs -f 容器名称/容器ID
    
  3. 查询指定时间日志并只显示最后100行

    docker logs -f -t --since="2018-02-08" --tail=100 容器名称/容器ID
    

容器状态变更和查看

  1. 容器启动

    docker start 容器名称/容器ID
    
  2. 容器停止

    docker stop 容器名称/容器ID
    
  3. 删除容器

    需要注意删除容器需先将容器停下后再进行删除

    • 普通删除操作

      docker rm 容器名称/容器ID
      
    • 强制删除(强制删除则不需要将容器停下,慎用)

      docker rm -f 容器名称/容器ID
      
  4. 重启容器

    docker restart 容器名称/容器ID
    
  5. 获取容器/镜像的元数据。

    docker inspect 容器名称/容器ID
    

Docker网络

  1. 创建网络

    docker network create 网络名称
    
  2. 查看网络

    docker network ls
    
  3. 删除网络

    docker network rm 网络名称
    
  4. 容器连接网络

    • 正在运行容器连接到网络

      docker network connect 网络名 正在运行的容器
      
    • 启动时连接到网络

      docker run -itd --network=网络名 即将启动的容器
      
    • 指定容器IP

      docker network connect --ip 10.10.10.10 网络名 容器
      
  5. 删除无用网络

    docker network prune
    
  6. 强制断开容器网络

    docker network disconnect 网络名 容器
    
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐