前言
在实际容器化运维中,手动使用docker run逐个启动 Nginx、MySQL、Redis、Web 应用等容器,需要重复配置端口映射、数据卷、网络、依赖关系,操作繁琐、易出错、难以维护。
Docker Compose 是 Docker 官方推出的多容器编排工具,通过一个docker‑compose.yml YAML 配置文件,统一定义服务、网络、数据卷,一条命令实现多容器一键启动、停止、重启、销毁,完美解决多容器应用部署难题。
本文从原理、安装、模板语法入手,提供 LNMP+WordPress、Nginx+Tomcat 集群、Linux 云桌面、Portainer 可视化面板、Zabbix 监控 5 个生产级完整实战案例,严格按照 PPT 内容整理,可直接复制部署。
一、Docker Compose 核心原理与架构
1. 什么是 Docker Compose
Docker Compose 用于控制 Docker 多容器集群 ,将复杂的 Docker 操作标准化、自动化。手动部署需要:搜索镜像→拉取镜像→运行容器→映射端口→挂载数据卷→配置网络;使用 Compose 只需:编写docker‑compose.yml → 执行docker‑compose up -d一键完成。
2. 整体架构
【此处插入第一张架构图:Docker Compose 控制 Nginx、MySQL、Redis、WebApp 容器】
- Docker Compose 读取
docker‑compose.yml配置文件; - 自动创建自定义桥接网络;
- 统一调度、控制所有容器的启动、停止、依赖关系;
- 容器间通过服务名通信,无需配置固定 IP。

3. Nginx+Tomcat 集群架构
【此处插入第二张架构图:Nginx 反向代理负载均衡 Tomcat 集群】 Nginx 作为反向代理入口,接收客户端请求,分发至后端多个 Tomcat 容器,实现负载均衡、高可用,一个 Tomcat 故障不影响整体服务。
二、Docker Compose 安装
推荐使用二进制包安装,直接下载官方编译好的文件:
# 下载二进制文件
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 赋予执行权限
chmod +x /usr/local/bin/docker-compose
# 验证安装
docker-compose --version
三、docker‑compose.yml 模板核心语法
模板默认名称:docker‑compose.yml,YAML 格式,分为 3 大模块:
- services:定义所有容器服务(核心)
- networks:自定义桥接网络,实现容器互通
- volumes:定义数据卷,实现数据持久化
基础示例
version: "3"
services:
webapp:
image: nginx
ports:
- "8001:80"
volumes:
- "/usr/share/nginx/html"
version: '3':语法版本,V3 为生产主流版本;services:服务集合,webapp为自定义服务名;image:使用的镜像;ports:端口映射;volumes:数据卷挂载。
常用指令说明
restart: unless‑stopped:容器异常自动重启;depends_on:定义容器启动先后顺序;environment:设置环境变量;command:容器启动命令;networks:加入自定义网络;volumes:挂载宿主机目录或命名卷。
四、五大生产级实战案例
案例 1:Docker Compose 一键部署 LNMP+WordPress 博客
实现 MySQL 数据库 + WordPress 应用,数据持久化,容器网络互通。
version: '3'
services:
wp-mysql:
image: swr.cn-north-1.myhuaweicloud.com/iivey/mysql:8.0.23
restart: unless-stopped
ports:
- "3306:3306"
volumes:
- /etc/localtime:/etc/localtime
- /dockerdata/wp/db:/var/lib/mysql
environment:
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress123
- MYSQL_ROOT_PASSWORD=root123
command:
- mysqld
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8
- --collation-server=utf8_bin
networks:
- wp_net
wordpress:
image: swr.cn-north-1.myhuaweicloud.com/iivey/wordpress:latest
restart: unless-stopped
ports:
- "80:80"
volumes:
- /etc/localtime:/etc/localtime
- /dockerdata/wp/www:/var/www/html
networks:
- wp_net
networks:
wp_net:
driver: bridge
启动:
docker-compose up -d
访问:http://宿主机IP,完成 WordPress 安装。
案例 2:Nginx+Tomcat 负载均衡集群
实现 Nginx 反向代理,后端 3 个 Tomcat 节点,支持高可用、负载均衡。

version: '3'
services:
nginx:
image: registry.cn-beijing.aliyuncs.com/iivey/nginx1.19:v3
restart: always
ports:
- "80:80"
networks:
- mynet
volumes:
- ./webapps:/usr/local/nginx/html
- ./nginx/logs:/usr/local/nginx/logs
- /etc/localtime:/etc/localtime
- ./nginx/nginx.conf:/usr/local/nginx/conf/nginx.conf
- ./nginx/conf.d/:/usr/local/nginx/conf/conf.d
depends_on:
- mysql
- tomcat01
- tomcat02
- tomcat03
tomcat01:
image: tomcat8.5:v2
restart: always
hostname: tomcat01
networks:
- mynet
volumes:
- ./webapps:/usr/local/apache-tomcat-8.5.63/webapps
- /etc/localtime:/etc/localtime
ulimits:
nofile:
soft: 65536
hard: 65536
tomcat02:
image: tomcat8.5:v2
restart: always
hostname: tomcat02
networks:
- mynet
volumes:
- ./webapps:/usr/local/apache-tomcat-8.5.63/webapps
- /etc/localtime:/etc/localtime
ulimits:
nofile:
soft: 65536
hard: 65536
tomcat03:
image: tomcat8.5:v2
restart: always
hostname: tomcat03
networks:
- mynet
volumes:
- ./webapps:/usr/local/apache-tomcat-8.5.63/webapps
- /etc/localtime:/etc/localtime
ulimits:
nofile:
soft: 65536
hard: 65536
mysql:
image: registry.cn-beijing.aliyuncs.com/iivey/mysql5.7:v1
restart: always
hostname: mysql
ports:
- "3306:3306"
volumes:
- ./mysql/mysqldb:/var/lib/mysql
- ./mysql/conf/my.cnf:/etc/my.cnf
- /etc/localtime:/etc/localtime:ro
networks:
- mynet
networks:
mynet:
driver: bridge
案例 3:Docker Compose 部署 Linux VNC 云桌面
基于 Ubuntu 系统,Web VNC 访问,可直接浏览器使用 Linux 桌面环境。
version: '3.5'
services:
ubuntu-xfce-vnc:
container_name: linux-desk
image: swr.cn-north-1.myhuaweicloud.com/iivey/linux-desk:v1.0
shm_size: "1gb"
ports:
- 5900:5900
- 6080:6080
environment:
- VNC_PASSWD=admin123456
- GEOMETRY=1280x720
- DEPTH=24
volumes:
- ./Downloads:/root/Downloads
- ./Documents:/root/Documents
- ./Pictures:/root/Pictures
- ./Videos:/root/Videos
- ./Music:/root/Music
- ./Desktop:/root/Desktop
restart: unless-stopped
访问:http://宿主机IP:6080,输入密码登录 Linux 桌面。
案例 4:部署 Portainer Docker 可视化管理面板
Portainer 提供 Web 界面,可视化管理 Docker 容器、镜像、网络、数据卷,替代命令行操作。
version: '3'
services:
portainer:
image: swr.cn-north-1.myhuaweicloud.com/iivey/portainer-ce:2.19.1
restart: always
ports:
- "9000:9000"
- "8000:8000"
command: -H unix:///var/run/docker.sock
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- portainer-data:/data
volumes:
portainer-data:
访问:http://宿主机IP:9000,创建管理员账号即可使用。
案例 5:Docker Compose 完整部署 Zabbix 监控平台
包含 MySQL、Zabbix‑Server、Web 前端、Java 网关、Agent 客户端,一键部署企业级监控系统。
version: '3'
services:
zabbix-web-nginx-mysql:
image: zabbix/zabbix-web-nginx-mysql:centos-6.4.17
restart: always
environment:
- DB_SERVER_HOST=zabbix-mysql
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=zabbix123
- MYSQL_ROOT_PASSWORD=root123
- ZBX_SERVER_HOST=zabbix-server-mysql
ports:
- 8080:8080
volumes:
- /etc/localtime:/etc/localtime
- ./fonts/DejaVuSans.ttf:/usr/share/zabbix/assets/fonts/DejaVuSans.ttf
networks:
- zabbix_net
depends_on:
- zabbix-mysql
- zabbix-server-mysql
zabbix-mysql:
image: mysql:8.0.32
restart: always
environment:
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=zabbix123
- MYSQL_ROOT_PASSWORD=root123
command:
- mysqld
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8
- --collation-server=utf8_bin
volumes:
- /etc/localtime:/etc/localtime
- ./db:/var/lib/mysql
networks:
- zabbix_net
zabbix-java-gateway:
image: zabbix/zabbix-java-gateway:centos-6.4.17
restart: always
volumes:
- /etc/localtime:/etc/localtime
networks:
- zabbix_net
zabbix-server-mysql:
image: zabbix/zabbix-server-mysql:centos-6.4.17
restart: always
volumes:
- zabbix-server-vol:/etc/zabbix
- ./alertscripts:/usr/lib/zabbix/alertscripts
- /etc/localtime:/etc/localtime
ports:
- 10051:10051
environment:
- DB_SERVER_HOST=zabbix-mysql
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=zabbix123
- MYSQL_ROOT_PASSWORD=root123
- ZBX_JAVAGATEWAY=zabbix-java-gateway
- ZBX_JAVAGATEWAY_ENABLE=true
- ZBX_JAVAGATEWAYPORT=10052
- ZBX_STARTPOLLERS=15
- ZBX_STARTTRAPPERS=10
- ZBX_STARTDISCOVERERS=5
depends_on:
- zabbix-mysql
networks:
- zabbix_net
zabbix-agent:
image: zabbix/zabbix-agent:centos-6.4.17
restart: always
ports:
- 10050:10050
environment:
- ZBX_HOSTNAME=Zabbix server
- ZBX_SERVER_HOST=zabbix-server-mysql
- ZBX_SERVER_PORT=10051
networks:
- zabbix_net
networks:
zabbix_net:
driver: bridge
volumes:
zabbix-server-vol:
五、Docker Compose 常用管理命令
# 后台启动所有服务
docker-compose up -d
# 查看容器运行状态
docker-compose ps
# 查看实时日志
docker-compose logs -f
# 停止所有容器(保留数据卷)
docker-compose stop
# 重启所有容器
docker-compose restart
# 停止并删除容器、网络(保留数据卷)
docker-compose down
# 彻底删除容器、网络、数据卷
docker-compose down -v
六、总结
- Docker Compose 核心价值:标准化多容器部署,一键启停,解决手动部署繁琐、易出错问题;
- 网络优势 :自定义桥接网络,容器通过服务名通信,无需固定 IP;
- 生产适配:可部署 LNMP、Tomcat 集群、云桌面、可视化面板、监控系统,覆盖绝大多数企业应用;
- 扩展方向:可结合 Dockerfile 自定义镜像,或迁移至 Kubernetes 实现大规模容器编排。