Docker Compose 容器编排实战:从入门到 LNMP 环境部署-zabbix监控

Docker Compose 容器编排实战:从入门到 LNMP 环境部署

前言

在微服务和容器化应用日益普及的今天,手动管理成百上千个容器无疑是一场噩梦。如何高效地定义、启动和管理多容器应用?Docker Compose 应运而生。它允许我们通过一个简洁的 YAML 文件来定义整个应用栈,实现一键部署。本文将带你深入了解 Docker Compose 的核心概念、YAML 语法,并通过 HAProxy 负载均衡和 LNMP 环境部署两个实战案例,助你轻松掌握容器编排技能。

目录

[Docker Compose 容器编排实战:从入门到 LNMP 环境部署](#Docker Compose 容器编排实战:从入门到 LNMP 环境部署)

前言

一、容器编排部署

[1. 编排部署作用](#1. 编排部署作用)

[2. 编排部署工具](#2. 编排部署工具)

[️ 二、Docker Compose](#️ 二、Docker Compose)

[1. Docker Compose 作用](#1. Docker Compose 作用)

[2. Docker Compose 定义方法](#2. Docker Compose 定义方法)

[3. 容器编排步骤](#3. 容器编排步骤)

[4. Docker Compose 工具安装](#4. Docker Compose 工具安装)

[1. 确认当前系统架构](#1. 确认当前系统架构)

[2. 删除错误的文件](#2. 删除错误的文件)

[3. 下载正确的 docker-compose](#3. 下载正确的 docker-compose)

[4. 添加执行权限](#4. 添加执行权限)

5.Docker-compose的常用命令

[6. 验证安装](#6. 验证安装)

[三、YAML 文件](#三、YAML 文件)

[1. 基本语法](#1. 基本语法)

[2. YAML 支持以下几种数据类型](#2. YAML 支持以下几种数据类型)

[3. Docker Compose 常见语法](#3. Docker Compose 常见语法)

[️ 四、案例:HAProxy 应用](#️ 四、案例:HAProxy 应用)

[✅ 最终目标目录结构](#✅ 最终目标目录结构)

[🛠️ 创建目录与文件](#🛠️ 创建目录与文件)

[步骤 1:创建主目录并进入](#步骤 1:创建主目录并进入)

[步骤 2:创建 web/ 目录及其中的构建文件](#步骤 2:创建 web/ 目录及其中的构建文件)

[创建 web/Dockerfile](#创建 web/Dockerfile)

[创建 web/run-httpd.sh](#创建 web/run-httpd.sh)

[创建 web/index.html(为区分容器,我们给每个容器加唯一标识------但当前是相同镜像,所以先用简单内容;后续可扩展)](#创建 web/index.html(为区分容器,我们给每个容器加唯一标识——但当前是相同镜像,所以先用简单内容;后续可扩展))

[✅ 推荐方案:用固定内容 + 后续通过环境变量或健康检查验证负载均衡](#✅ 推荐方案:用固定内容 + 后续通过环境变量或健康检查验证负载均衡)

[根据当前目录下的 Dockerfile 构建一个名为 centos-httpd:v1 的 Docker 镜像](#根据当前目录下的 Dockerfile 构建一个名为 centos-httpd:v1 的 Docker 镜像)

[步骤 3:创建 haproxy.cfg 配置文件](#步骤 3:创建 haproxy.cfg 配置文件)

[创建 haproxy.cfg](#创建 haproxy.cfg)

[步骤 4:创建 docker-compose.yml](#步骤 4:创建 docker-compose.yml)

[🧪 验证目录结构(执行此命令查看)](#🧪 验证目录结构(执行此命令查看))

[▶️ 启动服务](#▶️ 启动服务)

[🔍 验证负载均衡](#🔍 验证负载均衡)

[方法 1:用 curl 多次请求(观察是否轮询)](#方法 1:用 curl 多次请求(观察是否轮询))

[🗑️ 清理](#🗑️ 清理)

[✅ 总结:目录放置要点](#✅ 总结:目录放置要点)

[五、部署:LNMP 环境](#五、部署:LNMP 环境)

第一步:创建项目目录结构

[第二步:编写 Docker Compose 编排文件](#第二步:编写 Docker Compose 编排文件)

[第三步:编写 Nginx 配置文件](#第三步:编写 Nginx 配置文件)

[第四步:创建 PHP 测试页面](#第四步:创建 PHP 测试页面)

第五步:一键启动所有服务

第六步:检查运行状态

第七步:浏览器验证

[六、Docker Compose 常用命令](#六、Docker Compose 常用命令)

[【运维实战】Docker Compose 一键部署 Zabbix 6.0 LTS 监控系统(MySQL版)](#【运维实战】Docker Compose 一键部署 Zabbix 6.0 LTS 监控系统(MySQL版))

[部署 Zabbix 6.0 LTS](#部署 Zabbix 6.0 LTS)

[第 1 步:创建 Zabbix 项目目录](#第 1 步:创建 Zabbix 项目目录)

[第 2 步:编写 Zabbix 的 docker-compose.yml](#第 2 步:编写 Zabbix 的 docker-compose.yml)

[第 3 步:启动 Zabbix](#第 3 步:启动 Zabbix)

[第 4 步:验证所有容器](#第 4 步:验证所有容器)

[🔵 第四阶段:访问与验证](#🔵 第四阶段:访问与验证)

[第 5 步:访问 Zabbix Web 界面](#第 5 步:访问 Zabbix Web 界面)

[第 6 步:配置中文界面](#第 6 步:配置中文界面)

[第 7 步:验证监控数据](#第 7 步:验证监控数据)

日常运维命令


一、容器编排部署

1. 编排部署作用

​ 随着应用架构变得越来越复杂,单个容器往往无法满足需求。我们通常需要多个容器协同工作,例如 Web 服务器、应用服务器和数据库。容器编排就是为了解决这个问题而生的。

  • 实现复杂互联:轻松定义和管理多个容器应用之间的网络通信和依赖关系。
  • 降低部署成本:通过一个配置文件和一条命令,即可启动整个复杂的应用环境,极大地减少了重复劳动和出错概率。

2. 编排部署工具

  • Docker Compose
    • 通过一个文件定义多个容器应用之间的关系
  • Docker Swarm
    • 用于管理 Docker Host
    • 把 Docker Host 生成一个集群
    • 可以使用 YAML 文件实现复杂容器应用编排
  • Kubernetes (k8s)
    • 基于 Google 公司 Borg 系统的开源
    • 现在归云原生计算基金会(CNCF)管理
    • 能够实现复杂容器应用的编排部署
    • 容器自动装箱功能
    • 容器滚动更新及回滚
    • 容器水平扩展
    • 容器云平台使用 Kubernetes 完成核心功能

️ 二、Docker Compose

1. Docker Compose 作用

  • 在一个文件中定义复杂的容器应用之间的关系,用一个命令即可执行
  • YAML 格式文件(类似 html、xml 格式文件)
  • Docker Compose 使用 YAML 文件启动容器

2. Docker Compose 定义方法

  • 工程 (Project):一个目录
  • 服务 (Service):用于定义容器资源(镜像、网络、依赖、容器)
  • 容器 (Container):用于运行服务

3. 容器编排步骤

  1. 创建一个目录
  2. 创建一个 docker-compose.yaml 文件,定义服务
  3. 使用 docker-compose 命令启动服务

4. Docker Compose 工具安装

1. 确认当前系统架构

首先,我们需要知道你的服务器架构,以便下载对应版本的 docker-compose。通常服务器是 x86_64(即 amd64)架构。

复制代码
uname -m

如果输出是 x86_64,则继续下一步。

2. 删除错误的文件

当前 /usr/local/bin/docker-compose 是一个错误的 HTML 文件,需要先删除它:

复制代码
sudo rm /usr/local/bin/docker-compose
3. 下载正确的 docker-compose

前往 Docker Compose 的官方 GitHub 发布页面,找到最新的稳定版本(例如 v2.12.2 或更高,具体版本号请以官网为准)。

对于 Linux x86_64 系统,下载命令如下(这里以 v2.37.1 为例,请根据实际需求替换最新版本号):

复制代码
sudo curl -L "https://github.com/docker/compose/releases/download/v2.37.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • $(uname -s) 会替换为 Linux
  • $(uname -m) 会替换为 x86_64(或其他架构)。
4. 添加执行权限

下载完成后,需要给该文件添加可执行权限:

复制代码
chmod +x /usr/local/bin/docker-compose
5.Docker-compose的常用命令
复制代码
build :构建或重新构建服务
kill :强制停止服务容器
logs :查看服务的输出
port :打印绑定的公共端口
ps :列出所有容器
pull :拉取服务所需镜像
up :构建并启动容器
6. 验证安装

现在再次检查版本,确认是否恢复正常:

复制代码
docker-compose --version

如果输出类似 Docker Compose version v2.37.1,则说明问题已解决。


三、YAML 文件

YAML 是一个可读性高,用来表达数据序列化的格式。

1. 基本语法

  • 大小写敏感
  • 使用缩进表示层级关系
  • 缩进不允许使用 tab,只允许空格
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • # 表示注释

2. YAML 支持以下几种数据类型

  • 对象:键值对的集合,又称为映射 (mapping) / 哈希 (hashes) / 字典 (dictionary)。

    • 键值对使用冒号结构表示 key: value,冒号后面要加一个空格

      key: value

      或者

      key:
      child-key1: value1
      child-key2: value2

  • 数组:一组按次序排列的值,又称为序列 (sequence) / 列表 (list)。

    • - 开头的行表示构成一个数组

      languages:
      - html
      - java
      - Python

  • 纯量 (scalars):单个的、不可再分的值。(就是一个具体的数值)

    • 纯量是最基本的,不可再分的值

    • 包括:字符串、布尔值、整数、浮点数、Null、时间、日期

      boolean:
      - TRUE # true, True 都可以
      - FALSE # false, False 都可以
      float:
      - 3.14
      - 6.8523015e+5 # 可以使用科学计数法
      int:
      - 123
      null:
      nodeName: 'node'
      parent: ~ # 使用 ~ 表示 null
      string:
      - 哈哈
      - 'Hello world' # 可以使用双引号或者单引号包裹特殊字符
      - newline
      date:
      - 2018-02-17 # 日期必须使用 ISO 8601 格式,即 yyyy-MM-dd
      datetime:
      - 2018-02-17T15:02:31+08:00 # 时间使用 ISO 8601 格式,时间和日期之间使用 T 连接,最后使用 + 代表时区

3. Docker Compose 常见语法

  • build:指定镜像构建时的 Dockerfile 目录,格式一般为绝对路径目录或相对路径目录(Dockerfile 需要命名为 Dockerfile)

    复制代码
    build: /path/dir
    # 或者
    build: ./dir
  • image:指定要启动容器的镜像,如果镜像不存在,Compose 尝试下载 (pull)

    复制代码
    image: centos:latest
    image: httpd:v1
    image: haproxy:latest
  • environment:设置镜像变量,它可以保存变量到镜像里面,也就是说启动的容器也会包含这些变量设置

    复制代码
    environment:
      RACK_ENV: development
      SHOW: 'true'
    # 或
    environment:
      - RACK_ENV=development
      - SHOW=true
  • expose:这个标签与 Dockerfile 中的 EXPOSE 指令一样,用于指定暴露的端口,但只将端口暴露给连接的服务,而不暴露给主机

    复制代码
    expose:
      - "80"
  • ports :映射端口,可以使用 HOST:CONTAINER 的方式指定端口,也可以指定容器端口(选择临时主机端口),宿主机会随机映射端口

    复制代码
    ports:
      - "80:80"
  • restart:指定 Docker 容器的重启策略

    复制代码
    restart: "no"
    restart: always
    restart: on-failure
    restart: unless-stopped
  • volumes :数据卷挂载,可以直接使用 HOST:CONTAINER 这样的格式,或者使用 HOST:CONTAINER:ro 这样的格式,ro 代表数据卷是只读

    复制代码
    volumes:
      # 只是指定一个路径,Docker 会自动在创建一个数据卷(这个路径是容器内部的)
      - /var/lib/mysql
      # 使用绝对路径挂载数据卷
      - /opt/data:/var/lib/mysql
      # 已经存在的命名的数据卷
      - datavolume:/var/lib/mysql
  • links:链接到其它服务的中的容器,与 link 连接一样效果,会连接到其它服务中的容器

    复制代码
    web:
      links:
        - db
        - mysql
  • depends_on:此标签解决了容器的依赖、启动先后的问题

    复制代码
    web:
      depends_on:
        - mysql
        - redis

️ 四、案例:HAProxy 应用

Docker Compose 容器编排,创建 1 个 HAProxy 容器和 3 个 Web 容器,实现负载均衡。


✅ 最终目标目录结构

复制代码
haproxypro/
├── docker-compose.yml
├── haproxy.cfg
└── web/
    ├── Dockerfile
    ├── run-httpd.sh
    └── index.html

💡 说明:

  • haproxypro/ 是项目根目录。
  • web/ 存放构建 Web 镜像所需的文件。
  • haproxy.cfg HAProxy 负载均衡的核心配置文件。
  • docker-compose.yml 是编排核心。

🛠️ 创建目录与文件

步骤 1:创建主目录并进入

复制代码
# 创建项目根目录
mkdir -p haproxypro && cd haproxypro

步骤 2:创建 web/ 目录及其中的构建文件

复制代码
mkdir -p web
创建 web/Dockerfile
复制代码
cat > web/Dockerfile << 'EOF'
FROM centos:7.7.1908
MAINTAINER "wenteacher@163.com"
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
RUN yum clean all
RUN yum -y install httpd
ADD run-httpd.sh /run-httpd.sh
RUN chmod -v +x /run-httpd.sh
ADD index.html /var/www/html/
EXPOSE 80
WORKDIR /
CMD ["/bin/bash","/run-httpd.sh"]
EOF
创建 web/run-httpd.sh
复制代码
cat > web/run-httpd.sh << 'EOF'
#!/bin/bash
/usr/sbin/httpd -D FOREGROUND
EOF
创建 web/index.html(为区分容器,我们给每个容器加唯一标识------但当前是相同镜像,所以先用简单内容;后续可扩展)
复制代码
cat > web/index.html << 'EOF'
<h1>✅ Web Server: $(hostname)</h1>
<p>Container ID: $(hostname)</p>
<p>Time: $(date)</p>
EOF

🔍 注意:$(hostname) 在构建时不会展开(因为是在宿主机写入),但在容器运行时,由 /bin/bash 解释执行。

✅ 实际上,index.html 是静态文件,不能动态执行 shell 命令

所以更稳妥的做法是:在构建时生成带容器名的 HTML ,或使用模板(如用 envsubst),但为简化,我们改用以下方式:

✅ 推荐方案:用固定内容 + 后续通过环境变量或健康检查验证负载均衡

我们改为静态内容,但为区分容器,在构建镜像时不区分 ,而靠 HAProxy 日志或 curl -H "Host: localhost" + 查看后端日志来验证轮询。

所以简化 index.html 为:

复制代码
echo "test httpd !!! (from $(hostname))" > web/index.html
# ❌ 错误!hostname 是宿主机名,不是容器名
# 正确做法:只写固定文本,后续通过访问时观察响应时间/HAProxy stats 页面验证

➡️ 最终采用(最稳妥):

复制代码
echo "test httpd !!!" > web/index.html

⚠️ 如果你想看到不同容器返回不同内容,可在构建镜像时用 --build-arg 或分三次构建不同镜像(如 myweb:1, myweb:2, myweb:3),但本例保持简单统一。

根据当前目录下的 Dockerfile 构建一个名为 centos-httpd:v1 的 Docker 镜像
复制代码
docker build -t centos-httpd:v1  .

步骤 3:创建 haproxy.cfg 配置文件

创建 haproxy.cfg
复制代码
cat > haproxy.cfg << 'EOF'
# 全局配置段
global
    # 日志输出到标准输出,适配docker容器
    log stdout format raw local0 info
    maxconn 4096
    user haproxy
    group haproxy

# 默认参数段,所有前端后端继承
defaults
    mode http                  # 七层http负载均衡
    log global
    option httplog
    option dontlognull
    timeout connect 5s
    timeout client  30s
    timeout server  30s

# 前端:监听宿主机80端口
frontend http_front
    bind *:80
    default_backend web_pool

# 后端:三台web服务(容器名weba/webb/webc,links互通直接写容器名:端口)
backend web_pool
    balance roundrobin         # 轮询负载均衡,和你curl轮流返回111/222/333匹配
    # check:健康检查,自动剔除故障web节点
    server weba weba:80 check inter 3s fall 3 rise 2
    server webb webb:80 check inter 3s fall 3 rise 2
    server webc webc:80 check inter 3s fall 3 rise 2

# 可选:监控页面(127.0.0.1:8404 查看负载均衡状态)
listen stats
    bind *:8404
    stats enable
    stats uri /stats
    stats auth admin:123456
EOF
cp haproxy.cfg  /root/

步骤 4:创建 docker-compose.yml

复制代码
cat > docker-compose.yml << 'EOF'
services:
  weba:
    image: centos-httpd:v1
  webb:
    image: centos-httpd:v1
  webc:
    image: centos-httpd:v1
  haproxy:
    image: haproxy:2.0.29-alpine
    volumes:
      - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    links:
      - weba
      - webb
      - webc
    expose:
      - "80"
      - "8404"
    ports:
      - "80:80"
      - "8404:8404"
EOF

✅ 关键点:

  • build: ./web 表示每个 web 容器都从 ./web 目录构建镜像(会复用同一镜像,但启动为不同容器)。
  • 使用自定义网络 app_net 确保服务名(如 web1)可解析。
  • container_name 可选,但有助于调试;若省略,Docker 会自动生成名称(如 haproxypro_web1_1)。

🧪 验证目录结构(执行此命令查看)

复制代码
tree .

预期输出:

复制代码
.
├── docker-compose.yml
├── haproxy.cfg
└── web
    ├── Dockerfile
    ├── index.html
    └── run-httpd.sh

3 directories, 5 files

▶️ 启动服务

复制代码
# 后台启动所有服务
docker-compose up -d

📝 第一次构建可能较慢(下载 CentOS 镜像 + 安装 httpd),之后会快很多


🔍 验证负载均衡

方法 1:用 curl 多次请求(观察是否轮询)

复制代码
# doocker ps
CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS                 PORTS                               NAMES
14f0bf5dee19   haproxy:2.0.29-alpine              "docker-entrypoint.s..."   8 seconds ago   Up 7 seconds           0.0.0.0:80->80/tcp, :::80->80/tcp   haproxypro-haproxy-1
9bd6c88a495d   centos-httpd:v1                    "/bin/bash /run-http..."   8 seconds ago   Up 7 seconds           80/tcp                              haproxypro-webb-1
ab47a9a6d108   centos-httpd:v1                    "/bin/bash /run-http..."   8 seconds ago   Up 7 seconds           80/tcp                              haproxypro-webc-1
5b182047d4a4   centos-httpd:v1      

# docker exec 9bd6c88a495d bash -c "echo 111 > /var/www/html/index.html"
# docker exec ab47a9a6d108 bash -c "echo 222 >/var/www/html/index.html"
# docker exec 5b182047d4a4 bash -c "echo 333 > /var/www/html/index.html"

输出示例,但可通过 HAProxy 统计确认轮询):

复制代码
[root@node1 haproxypro]# curl http://192.168.30.153
111
[root@node1 haproxypro]# curl http://192.168.30.153
222
[root@node1 haproxypro]# curl http://192.168.30.153
333

查看监控面板

浏览器访问http://192.168.30.153:8404/stats,账号admin 密码123456。

🗑️ 清理

复制代码
docker-compose down
# 可选:删除构建的镜像(避免占用空间)
docker rmi myweb:1.0
# 清除所有以关闭的容器
docker container prune

✅ 总结:目录放置要点

路径 作用
./web/Dockerfile 定义 Web 容器构建过程
./web/run-httpd.sh 启动 Apache 的脚本(前台运行)
./web/index.html 静态首页(内容简单即可)
./haproxy/haproxy.cfg HAProxy 主配置,指定后端 3 个 web 服务
./docker-compose.yml 编排核心:定义 1 个 HAProxy + 3 个 Web 服务 + 网络

五、部署:LNMP 环境

第一步:创建项目目录结构

我们首先在根目录下创建一个 lnmp 文件夹,并建立好 Nginx 配置、网站代码和 MySQL 数据所需的子目录:

复制代码
mkdir -pv /opt/lnmp/{nginx/conf.d,php,mysql/data,www}
cd /opt/lnmp

第二步:编写 Docker Compose 编排文件

在当前目录下创建 docker-compose.yaml 文件:

将以下内容完整粘贴进去(这里包含了 Nginx、PHP、MySQL 以及它们之间的内部网络配置):

复制代码
cat > docker-compose.yml <<'EOF'
services:
  nginx:
    image: nginx:1.24-alpine
    container_name: lnmp_nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./www:/usr/share/nginx/html
      - ./nginx/logs:/var/log/nginx
    depends_on:
      - php
    networks:
      - lnmp_net
    restart: always

  php:
    image: php:8.1-fpm-alpine
    container_name: lnmp_php
    volumes:
      - ./www:/var/www/html
      - ./php/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro
    networks:
      - lnmp_net
    restart: always

  mysql:
    image: mysql:8.0
    container_name: lnmp_mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: RootPass!123
      MYSQL_DATABASE: app_db
      MYSQL_USER: app_user
      MYSQL_PASSWORD: AppPass!123
    volumes:
      - ./mysql/data:/var/lib/mysql
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    networks:
      - lnmp_net
    restart: always

networks:
  lnmp_net:
    driver: bridge
EOF

第三步:编写 Nginx 配置文件

为了让 Nginx 能够正确解析 PHP,我们需要在 Nginx 的配置目录中写入 default.conf

将以下 Nginx 配置粘贴进去:

复制代码
cat > ./nginx/conf.d/default.conf <<'EOF'
server {
    listen 80;
    server_name localhost;
    root /usr/share/nginx/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}
EOF

第四步:创建 PHP 测试页面

在网站代码目录中创建一个简单的 PHP 文件,用于后续验证环境:

复制代码
mkdir -p ./php
cat > ./php/php.ini <<'EOF'
upload_max_filesize = 64M
post_max_size = 64M
date.timezone = Asia/shanxitaiyuan
EOF

cat > ./www/index.php <<'EOF'
<?php phpinfo(); ?>
EOF

第五步:一键启动所有服务

现在,所有的配置文件都已就绪。执行以下命令,Docker 会自动拉取所需的镜像并在后台启动它们:

复制代码
cd /opt/lnmp
docker compose up -d

第六步:检查运行状态

等待几十秒(首次运行需要下载镜像),然后查看容器的运行状态:

复制代码
docker-compose ps

如果看到三个容器的 State 都是 Up,说明启动成功。

第七步:浏览器验证

在虚拟机里面: curl http://localhost

打开你电脑上的浏览器,在地址栏输入: http://你的服务器IP


六、Docker Compose 常用命令

复制代码
# 停止并删除容器
[root@wen ~]# docker-compose down
# 启动应用
[root@wen ~]# docker-compose up -d
# 查看应用需要的容器
[root@wen ~]# docker-compose ps
# 查看 docker-compose 配置文件(yml文件)
[root@wen ~]# docker-compose config
# 进入某个容器
[root@wen ~]# docker-compose exec mysql /bin/bash
# 查看应用用到那些镜像
[root@wen ~]# docker-compose images
# 暂停一个容器
[root@wen ~]# docker-compose pause mysql
# 恢复一个容器
[root@wen ~]# docker-compose unpause mysql
# 停止应用
[root@wen ~]# docker-compose stop
# 开启应用
[root@wen ~]# docker-compose start

【运维实战】Docker Compose 一键部署 Zabbix 6.0 LTS 监控系统(MySQL版)

摘要:本文详细介绍了如何使用 Docker Compose 在 Linux 环境下快速部署 Zabbix 6.0 LTS 企业级监控平台。采用 MySQL 8.0 作为数据库后端,包含 Server、Web (Nginx)、Agent 及 Database 的全套容器化配置,并附带初始化验证与日常运维命令。


部署 Zabbix 6.0 LTS

Zabbix 官方从 6.0 版本起强制要求 MySQL 启用 log_bin_trust_function_creators=1(如果开启了 binlog),下面的配置中已包含此设置。

第 1 步:创建 Zabbix 项目目录

首先创建工作目录以及用于持久化存储的挂载目录:

复制代码
mkdir -p /opt/zabbix/{mysql-data,alertscripts,externalscripts,zbx_env}
cd /opt/zabbix

第 2 步:编写 Zabbix 的 docker-compose.yml

在项目目录下创建 docker-compose.yml 文件,内容如下:

复制代码
version: '3'

services:
  # 1. MySQL 数据库服务
  mysql:
    image: mysql:8.0
    container_name: zabbix-mysql
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_bin
      - --default-authentication-plugin=mysql_native_password
      - --log-bin-trust-function-creators=1
    environment:
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: ZabbixPass123
      MYSQL_ROOT_PASSWORD: RootPass123
    volumes:
      - ./mysql-data:/var/lib/mysql
    ports:
      - "3306:3306"
    networks:
      - zabbix-net
    restart: always
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "root", "-pRootPass123"]
      interval: 10s
      timeout: 5s
      retries: 5

  # 2. Zabbix Server 服务
  zabbix-server:
    image: zabbix/zabbix-server-mysql:6.0-centos-latest
    container_name: zabbix-server
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: ZabbixPass123
      MYSQL_ROOT_PASSWORD: RootPass123
    ports:
      - "10051:10051"
    volumes:
      - ./alertscripts:/usr/lib/zabbix/alertscripts
      - ./externalscripts:/usr/lib/zabbix/externalscripts
      - ./zbx_env:/var/lib/zabbix
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - zabbix-net
    restart: always

  # 3. Zabbix Web 界面 (Nginx + PHP)
  zabbix-web:
    image: zabbix/zabbix-web-nginx-mysql:6.0-centos-latest
    container_name: zabbix-web
    environment:
      DB_SERVER_HOST: mysql
      MYSQL_DATABASE: zabbix
      MYSQL_USER: zabbix
      MYSQL_PASSWORD: ZabbixPass123
      MYSQL_ROOT_PASSWORD: RootPass123
      ZBX_SERVER_HOST: zabbix-server
      PHP_TZ: Asia/Shanghai
    ports:
      - "8080:8080"
    depends_on:
      - mysql
      - zabbix-server
    networks:
      - zabbix-net
    restart: always

  # 4. Zabbix Agent (监控本机)
  zabbix-agent:
    image: zabbix/zabbix-agent:6.0-centos-latest
    container_name: zabbix-agent
    environment:
      ZBX_HOSTNAME: Zabbix server
      ZBX_SERVER_HOST: zabbix-server
      ZBX_SERVER_PORT: 10051
    ports:
      - "10050:10050"
    depends_on:
      - zabbix-server
    networks:
      - zabbix-net
    restart: always

networks:
  zabbix-net:
    driver: bridge

第 3 步:启动 Zabbix

进入目录并后台启动所有容器:

复制代码
cd /opt/zabbix
docker compose up -d

注意:观察启动日志(首次启动会进行 MySQL 初始化和 Zabbix 建表,可能需要 1-3 分钟):

复制代码
docker compose logs -f zabbix-server

看到类似 Zabbix server is running 的日志即表示启动成功,按 Ctrl+C 退出日志跟踪。

第 4 步:验证所有容器

执行以下命令检查状态:

复制代码
docker compose ps

预期看到 4 个容器均为 Up 状态:

容器名 端口 作用
zabbix-mysql 3306 Zabbix 数据库
zabbix-server 10051 Zabbix Server 核心
zabbix-web 8080 Web 管理界面
zabbix-agent 10050 监控被控主机

🔵 第四阶段:访问与验证

第 5 步:访问 Zabbix Web 界面

打开浏览器访问:http://<你的服务器IP>:8080

  • 默认用户名Admin (注意首字母大写)
  • 默认密码zabbix

⚠️ 安全提示 :登录后请立即修改默认密码!

路径:右上角头像 → User profile → Change password

第 6 步:配置中文界面

  1. 点击左下角或侧边栏 Administration (管理) → Users (用户)。
  2. 点击 Admin 用户。
  3. Language (语言) 下拉框中选择 Chinese (zh_CN)
  4. 点击 Update (更新),刷新页面即可生效。

第 7 步:验证监控数据

进入 Monitoring (监测) → Latest data (最新数据)。

筛选主机 Zabbix server,应能看到 CPU、内存、磁盘等监控项开始有数据流入(首次可能需等待几分钟)。


日常运维命令

以下是常用的维护指令,建议收藏:

复制代码
# 查看实时运行状态
docker compose ps

# 查看特定组件日志(排查报错用)
docker compose logs -f zabbix-server
docker compose logs -f zabbix-web

# 停止服务
docker compose stop

# 启动服务
docker compose start

# 彻底删除容器和数据(慎用!会清空数据库)
docker compose down -v

# 升级镜像到最新版本
docker compose pull
docker compose up -d
相关推荐
带娃的IT创业者1 小时前
原生体验的回归:深入解析 TREK —— 专为 Apple Silicon 打造的轻量级容器方案
macos·docker·虚拟化·开源项目·容器化·apple silicon·trek
爱吃龙利鱼2 小时前
K8s 运维体系搭建:全组件监控与日志收集实战(victoria-metrics-k8s-stack 0.87.0)
运维·容器·kubernetes
心如鉄补2 小时前
分布式链路追踪系统之docker-compose安装skywalking
分布式·docker·skywalking
冰封之寂13 小时前
Docker 资源管理终极指南:CPU、内存与 IO 的精细化控制
linux·运维·服务器·docker·云计算
9523615 小时前
Docker - 基础
运维·后端·docker·容器
Code_Ignis15 小时前
docker国内可用源(持续维护)
运维·docker·容器
水中加点糖21 小时前
Java中使用远程PlayWright进行网页接口测试(附Docker部署方式)
java·docker·web测试·devtools·playwright·ai自动化测试
梦梦代码精1 天前
PHP 还是 Java?LikeShop 多版本对比,附6条落地避坑建议
低代码·docker·开源·代码规范
张忠琳1 天前
【NVIDIA】k8s-device-plugin v0.19.3 NVIDIA k8s-device-plugin v0.19.3 核心插件模块深度分析之一
云原生·容器·架构·kubernetes·nvidia