【Docker进阶篇】Docker Compose 实战:一键启动Web+数据库+缓存,微服务环境部署不再绕弯


🍃 予枫个人主页
📚 个人专栏 : 《Java 从入门到起飞》《读研码农的干货日常

💻 Debug 这个世界,Return 更好的自己!


引言

做后端开发的同学,一定遇到过这样的痛点:部署微服务时,要逐个启动Web应用、数据库、缓存等容器,还要手动配置容器联动,步骤繁琐且容易出错,换个环境又要重复配置。而Docker Compose 正是解决这个问题的"神器",只需编写一个docker-compose.yml文件,一行命令就能一键启动整套微服务环境,统一配置、一键复用,大幅提升开发和部署效率。今天就带大家从实战出发,吃透Docker Compose 编排技巧,彻底告别繁琐的容器启动操作!

文章目录

  • 引言
  • [一、什么是Docker Compose(极简认知)](#一、什么是Docker Compose(极简认知))
  • [二、核心:docker-compose.yml 配置详解(必看)](#二、核心:docker-compose.yml 配置详解(必看))
    • [2.1 通用配置模板(直接复用)](#2.1 通用配置模板(直接复用))
    • [2.2 核心配置项拆解(新手必懂)](#2.2 核心配置项拆解(新手必懂))
      • [1. version(版本号)](#1. version(版本号))
      • [2. services(服务定义)](#2. services(服务定义))
      • [3. 常用服务配置参数](#3. 常用服务配置参数)
  • [三、实战:一键启动Web+MySQL+Redis 微服务环境](#三、实战:一键启动Web+MySQL+Redis 微服务环境)
    • [3.1 实战准备](#3.1 实战准备)
    • [3.2 编写docker-compose.yml 文件](#3.2 编写docker-compose.yml 文件)
    • [3.3 一键启动所有服务](#3.3 一键启动所有服务)
    • [3.4 常用Docker Compose 命令(必记)](#3.4 常用Docker Compose 命令(必记))
    • [3.5 实战验证](#3.5 实战验证)
  • 四、常见问题与避坑指南(新手必看)
  • 五、结尾总结

一、什么是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 通用配置模板(直接复用)

yaml 复制代码
# 版本号(需与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个服务:

  1. Web服务:SpringBoot 简单测试应用(模拟实际业务应用)
  2. 数据库服务:MySQL 8.0(存储业务数据)
  3. 缓存服务:Redis 6.2(缓存热点数据,提升应用性能)

全程手把手操作,新手跟着做,就能一键启动整套环境!

3.1 实战准备

  1. 本地已安装Docker和Docker Compose(执行docker-compose -v验证,有版本输出即为安装成功)。

  2. 新建一个项目目录(如docker-compose-demo),用于存放docker-compose.yml文件和相关挂载目录。

  3. 目录结构(最终):

    docker-compose-demo/
    ├── docker-compose.yml # 核心配置文件
    ├── mysql/ # MySQL挂载目录(数据+配置)
    │ ├── data/ # 数据持久化目录
    │ └── conf/ # 配置文件目录
    └── redis/ # Redis挂载目录
    └── data/ # 数据持久化目录

3.2 编写docker-compose.yml 文件

进入docker-compose-demo目录,新建docker-compose.yml文件,复制下面的配置(可直接复用,只需根据需求修改镜像和环境变量):

yaml 复制代码
version: '3'

services:
  # Web应用服务(SpringBoot测试应用,镜像可自行替换为自己的项目镜像)
  web-app:
    image: java:8-jdk-alpine
    container_name: springboot-test-app
    ports:
      - "8080:8080"
    # 挂载本地SpringBoot jar包到容器(如果没有现成镜像,可通过这种方式运行自己的jar包)
    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
    volumes:
      - ./mysql/data:/var/lib/mysql  # 数据持久化
      - ./mysql/conf:/etc/mysql/conf.d  # 配置挂载
    restart: always
    # 可选:设置时区,避免时间不一致
    environment:
      - TZ=Asia/Shanghai

  # 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

✨ 小提示:如果没有自己的SpringBoot jar包,可暂时注释掉web-app服务的volumes和command配置,仅启动MySQL和Redis,同样能完成实战练习。觉得有用的同学,记得点赞收藏,后续可直接复用这份配置!

3.3 一键启动所有服务

  1. 打开终端,进入docker-compose-demo目录(确保终端路径与docker-compose.yml文件所在路径一致)。
  2. 执行启动命令(核心命令):
bash 复制代码
# 后台启动所有服务(推荐,不占用终端)
docker-compose up -d

# 可选:前台启动,实时查看容器日志(适合调试)
# docker-compose up
  1. 启动成功后,执行以下命令,查看容器运行状态:
bash 复制代码
docker-compose ps

如果所有服务的State都显示Up,说明整套微服务环境启动成功!

3.4 常用Docker Compose 命令(必记)

启动环境只是第一步,日常开发中,这些命令会经常用到,建议牢记:

bash 复制代码
# 1. 后台启动所有服务(最常用)
docker-compose up -d

# 2. 停止所有服务(不删除容器和数据)
docker-compose stop

# 3. 停止并删除所有服务、容器(数据卷挂载的数据不会删除)
docker-compose down

# 4. 查看所有服务日志(可指定服务名称,只看单个服务日志)
docker-compose logs
docker-compose logs web-app  # 只看web应用的日志

# 5. 重启所有服务
docker-compose restart

# 6. 查看服务状态
docker-compose ps

3.5 实战验证

  1. 验证MySQL:使用Navicat、DataGrip等工具,连接宿主机IP:3306,用户名root,密码123456,查看是否能成功连接,且存在test_db数据库。
  2. 验证Redis:使用Redis Desktop Manager等工具,连接宿主机IP:6379,密码123456,查看是否能成功连接。
  3. 验证Web应用:打开浏览器,访问http://localhost:8080,若能看到SpringBoot应用的默认页面或自定义接口返回,说明Web服务启动成功,且能正常连接MySQL和Redis。

🎉 至此,一套完整的Web+MySQL+Redis微服务环境,就通过Docker Compose 一键部署完成了!后续换个环境,只需复制这份docker-compose.yml文件,执行一行up -d命令,就能快速复用环境,再也不用重复配置了。

四、常见问题与避坑指南(新手必看)

在使用Docker Compose 编排的过程中,新手很容易遇到一些问题,这里整理了4个最常见的问题及解决方案,帮大家避坑:

问题1:启动时报"version不兼容"错误

  • 原因:docker-compose.yml文件中的version版本,与本地安装的Docker Compose版本不匹配。
  • 解决方案:将version改为3(兼容大多数版本),或升级Docker Compose到最新版本。

问题2:Web服务启动失败,提示"无法连接MySQL/Redis"

  • 原因:depends_on只控制启动顺序,不保证依赖服务完全就绪(比如MySQL容器启动,但服务还在初始化,Web服务就去连接)。
  • 解决方案:简单方案:重启Web服务(docker-compose restart web-app);进阶方案:添加健康检查,确保依赖服务就绪后再启动Web服务。

问题3:容器删除后,数据丢失

  • 原因:未配置volumes数据卷挂载,容器内的数据存储在容器本身,容器删除后数据随之丢失。
  • 解决方案:给需要持久化数据的服务(如MySQL、Redis)配置volumes挂载,将数据存储到宿主机目录。

问题4:执行docker-compose命令时,提示"command not found"

  • 原因:Docker Compose未安装,或未配置环境变量。
  • 解决方案:重新安装Docker Compose,并配置环境变量,确保终端能识别docker-compose命令。

五、结尾总结

本文从Docker Compose的核心概念出发,拆解了docker-compose.yml的关键配置,再通过一个完整的实战案例,教大家一键启动Web+MySQL+Redis微服务环境,同时分享了常用命令和避坑指南,适合新手快速上手。

Docker Compose 的核心价值在于"简化配置、统一环境、提升效率",尤其适合后端开发、测试环境的部署,也是微服务编排的入门基础。掌握它之后,你可以轻松管理多个容器,告别繁琐的手动操作,将更多精力放在业务开发上。

建议大家多动手实践,修改配置、尝试添加新的服务(如Nginx反向代理),逐步熟练Docker Compose的用法。


💡 最后,觉得本文对你有帮助的同学,记得点赞+收藏+关注哦!我是予枫,专注分享后端开发、Docker、微服务相关实战技巧,后续会更新更多Docker进阶用法,带你少走弯路、高效开发~

相关推荐
蚂蚁数据AntData2 小时前
DB-GPT 0.7.5 版本更新:基于 Falcon 评测集的Text2SQL评测体系全面升级,支持LLM/Agent两种评测模式和多环境评测
大数据·人工智能·算法·ai·开源
说私域2 小时前
破局与重生:万人社群的“链动”生态进化论——兼论“链动2+1模式AI智能名片小程序”的自驱动机制
人工智能·小程序·私域运营
青稞社区.2 小时前
比肩 GPT-5 的 Kernel Coding 模型!Dr. Kernel 用多轮 RL 训练大模型 GPU Kernel 生成
人工智能·经验分享
X54先生(人文科技)2 小时前
千问回答用户启蒙灯塔起源团的基于“和清寂静”内核碳硅协同对位法的千问吸收情况
数据库·人工智能·开源·ai编程
哈库纳玛塔塔2 小时前
AI 时代,使用 dbVisitor 读写向量化数据
数据库·人工智能·mybatis
诚思报告YH2 小时前
气调集装箱市场洞察:2026-2032年复合增长率(CAGR)为6.4%
人工智能
极新2 小时前
百度电商商业业务部产品运营经理段笑天:AI正在重塑每一个行业,而超拟真数字人正重塑直播电商 | 2026智造新IP峰会演讲实录
人工智能·百度·产品运营
会算数的⑨2 小时前
Spring AI Alibaba 学习(三):Graph Workflow 深度解析(上篇)
java·人工智能·后端·学习·阿里云·agent·saa
小刘的大模型笔记2 小时前
POP原理落地到实际微调
数据库·人工智能·深度学习·算法·机器学习