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 一键编排部署,实现项目快速迭代、环境标准化统一。

相关推荐
yuanpan1 小时前
Python + psutil 实战:开发一个简易系统监控工具
linux·运维·python
坚持就完事了1 小时前
Linux的ln命令
linux·运维·服务器
鹿角片ljp1 小时前
实验室显卡与本机远程连接复盘:直连SSH到ZeroTier
运维·ssh
sbjdhjd2 小时前
企业级 Docker 镜像仓库建设与运维规范
linux·运维·docker·云原生·容器·eureka·开源
TEC_INO2 小时前
Linux_54:RV1126的VI模块讲解
linux·运维·人工智能
期待のcode2 小时前
Redis数据类型
运维·数据结构·redis
Tingjct2 小时前
Linux开发工具
linux·运维·服务器
ChaITSimpleLove2 小时前
优化 WSL2 性能:为 Docker 和 K8s 定制高效内存配置指南
docker·容器·性能优化·kubernetes·wsl2·windows开发·pwsh
xingyuzhisuan2 小时前
适合微调Llama 3 70B模型的最低GPU配置推荐
运维·人工智能·算法·llama·gpu算力