【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进阶用法,带你少走弯路、高效开发~

相关推荐
阿杰学AI5 分钟前
AI核心知识129—大语言模型之 向量数据库(简洁且通俗易懂版)
数据库·人工智能·ai·语言模型·自然语言处理·向量数据库·vector database
PILIPALAPENG12 分钟前
第3周 Day 2:Function Calling —— 让 Agent 听懂人话,自己干活
前端·人工智能·python
阿里云大数据AI技术23 分钟前
PAI Physical AI Notebook详解8:Isaac Lab Arena 全身机器人机动+操控工作流
人工智能
高木木的博客37 分钟前
数字架构智能化测试平台(1)--总纲
人工智能·python·nginx·架构
wanghowie39 分钟前
11. AI 客服系统架构设计:不是调 API,而是系统工程
人工智能·系统架构
袋鼠云数栈UED团队1 小时前
基于 OpenSpec 实现规范驱动开发
前端·人工智能
Raink老师1 小时前
【AI面试临阵磨枪】什么是 Tokenization?子词分词(Subword)的优缺点?
人工智能·ai 面试
迷你可可小生1 小时前
面经(三)
人工智能·rnn·lstm
云烟成雨TD1 小时前
Spring AI Alibaba 1.x 系列【28】Nacos Skill 管理中心功能说明
java·人工智能·spring
AI医影跨模态组学1 小时前
Cancer Letters(IF=10.1)中科院自动化研究所田捷等团队:整合纵向MRI与活检全切片图像用于乳腺癌新辅助治疗反应的早期预测及个体化管理
人工智能·深度学习·论文·医学·医学影像