Docker Compose 实战:一键部署 Web、数据库与缓存微服务环境
引言
做后端开发的同学,一定遇到过这样的痛点:部署微服务时,要逐个启动 Web 应用、数据库、缓存等容器,还要手动配置容器联动,步骤繁琐且容易出错,换个环境又要重复配置。而 Docker Compose 正是解决这个问题的'神器',只需编写一个 docker-compose.yml 文件,一行命令就能一键启动整套微服务环境,统一配置、一键复用,大幅提升开发和部署效率。
一、什么是 Docker Compose(极简认知)
Docker Compose 是 Docker 官方提供的容器编排工具,专门用于管理多个 Docker 容器组成的应用集群。
简单来说,当你的项目需要同时运行多个容器(比如 Web 服务用 Nginx、应用用 SpringBoot、数据库用 MySQL、缓存用 Redis),不需要逐个执行 docker run 命令启动,也不用手动配置容器间的网络连接,只需通过一个 docker-compose.yml 配置文件,定义好所有容器的参数、依赖关系和网络规则,执行一行命令就能实现'一键启动、一键停止、一键重启'所有容器。
💡 核心优势:简化配置、统一环境、一键操作、易于维护,是后端开发、测试环境部署的必备工具,也是微服务编排的入门首选。
建议大家先确认本地已安装 Docker 和 Docker Compose(执行 docker-compose -v 可查看版本),如果未安装,可参考 Docker 官方文档快速部署。
二、核心:docker-compose.yml 配置详解
docker-compose.yml 是 Docker Compose 的核心,所有容器的配置都集中在这个文件中,语法遵循 YAML 规范,结构清晰、易于编写和修改。
2.1 通用配置模板
# 版本号(需与 Docker Compose 版本匹配,常用 3.x)
version: '3'
# 定义所有服务(容器),每个服务对应一个容器
services:
# 1. Web 应用服务(示例:SpringBoot 应用)
web:
# 镜像名称(本地有则使用本地,无则自动从 Docker Hub 拉取)
image: springboot-web:1.0.0
# 容器名称(自定义,便于区分和操作)
container_name: springboot-web
# 端口映射(宿主机端口:容器内部端口)
ports:
- "8080:8080"
# 依赖关系(先启动 mysql 和 redis,再启动 web 服务)
depends_on:
- mysql
- redis
# 环境变量(传递配置参数,如数据库地址、端口等)
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/test_db?useUnicode=true&characterEncoding=utf8
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=123456
# 重启策略(容器异常退出时自动重启)
restart: always
# 2. 数据库服务(MySQL)
mysql:
image: mysql:8.0
container_name: mysql-8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=test_db
# 数据卷挂载(将宿主机目录挂载到容器,实现数据持久化)
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
restart: always
# 3. 缓存服务(Redis)
redis:
image: redis:6.2
container_name: redis-6.2
ports:
- "6379:6379"
# 密码配置(可选,根据需求设置)
command: redis-server --requirepass 123456
volumes:
- ./redis/data:/data
restart: always
2.2 核心配置项拆解
1. version(版本号)
- 用于指定 Docker Compose 的配置版本,需与本地安装的 Docker Compose 版本匹配,否则可能出现兼容性问题。
- 常用版本:
3(兼容 Docker 1.13.0 及以上版本),建议直接使用 3.x 版本。
2. services(服务定义)
- 整个配置文件的核心节点,所有需要启动的容器都定义在这个节点下,每个子节点代表一个服务(一个容器)。
- 子节点名称(如 web、mysql、redis)可自定义,建议与服务功能对应,便于识别。
3. 常用服务配置参数
| 配置项 | 作用 | 示例 |
|---|---|---|
| image | 指定容器使用的镜像 | image: mysql:8.0 |
| container_name | 自定义容器名称 | container_name: mysql-8.0 |
| ports | 端口映射,实现宿主机访问容器 | ports: - "3306:3306" |
| depends_on | 定义服务依赖,控制容器启动顺序 | depends_on: - mysql |
| environment | 设置环境变量,传递配置参数 | environment: - MYSQL_ROOT_PASSWORD=123456 |
| volumes | 数据卷挂载,实现数据持久化 | volumes: - ./mysql/data:/var/lib/mysql |
| restart | 重启策略,容器异常退出时自动重启 | restart: always |
| command | 覆盖容器启动时执行的命令 | command: redis-server --requirepass 123456 |
⚠️ 注意:depends_on 只控制容器的启动顺序,不保证依赖服务完全启动(比如 mysql 容器启动,但服务未就绪,web 服务可能启动失败),后续可通过健康检查优化。
三、实战:一键启动 Web+MySQL+Redis 微服务环境
本次实战将搭建一个完整的微服务基础环境,包含 3 个服务:
- Web 服务:SpringBoot 简单测试应用(模拟实际业务应用)
- 数据库服务:MySQL 8.0(存储业务数据)
- 缓存服务:Redis 6.2(缓存热点数据,提升应用性能)
3.1 实战准备
- 本地已安装 Docker 和 Docker Compose(执行
docker-compose -v验证)。 - 新建一个项目目录(如
docker-compose-demo),用于存放 docker-compose.yml 文件和相关挂载目录。 - 目录结构(最终):
docker-compose-demo/
├── docker-compose.yml
├── mysql/
│ ├── data/
│ └── conf/
└── redis/
└── data/
3.2 编写 docker-compose.yml 文件
进入 docker-compose-demo 目录,新建 docker-compose.yml 文件,复制下面的配置:
version: '3'
services:
# Web 应用服务
web-app:
image: java:8-jdk-alpine
container_name: springboot-test-app
ports:
- "8080:8080"
volumes:
- ./web/app.jar:/app.jar
command: java -jar /app.jar
depends_on:
- mysql-db
- redis-cache
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql-db:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=123456
- SPRING_REDIS_HOST=redis-cache
- SPRING_REDIS_PORT=6379
- SPRING_REDIS_PASSWORD=123456
restart: always
# MySQL 数据库服务
mysql-db:
image: mysql:8.0
container_name: mysql-8.0-db
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=123456
- MYSQL_DATABASE=test_db
- MYSQL_CHARSET=utf8mb4
- MYSQL_COLLATION=utf8mb4_unicode_ci
- TZ=Asia/Shanghai
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
restart: always
# Redis 缓存服务
redis-cache:
image: redis:6.2
container_name: redis-6.2-cache
ports:
- "6379:6379"
command: redis-server --requirepass 123456 --appendonly yes
volumes:
- ./redis/data:/data
restart: always
environment:
- TZ=Asia/Shanghai
3.3 一键启动所有服务
- 打开终端,进入
docker-compose-demo目录。 - 执行启动命令:
# 后台启动所有服务(推荐)
docker-compose up -d
# 可选:前台启动,实时查看容器日志
# docker-compose up
- 启动成功后,执行以下命令,查看容器运行状态:
docker-compose ps
如果所有服务的 State 都显示 Up,说明整套微服务环境启动成功!
3.4 常用 Docker Compose 命令
# 1. 后台启动所有服务
docker-compose up -d
# 2. 停止所有服务(不删除容器和数据)
docker-compose stop
# 3. 停止并删除所有服务、容器
docker-compose down
# 4. 查看所有服务日志
docker-compose logs
# 5. 重启所有服务
docker-compose restart
# 6. 查看服务状态
docker-compose ps
3.5 实战验证
- 验证 MySQL:使用 Navicat 等工具,连接宿主机 IP:3306,用户名 root,密码 123456,查看是否能成功连接,且存在 test_db 数据库。
- 验证 Redis:使用 Redis Desktop Manager 等工具,连接宿主机 IP:6379,密码 123456。
- 验证 Web 应用:打开浏览器,访问 http://localhost:8080,若能看到 SpringBoot 应用的默认页面或自定义接口返回,说明 Web 服务启动成功。
四、常见问题与避坑指南
问题 1:启动时报'version 不兼容'错误
- 原因:docker-compose.yml 文件中的 version 版本,与本地安装的 Docker Compose 版本不匹配。
- 解决方案:将 version 改为 3,或升级 Docker Compose 到最新版本。
问题 2:Web 服务启动失败,提示'无法连接 MySQL/Redis'
- 原因:depends_on 只控制启动顺序,不保证依赖服务完全就绪。
- 解决方案:简单方案:重启 Web 服务;进阶方案:添加健康检查。
问题 3:容器删除后,数据丢失
- 原因:未配置 volumes 数据卷挂载。
- 解决方案:给需要持久化数据的服务配置 volumes 挂载,将数据存储到宿主机目录。
问题 4:执行 docker-compose 命令时,提示'command not found'
- 原因:Docker Compose 未安装,或未配置环境变量。
- 解决方案:重新安装 Docker Compose,并配置环境变量。
五、结尾总结
本文从 Docker Compose 的核心概念出发,拆解了 docker-compose.yml 的关键配置,再通过一个完整的实战案例,教大家一键启动 Web+MySQL+Redis 微服务环境,同时分享了常用命令和避坑指南,适合新手快速上手。
Docker Compose 的核心价值在于'简化配置、统一环境、提升效率',尤其适合后端开发、测试环境的部署。掌握它之后,你可以轻松管理多个容器,告别繁琐的手动操作,将更多精力放在业务开发上。
建议大家多动手实践,修改配置、尝试添加新的服务(如 Nginx 反向代理),逐步熟练 Docker Compose 的用法。

