Docker Compose 多容器编排实战:LNMP、Tomcat 集群、云桌面、Portainer、Zabbix 一键部署

前言

在实际容器化运维中,手动使用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 大模块:

  1. services:定义所有容器服务(核心)
  2. networks:自定义桥接网络,实现容器互通
  3. 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

六、总结

  1. Docker Compose 核心价值:标准化多容器部署,一键启停,解决手动部署繁琐、易出错问题;
  2. 网络优势 :自定义桥接网络,容器通过服务名通信,无需固定 IP;
  3. 生产适配:可部署 LNMP、Tomcat 集群、云桌面、可视化面板、监控系统,覆盖绝大多数企业应用;
  4. 扩展方向:可结合 Dockerfile 自定义镜像,或迁移至 Kubernetes 实现大规模容器编排。
相关推荐
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn863 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
2601_961875243 天前
决战申论100题2026|最新|范文
linux·容器·centos·debian·ssh·fabric·vagrant