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 实现大规模容器编排。
相关推荐
jscxy52062 小时前
ospf综合实验
运维·服务器·网络
apcipot_rain2 小时前
计科八股20260529——连接协议连接线程池、模块拆解模块通信、WebSocket
运维·服务器·网络·八股
GIS数据转换器2 小时前
智慧能源管理平台
java·大数据·运维·人工智能·无人机
“码”力全开2 小时前
解构企业级安防中台:基于Docker容器化与GB28181/RTSP多协议汇聚的边缘计算AI视频管理平台(全量源码交付)
人工智能·docker·边缘计算
剑神一笑3 小时前
Linux lsof 命令深度解析:从文件描述符到进程追踪
linux·运维·php
qq3621967053 小时前
facebook是什么意思?新手从零到精通完全指南
运维·服务器·facebook
见牛羊3 小时前
docker理解
java·docker·容器
勿芮介3 小时前
【研发工具】Jenkins镜像源配置问题及解决方案
运维·servlet·jenkins
qq_312920113 小时前
如何将Nginx响应时间从500ms降至50ms
运维·nginx