Docker Compose 多容器编排实战(系列第五篇:开发环境一键部署)

文章目录

    • 前言
    • [一、Docker Compose 核心认知(必懂)](#一、Docker Compose 核心认知(必懂))
      • [1.1 什么是 Docker Compose?](#1.1 什么是 Docker Compose?)
      • [1.2 核心作用](#1.2 核心作用)
      • [1.3 适用场景(重点:区分生产与开发)](#1.3 适用场景(重点:区分生产与开发))
    • [二、Docker Compose 安装部署](#二、Docker Compose 安装部署)
      • [2.1 安装说明](#2.1 安装说明)
      • [2.2 校验安装成功](#2.2 校验安装成功)
      • [2.3 版本命令区别(避坑重点)](#2.3 版本命令区别(避坑重点))
      • [2.4 旧版 Docker 手动安装(备用)](#2.4 旧版 Docker 手动安装(备用))
    • [三、Compose 核心 YAML 语法详解(超多示例)](#三、Compose 核心 YAML 语法详解(超多示例))
      • [3.1 五大顶级关键字(核心骨架)](#3.1 五大顶级关键字(核心骨架))
      • [3.2 服务全覆盖配置模板(可直接复用)](#3.2 服务全覆盖配置模板(可直接复用))
      • [3.3 关键配置深度释义(实战必用)](#3.3 关键配置深度释义(实战必用))
        • [1、depends_on 依赖机制](#1、depends_on 依赖机制)
        • [2、restart 重启策略](#2、restart 重启策略)
        • [3、networks 网络互通机制](#3、networks 网络互通机制)
    • [四、企业实战:MySQL+Redis+Nginx+SpringBoot 一键编排](#四、企业实战:MySQL+Redis+Nginx+SpringBoot 一键编排)
      • [4.1 标准化项目目录结构](#4.1 标准化项目目录结构)
      • [4.2 完整版可运行 docker-compose.yml](#4.2 完整版可运行 docker-compose.yml)
      • [4.3 配置核心亮点解析](#4.3 配置核心亮点解析)
      • [4.4 SpringBoot 项目配置适配(重点实操)](#4.4 SpringBoot 项目配置适配(重点实操))
    • [五、Docker Compose 日常高频命令(开发必备)](#五、Docker Compose 日常高频命令(开发必备))
      • [5.1 服务启停命令](#5.1 服务启停命令)
      • [5.2 查看状态与日志命令](#5.2 查看状态与日志命令)
      • [5.3 进阶运维命令](#5.3 进阶运维命令)
    • [六、为什么要用 Compose 替代手动启动容器?](#六、为什么要用 Compose 替代手动启动容器?)
      • [6.1 手动部署的致命弊端](#6.1 手动部署的致命弊端)
      • [6.2 Compose 企业级优势](#6.2 Compose 企业级优势)
    • 七、本篇总结

前言

通过前四篇的学习,我们已经熟练掌握了 Docker 基础命令、容器网络原理、数据卷持久化、自定义镜像打包等核心技能,能够独立手动创建、运行、管理单个容器。

但回到真实的企业开发场景中,完整的后端项目绝不可能依靠单一容器运行 ,绝大多数主流项目都是一套组合服务架构:SpringBoot 业务服务 + MySQL 数据库 + Redis 缓存 + Nginx 反向代理

如果沿用传统的 docker run 手动部署方式,会遇到大量无法规避的痛点,也是日常开发中最耗时、最容易出问题的环节:

  • 每个容器都需要单独执行冗长的启动命令,重复操作多、极易输错
  • 需要手动逐个配置端口映射、目录挂载、容器网络,配置零散无统一管理
  • 服务存在强依赖关系(必须先启动数据库、缓存,再启动业务服务),手动启动顺序混乱,频繁出现项目启动报错
  • 项目迁移、电脑重装、服务器重启后,需要重新搭建整套环境,无法实现环境复用
  • 团队开发环境不统一,出现经典的「本地能跑、服务器报错」的环境差异问题

为了解决多容器统一管理、批量启停、环境标准化编排 的核心问题,Docker 官方推出轻量化编排神器 ------ Docker Compose

本篇将带你从零吃透 Compose 核心概念、安装部署、YAML 语法、企业级多服务一键编排、网络互通、高频命令,彻底抛弃手动启动容器的低效开发方式,适配当下主流开发规范。

一、Docker Compose 核心认知(必懂)

1.1 什么是 Docker Compose?

Docker Compose 是 Docker 官方原生的单机多容器编排工具,专门用于管理单机环境下的多个容器应用。

通俗直白理解前后对比:

  • 传统方式 :N 个容器,写 N 条 docker run 命令,逐个启动、逐个配置、逐个管理,繁琐且易错。
  • Compose 方式 :只用一个 docker-compose.yml 文件,统一描述所有服务的配置,一条命令即可启停、管理整套项目环境。

1.2 核心作用

Compose 聚焦单机多容器场景,解决多服务部署的所有痛点,核心能力如下:

  • 一键启动、停止、重启、删除整套微服务环境,告别重复命令
  • 统一管理所有容器的网络、端口、数据卷、启动规则、服务依赖
  • 自动控制服务启动顺序,解决依赖未就绪导致的项目启动失败问题
  • 实现开发、测试环境标准化,配置可同步、可复用,团队环境完全统一

1.3 适用场景(重点:区分生产与开发)

这是企业开发的核心认知,避免技术场景误用:

  • Docker Compose 专属场景 :本地开发环境、单机测试环境、小型单机项目部署。主打轻量、简单、高效,是日常开发的首选工具。
  • 不适用场景:大规模集群、高可用、弹性扩容的生产环境。
  • 生产替代方案 :企业线上生产集群、微服务大规模部署,统一使用 K8s(Kubernetes)

总结:开发测试用 Compose,线上集群用 K8s,二者互补,是当下主流的 Docker 技术架构。

二、Docker Compose 安装部署

2.1 安装说明

目前主流新版 Docker 已默认内置 Compose 插件,无需单独安装,Windows/Mac 端 Docker Desktop、Linux 新版 Docker Engine、云服务器、虚拟机环境均可直接使用。仅老旧版本 Docker 需要手动安装。

2.2 校验安装成功

执行以下命令校验环境:

bash 复制代码
docker compose version

输出版本号信息,即代表环境正常可用。

2.3 版本命令区别(避坑重点)

  • 新版命令(推荐)docker compose(无短横线,Go 重构,性能更强)
  • 旧版命令(淘汰)docker-compose(有短横线,Python 版本,仅兼容旧环境)

2.4 旧版 Docker 手动安装(备用)

若服务器 Docker 版本过低,可执行以下命令快速安装:

bash 复制代码
# 下载二进制文件
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

注意:GitHub 下载链接可能存在网络超时,国内服务器可替换镜像源加速下载。

三、Compose 核心 YAML 语法详解(超多示例)

Docker Compose 所有配置均写入 docker-compose.yml语法严格缩进 :必须使用 2个空格缩进,禁止使用 Tab 键,否则配置直接失效。

3.1 五大顶级关键字(核心骨架)

所有 Compose 配置文件,均由以下 5 个顶级字段组成,覆盖全部开发场景:

  1. version :声明配置文件版本,推荐 3.8,兼容性最全、行业通用
  2. services:核心核心核心!定义所有容器服务,一个子节点对应一个容器
  3. networks:自定义网桥网络,实现多容器统一组网、服务名互通
  4. volumes:统一声明数据卷,实现容器数据持久化
  5. configs:统一管理配置文件,日常开发极少使用

3.2 服务全覆盖配置模板(可直接复用)

以下是企业通用的服务配置模板,包含所有高频参数,注释详尽,可直接复制修改使用:

yaml 复制代码
services:
  # 自定义服务名(自定义,建议见名知意)
  demo-service:
    image: nginx:stable         # 指定镜像名称+版本
    build: .                    # 本地Dockerfile构建镜像(自定义镜像时使用)
    container_name: demo-nginx  # 自定义容器名称,避免随机命名
    restart: always             # 容器重启策略
    ports:                      # 宿主机:容器 端口映射
      - "80:80"
    volumes:                    # 目录/数据卷挂载,持久化数据
      - ./nginx/html:/usr/share/nginx/html
    environment:                # 环境变量配置
      - TZ=Asia/Shanghai
    depends_on:                 # 服务依赖,控制启动顺序
      - mysql
    networks:                   # 加入自定义网络
      - dev-net

3.3 关键配置深度释义(实战必用)

1、depends_on 依赖机制

用于控制服务启动顺序,解决服务依赖报错问题。

示例场景:SpringBoot 项目必须依赖 MySQL、Redis,配置后会自动先启动数据库、缓存,再启动业务服务。

yaml 复制代码
depends_on:
  - mysql
  - redis

注意:该字段仅控制容器启动顺序,不等待服务完全初始化,复杂场景可搭配健康检查使用。

2、restart 重启策略

开发、测试环境标配策略,三种常用模式:

  • always:容器无论正常/异常退出,永远自动重启(企业通用推荐)
  • no:默认策略,退出不重启
  • on-failure:仅容器异常退出时重启
3、networks 网络互通机制

所有服务加入同一个自定义网桥网络,容器之间可直接通过服务名通信,无需填写IP,彻底解决容器IP动态变动导致的服务失联问题。

示例 :mysql 服务可直接用 mysql:3306 访问,无需查询容器IP。

四、企业实战:MySQL+Redis+Nginx+SpringBoot 一键编排

本节搭建当下 Java 开发最主流的全套环境,一次性编排四大核心服务,配置可直接落地使用,覆盖90%以上的前后端分离开发项目。

4.1 标准化项目目录结构

统一目录规范,方便配置管理、数据持久化、日志查看:

bash 复制代码
project/
├── docker-compose.yml      # Compose核心编排文件
├── nginx/                  # Nginx全套配置目录
│   ├── conf.d/             # 代理配置文件
│   ├── html/               # 静态资源目录
│   └── logs/               # 日志持久化目录
├── mysql/                  # MySQL数据持久化目录
└── redis/                  # Redis数据持久化目录

4.2 完整版可运行 docker-compose.yml

yaml 复制代码
# 配置版本声明,通用兼容版本
version: "3.8"

# 自定义统一网桥:实现所有服务网络互通
networks:
  dev-net:
    driver: bridge

# 声明全局数据卷,实现数据持久化
volumes:
  mysql-data:
  redis-data:

# 所有服务编排配置
services:
  # 1、MySQL 5.7 数据库服务
  mysql:
    image: mysql:5.7
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_CHARSET: utf8mb4
      TZ: Asia/Shanghai
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - dev-net

  # 2、Redis 缓存服务(轻量alpine版本)
  redis:
    image: redis:6-alpine
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis-data:/data
    networks:
      - dev-net

  # 3、Nginx 反向代理服务
  nginx:
    image: nginx:stable
    container_name: nginx
    restart: always
    ports:
      - "80:80"
    volumes:
      - ./nginx/html:/usr/share/nginx/html
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/logs:/var/log/nginx
    networks:
      - dev-net

  # 4、SpringBoot 后端业务服务
  app:
    build: .
    container_name: springboot-app
    restart: always
    ports:
      - "8080:8080"
    # 依赖数据库、缓存,保证启动顺序
    depends_on:
      - mysql
      - redis
    networks:
      - dev-net

4.3 配置核心亮点解析

  • 统一组网 :所有服务加入 dev-net 网桥,服务间通过服务名直接通信,无需依赖固定IP
  • 有序启动:SpringBoot 服务后置启动,规避数据库未初始化导致的连接异常
  • 全程自启 :所有服务配置 restart: always,服务器重启、容器异常退出自动恢复
  • 数据不丢失:MySQL、Redis 采用数据卷持久化,删除、重建容器数据保留

4.4 SpringBoot 项目配置适配(重点实操)

这是 Compose 开发的核心优势:无需写容器IP,直接写服务名即可连接,彻底解决IP变动问题。

application.yml / application.properties 适配配置:

properties 复制代码
# MySQL数据库连接配置
spring.datasource.url=jdbc:mysql://mysql:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

# Redis缓存连接配置
spring.redis.host=redis
spring.redis.port=6379

五、Docker Compose 日常高频命令(开发必备)

所有命令必须在 docker-compose.yml 同级目录执行,整理企业开发全套常用命令,全覆盖日常操作。

5.1 服务启停命令

bash 复制代码
# 前台启动(可实时看日志,适合调试,终端关闭服务停止)
docker compose up

# 后台静默启动(开发/测试环境首选)
docker compose up -d

# 停止所有服务,保留容器、网络、数据
docker compose stop

# 启动已停止的服务
docker compose start

# 停止并删除容器、网络(保留数据卷,数据不丢)
docker compose down

# 彻底清空所有资源(含数据卷,数据清空,谨慎使用)
docker compose down -v

5.2 查看状态与日志命令

bash 复制代码
# 查看当前编排所有服务运行状态
docker compose ps

# 查看所有服务全部日志
docker compose logs

# 实时滚动查看日志(调试必备)
docker compose logs -f

# 单独查看SpringBoot服务日志
docker compose logs -f app

# 单独查看MySQL日志
docker compose logs -f mysql

5.3 进阶运维命令

bash 复制代码
# 重启所有服务
docker compose restart

# 重启单个指定服务(无需重启整套环境)
docker compose restart mysql

# 代码/配置修改后,重新构建镜像并启动
docker compose up -d --build

# 进入指定容器内部
docker compose exec mysql bash

六、为什么要用 Compose 替代手动启动容器?

6.1 手动部署的致命弊端

  • 命令冗余难维护:单个容器 run 命令动辄几十行,难记忆、难复用、容易写错
  • 部署效率极低:新环境部署需要逐条敲命令,整套环境搭建耗时几十分钟
  • 启动顺序混乱:手动启动随机顺序,频繁出现服务连接失败
  • 团队环境割裂:每个人配置参数不同,环境不一致,增加排查问题成本

6.2 Compose 企业级优势

  • 一次配置,永久复用:YAML 文件可存入 Git 版本控制,团队全员同步统一配置
  • 极速部署:一条命令 5 秒拉起整套开发环境
  • 全自动运维:自动处理启动顺序、网络互通、数据持久化、异常重启
  • 环境绝对统一:彻底解决「本地正常、线上报错」的环境问题

七、本篇总结

1、Docker Compose 是单机多容器专属编排工具,主打开发、测试环境轻量化部署,生产高可用集群需使用 K8s,二者分工明确,是当下主流技术架构;

2、Compose 核心依托 docker-compose.yml 文件,通过 version、services、networks、volumes 四大核心模块,实现多容器统一管理;

3、依靠depends_on 实现有序启动,依靠自定义网桥实现服务名互通,彻底摆脱IP依赖,大幅提升环境稳定性;

4、熟练掌握 up、down、restart、logs、build 等高频命令,可完全替代手动 docker run 操作,是开发必备核心技能;

5、企业标准开发流程:Dockerfile 自定义镜像 + Docker Compose 一键编排部署,实现项目快速迭代、环境标准化统一。

相关推荐
XIAOHEZIcode1 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
武子康2 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠5 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
Alsn865 天前
等待学习-学习目录:Docker 容器安全攻防
学习·安全·docker
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_5 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化