如何在Ubuntu20.04上使用Zabbix监控Docker
作为 Write for DOnations 计划的一部分,作者选择了 Open Source Initiative 来接受捐赠。
Docker 是一个流行的应用程序,它简化了容器中应用程序进程的管理。 容器类似于虚拟机,但由于它们更依赖于主机操作系统,因此它们更具可移植性和资源友好性。
在生产环境中使用容器时,您应该知道它们是否都在运行以及它们正在消耗哪些资源。 Zabbix 是一个监控系统,可以监控您的 IT 基础架构中几乎任何元素的状态,例如网络、服务器、虚拟机和应用程序。
Zabbix 最近推出了具有高级功能的新代理(Zabbix agent 2)。 新代理的主要优势之一是能够使用插件扩展功能。 目前,有几个插件可用,包括一个用于监控 Docker 的插件。
在本教程中,您将在 Ubuntu 20.04 上使用 Zabbix agent 2 在 Zabbix 中设置 Docker 监控。 您将探索指标并模拟崩溃以生成通知。 最后,你将为你的 Docker 应用程序建立一个监控系统,它会通知你容器的任何问题。
先决条件
要遵循本教程,您将需要:
- 按照 Initial Server Setup Guide for Ubuntu 20.04 设置两台 Ubuntu 20.04 服务器,包括具有
sudo
权限的非 root 用户和配置有ufw
的防火墙。 - 您将安装 Zabbix 的第一台服务器将是 Zabbix 服务器。 安装以下组件:
- Nginx、MySQL 和 PHP,按照教程 Ubuntu 20.04 LEMP 堆栈指南 的步骤 1 到 3 安装。
- Zabbix,按照教程 如何安装和配置 Zabbix 以在 Ubuntu 20.04 上安全监控远程服务器的步骤 1 到 5 安装。
- 要通过邮件(而不是 Web 界面)接收通知,我们建议完成 如何安装和配置 Zabbix 以在 Ubuntu 20.04 上安全监控远程服务器的第 8 步。
- 您将安装 Docker(和 Zabbix 代理)的第二个服务器将是 Docker 服务器。 按照教程 How To Install and Use Docker on Ubuntu 20.04 的第 1 步安装 Docker。
- 完全注册的域名。 本教程将始终使用
your_domain
作为示例。 您可以在 Namecheap 上购买一个域名,在 Freenom 上免费获得一个域名,或者使用您选择的域名注册商。 - 带有
your_domain
的 A 记录指向您的 Zabbix 服务器的公共 IP 地址。 您可以关注这个DigitalOcean DNS的介绍,详细了解如何添加它。
第 1 步 — 安装和配置 Zabbix Agent 2
Zabbix 代理是一个非常小的应用程序,必须安装在您要监控的每台服务器或虚拟机上。 它将监控数据发送到 Zabbix 服务器。 Zabbiх 建议使用以下两种代理之一:Zabbix agent 或 Zabbix agent 2。 (您可以在 文档 中了解它们的区别。)在本教程中,我们将使用 Zabbix 代理 2,因为它可以与 Docker 一起使用。 在此步骤中,您将学习如何安装和配置它。
首先安装代理软件。 登录Docker服务器:
ssh sammy@docker_server_ip_address
运行以下命令安装存储库配置包:
wget https://repo.zabbix.com/zabbix/5.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.0-1+focal_all.deb sudo dpkg -i zabbix-release_5.0-1+focal_all.deb
接下来,更新包索引:
sudo apt update
然后安装 Zabbix 代理:
sudo apt install zabbix-agent2
接下来,您需要编辑代理配置文件,其中包含所有代理的设置。 这些设置指定将数据传输到的地址、用于与服务器之间的连接的端口、是否使用安全连接等等。 在大多数情况下,默认设置就可以了。 此文件中的所有设置都通过整个文件中的信息注释进行记录。
对于本教程,您将需要编辑 Zabbix 代理设置以设置其与 Zabbix 服务器 的连接。 在文本编辑器中打开代理配置文件:
sudo nano /etc/zabbix/zabbix_agent2.conf
默认情况下,代理被配置为向与代理相同主机上的服务器发送数据,因此您需要添加 Zabbix 服务器 的 IP 地址。 找到以下部分:
/etc/zabbix/zabbix_agent2.conf
... ### Option: Server # List of comma delimited IP addresses, optionally in CIDR notation, or DNS names of Zabbix servers and Zabbix proxies. # Incoming connections will be accepted only from the hosts listed here. # If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally # and '::/0' will allow any IPv4 or IPv6 address. # '0.0.0.0/0' can be used to allow any IPv4 address. # Example: Server=127.0.0.1,192.168.1.0/24,::1,2001:db8::/32,zabbix.example.com # # Mandatory: yes, if StartAgents is not explicitly set to 0 # Default: # Server= Server=127.0.0.1 ...
将默认值更改为您的 Zabbix 服务器 的 IP:
/etc/zabbix/zabbix_agent2.conf
... Server=zabbix_server_ip_address ...
默认情况下,Zabbix 服务器连接到代理。 但是对于某些检查(例如,监控日志),需要反向连接。 为了正确操作,您需要指定 Zabbix 服务器地址和唯一的主机名。
找到配置活动检查的部分并更改默认值,如下所示:
/etc/zabbix/zabbix_agent2.conf
... ##### Active checks related ### Option: ServerActive # List of comma delimited IP:port (or DNS name:port) pairs of Zabbix servers and Zabbix proxies for active checks. # If port is not specified, default port is used. # IPv6 addresses must be enclosed in square brackets if port for that host is specified. # If port is not specified, square brackets for IPv6 addresses are optional. # If this parameter is not specified, active checks are disabled. # Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1] # # Mandatory: no # Default: # ServerActive= ServerActive=zabbix_server_ip_address ### Option: Hostname # Unique, case sensitive hostname. # Required for active checks and must match hostname as configured on the server. # Value is acquired from HostnameItem if undefined. # # Mandatory: no # Default: # Hostname= Hostname=Docker server ...
保存并关闭文件。
要让 Zabbix 代理监控 Docker,您需要将 zabbix
用户添加到 docker
组:
sudo usermod -aG docker zabbix
现在您可以重新启动 Zabbix 代理并将其设置为在启动时启动:
sudo systemctl restart zabbix-agent2 sudo systemctl enable zabbix-agent2
为了更好地衡量,检查 Zabbix 代理是否正常运行:
sudo systemctl status zabbix-agent2
输出将与此类似,表明代理正在运行:
Output● zabbix-agent2.service - Zabbix Agent 2 Loaded: loaded (/lib/systemd/system/zabbix-agent2.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2021-09-03 07:05:05 UTC; 1min 23s ago ...
代理将在端口 10050
上侦听来自服务器的连接。 配置 UFW 以允许连接到此端口:
sudo ufw allow 10050/tcp
您可以在 如何在 Ubuntu 20.04 上使用 UFW 设置防火墙中了解有关 UFW 的更多信息。
在这一步中,您安装了 Zabbix 代理 2,将其配置为允许来自 Zabbix 服务器 的连接,并准备监控 Docker。
您的代理现在已准备好将数据发送到 Zabbix 服务器。 但为了使用它,您必须从服务器的 Web 控制台链接到它并启用 Docker 模板。 在下一步中,您将完成配置。
第 2 步 — 将新主机添加到 Zabbix 服务器
在您要监控的服务器上安装代理只是整个过程的一半。 您要监控的每个主机都需要在 Zabbix 服务器 上注册,您可以通过 Web 界面进行注册。 您还需要将适当的模板连接到它。 使用模板,您可以将相同的监控项、触发器、图表和低级发现规则应用于多个主机。 当模板链接到主机时,模板的所有实体(项目、触发器、图表等)都将添加到主机。
通过导航到地址 http://zabbix_server_name
或 https://zabbix_server_name
登录到 Zabbix 服务器 Web 界面。 (如先决条件中链接的教程中所述,如何在 Ubuntu 20.04 上安装和配置 Zabbix 以安全监控远程服务器,默认用户为 Admin,密码为 zabbix.)
登录后,点击左侧导航栏中的Configuration,然后点击Hosts。 然后点击屏幕右上角的【X15X】创建主机【X30X】按钮。 这将打开主机配置页面。
调整 主机名 和 IP 地址 以反映您的 Docker 服务器 的主机名和 IP 地址,然后将主机添加到组中。 您可以选择现有组,例如 Linux 服务器,或创建自己的组,例如 Docker 服务器。 每个主机必须在一个组中,也可以在多个组中。 为此,请在 Groups 字段中输入现有或新组的名称,然后从建议的列表中选择所需的值。
添加组后,单击模板选项卡。
要启用必要的检查,您需要添加一个模板。 该模板包括所有必要的检查、触发器和图表。 主机可以有多个模板。 为此,请在 Search 字段中输入模板的名称,然后从建议的列表中选择它。
对于本教程,键入 Template App Docker,然后从列表中选择它以将此模板添加到主机。 这会将模板中预先配置的 Docker 监控所需的所有项目、触发器和图表附加到主机。
最后,点击表单底部的Add按钮创建主机。
您将在列表中看到您的新主机。 等待一分钟并重新加载页面以查看绿色标签,表明一切正常。
在此步骤中,您向服务器添加了一个新主机,并使用现成的模板来添加所需的检查。
Zabbix 服务器 现在正在监控您的 Docker 服务器。 在下一步中,您将启动一个测试容器并探索 Zabbix 可以收集哪些指标。
第 3 步 — 访问 Docker 指标
如果您在新环境中运行本教程,那么您没有运行容器,也没有需要监控的内容。 在此步骤中,您将启动一个测试容器并查看可用的指标。 在本教程中,您将运行基于 ubuntu
的测试容器。
在 Docker 服务器 上运行以下命令:
sudo docker run --name test_container -it ubuntu bash
这将使用 ubuntu:latest
映像启动一个名为 test_container 的测试容器。 -it
标志指示 Docker 分配一个伪 TTY 连接到容器的 标准输入 ,在容器中创建一个交互式 bash
shell。
输出将类似于以下内容:
OutputUnable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 35807b77a593: Pull complete Digest: sha256:9d6a8699fb5c9c39cf08a0871bd6219f0400981c570894cd8cbea30d3424a31f Status: Downloaded newer image for ubuntu:latest
注意: 不要离开外壳,因为您将在下一步中使用它。
启动容器几分钟后,Zabbix 将自动找到一个新容器并添加适当的指标。
要查看所有指标的列表,请单击左侧导航栏中的 Monitoring,然后单击 Hosts。 然后点击对应行的【X11X】最新数据【X26X】。
您将看到一个表格,其中包含 Zabbix 代理为给定主机收集的所有指标。 对于每个项目,您可以看到名称、历史存储期限、最后一次检查的时间和最后一个值。
您可以滚动列表并查看与 test_container 关联的指标。 您也可以在 Name 字段中输入容器的名称,然后单击 Apply 以查找所有相关指标。
要查看特定指标的更改历史记录,请单击 Graph(用于数值)或 History(用于文本值)。
您也可以在列表中选择一个或多个指标,然后单击列表最底部的显示图形按钮,一起查看多个图形。
在这一步中,您启动了一个测试容器并在 Zabbix Web 界面中查看了它的指标。 接下来,您将触发通知。
第 4 步 — 生成测试警报
在这一步中,您将通过模拟容器的意外关闭来了解监控是如何工作的,这会触发来自 Zabbix 的通知。
从模拟容器崩溃开始。 在容器外壳中执行以下命令:
exit 1
使用此命令,您终止了带有错误代码 1
的容器。 此退出代码将传递给 docker run
的调用者,并记录在测试容器的元数据中。
要查看警报,请单击 Zabbix Web 界面左侧导航栏中的 Monitoring,然后单击 Dashboard。 在一分钟或更短的时间内,您将看到“容器已停止并出现错误代码”的通知:
如果您之前配置过电子邮件或其他通知,您还会收到类似以下的消息:
Problem started at 11:17:31 on 2021.09.03 Problem name: Container /test_container: Container has been stopped with error code Host: Docker Server Severity: Average Operational data: 1 Original problem ID: 103
检查通知后,您可以重新启动容器,问题将自动消失。
要重新启动容器,请在 Docker 服务器 上运行以下命令。
sudo docker start test_container
您可以使用以下命令检查容器是否正在运行:
sudo docker ps
输出将类似于以下内容:
OutputCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c9b8a264c2e1 ubuntu "bash" 23 minutes ago Up 7 seconds test_container
要查看 Zabbix 界面中所有警报的历史记录,请单击左侧导航栏中的 Monitoring,然后单击 Problems。 您可以使用选项和过滤器来查看特定时间段、特定主机等的事件。 要查看历史记录,请选择选项 显示:历史记录
在这一步中,您模拟了容器崩溃并在 Zabbix 中收到了通知。
结论
在本教程中,您学习了如何设置一个简单的监控解决方案来帮助您跟踪 Docker 容器的运行状况。 现在它可以提醒您注意问题,并且您可以分析 Docker 应用程序中发生的过程。
使用 Zabbix,您不仅可以监控容器,还可以使用现成的 Zabbix 官方模板 监控服务器、数据库、Web 应用程序等等 。
要了解有关监控基础设施的更多信息,请查看我们的 监控主题页面 。