compose.yaml
services: # --------------------------------------------------------------------------- # 1. 数据库服务 (MariaDB) # --------------------------------------------------------------------------- zabbix-db: image: mariadb:11.8 container_name: zabbix-db restart: always command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_bin - --default-authentication-plugin=mysql_native_password - --innodb-buffer-pool-size=1G - --innodb-log-file-size=256M - --max-connections=500 environment: MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix} MYSQL_USER: ${MYSQL_USER:-zabbix} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-zabbix_secret_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_secret_password} volumes: - db-data:/var/lib/mysql networks: - zabbix-net healthcheck: test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] interval: 10s timeout: 5s retries: 5 # --------------------------------------------------------------------------- # 2. Zabbix Server 服务 (MySQL/MariaDB 后端) # --------------------------------------------------------------------------- zabbix-server: image: zabbix/zabbix-server-mysql:alpine-7.4-latest container_name: zabbix-server restart: always ports: - "10051:10051" environment: DB_SERVER_HOST: zabbix-db MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix} MYSQL_USER: ${MYSQL_USER:-zabbix} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-zabbix_secret_password} MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_secret_password} ZBX_JAVAGATEWAY_ENABLE: "false" ZBX_CACHESIZE: "128M" ZBX_HISTORYCACHESIZE: "128M" ZBX_HISTORYINDEXCACHESIZE: "64M" ZBX_TRENDCACHESIZE: "64M" ZBX_VALUECACHE_SIZE: "256M" TZ: "Asia/Shanghai" volumes: - /etc/localtime:/etc/localtime:ro - zabbix-alertscripts:/usr/lib/zabbix/alertscripts - zabbix-externalscripts:/usr/lib/zabbix/externalscripts networks: - zabbix-net depends_on: zabbix-db: condition: service_healthy # --------------------------------------------------------------------------- # 3. Zabbix Web 前端 (Nginx + PHP-FPM) # --------------------------------------------------------------------------- zabbix-web-nginx: image: zabbix/zabbix-web-nginx-mysql:alpine-7.4-latest container_name: zabbix-web-nginx restart: always ports: - "8080:8080" - "8443:8443" environment: DB_SERVER_HOST: zabbix-db MYSQL_DATABASE: ${MYSQL_DATABASE:-zabbix} MYSQL_USER: ${MYSQL_USER:-zabbix} MYSQL_PASSWORD: ${MYSQL_PASSWORD:-zabbix_secret_password} ZBX_SERVER_HOST: zabbix-server PHP_TZ: "Asia/Shanghai" volumes: - /etc/localtime:/etc/localtime:ro networks: - zabbix-net depends_on: zabbix-db: condition: service_healthy zabbix-server: condition: service_started # --------------------------------------------------------------------------- # 4. Zabbix Agent 2 (监控宿主机自身) # --------------------------------------------------------------------------- zabbix-agent2: image: zabbix/zabbix-agent2:alpine-7.4-latest container_name: zabbix-agent2 restart: always ports: - "10050:10050" privileged: true pid: "host" environment: ZBX_SERVER_HOST: "zabbix-server,127.0.0.1" ZBX_HOSTNAME: "Zabbix server" volumes: - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /:/host:ro networks: - zabbix-net depends_on: - zabbix-server # ----------------------------------------------------------------------------- # 持久化 Data Volume # ----------------------------------------------------------------------------- volumes: db-data: driver: local zabbix-alertscripts: driver: local zabbix-externalscripts: driver: local # ----------------------------------------------------------------------------- # 网络配置 # ----------------------------------------------------------------------------- networks: zabbix-net: driver: bridge生产部署要点说明
环境凭据安全:强烈建议在
compose.yaml同级目录下新建一个.env文件,将密码替换为自定义安全字符串:代码段MYSQL_DATABASE=zabbix MYSQL_USER=zabbix MYSQL_PASSWORD=YourStrongDBPassword123! MYSQL_ROOT_PASSWORD=YourStrongRootPassword123!性能与缓存优化:在
zabbix-db中添加了参数--innodb-buffer-pool-size=1G,在zabbix-server中放大了ZBX_VALUECACHE_SIZE等缓存配置,避免中大型监控场景下的缓存瓶颈。健康检查依赖(Healthcheck):使用
depends_on: condition: service_healthy,确保 MariaDB 完全初始化并准备好接收连接后,Zabbix Server 才会启动建表,避免首次启动时 Server 因数据库未就绪而频繁崩溃重启。宿主机监控:Agent 2 挂载了
/var/run/docker.sock和根目录/host:ro,并开启pid: "host",可直接通过官方模板采集宿主机的 CPU、内存、磁盘以及 Docker 容器状态。
前端 Web 页面配置
登录 Zabbix Web 界面(默认端口
8080,初始账号密码Admin/zabbix)。点击左侧菜单Data collection->Hosts。
找到默认生成的
Zabbix server主机(如果禁用状态则启用它)。点击进入配置:
Host name:必须与
compose.yaml中环境变量ZBX_HOSTNAME: "Zabbix server"完全一致(区分大小写)。Interfaces(接口配置):选择Agent类型。
DNS name:填
zabbix-agent2(Docker 服务名/容器名)。Connect to:选择DNS。
Port:
10050。
保存后等待 1~2 分钟,页面上该主机的BX标识变为绿色,即代表连接成功。
监控外部物理机 / 其他服务器上的 Agent 2
如果你是在其他独立服务器上安装了 Zabbix Agent 2,需要将其连接回 Docker 运行的 Zabbix Server。
1. 外部服务器的zabbix_agent2.conf配置
修改 Agent 2 的配置文件(通常位于/etc/zabbix/zabbix_agent2.conf):
# 被动模式:允许来自 Zabbix Server 宿主机公网/内网 IP 的轮询请求 Server=192.168.1.100 # 主动模式:Agent 2 主动向 Zabbix Server 汇报数据 ServerActive=192.168.1.100:10051 # 本机标识:必须与 Web 界面添加 Host 时的 Host name 完全一致 Hostname=Web-Server-01(注意:将192.168.1.100替换为你运行 Zabbix Docker 的宿主机实际 IP)
修改后重启外部 Agent 2 服务:
systemctl restart zabbix-agent22. 前端 Web 页面添加该主机
路径:Data collection->Hosts-> 点击右上角Create host。
Host name:填写
Web-Server-01(对应 Agent 配置文件中的Hostname)。Templates:添加官方模板
Linux by Zabbix agent ZBX或System Performance by Zabbix agent。Interfaces-> AddAgent:
IP address:填写外部服务器的实际 IP。
Connect to:选择IP。
Port:
10050。
点击Add添加。