文章目录
-
- 前言
- [一、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 个顶级字段组成,覆盖全部开发场景:
- version :声明配置文件版本,推荐
3.8,兼容性最全、行业通用 - services:核心核心核心!定义所有容器服务,一个子节点对应一个容器
- networks:自定义网桥网络,实现多容器统一组网、服务名互通
- volumes:统一声明数据卷,实现容器数据持久化
- 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 一键编排部署,实现项目快速迭代、环境标准化统一。