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. 添加执行权限)
[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. 容器编排步骤
- 创建一个目录
- 创建一个
docker-compose.yaml文件,定义服务 - 使用
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.cfgHAProxy 负载均衡的核心配置文件。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 步:配置中文界面
- 点击左下角或侧边栏 Administration (管理) → Users (用户)。
- 点击 Admin 用户。
- 在 Language (语言) 下拉框中选择 Chinese (zh_CN)。
- 点击 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