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 实现大规模容器编排。
相关推荐
一个天蝎座 白勺 程序猿12 小时前
KingbaseES数据库归档重做日志文件管理:从配置到运维的实战指南
运维·数据库·oracle·kingbasees·金仓数据库
分布式存储与RustFS16 小时前
镜像仓库的层别堆本地盘:用 RustFS 给 Docker Registry 当 S3 后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
陈希12317 小时前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
@兽血沸腾18 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
闲云自留地1 天前
K8s 的记忆大脑!ETCD 集群部署、etcdctl 命令与备份恢复全通关
容器·kubernetes·etcd
讯捷蓝达1 天前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
爱和冰阔落1 天前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng1 天前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮1 天前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹1 天前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器