这是我学习 Docker Compose 时整理的笔记。单个容器用 docker run 就够了,但一个应用往往要多个容器(App + MySQL + Redis)——一个个 docker run 既麻烦又难管理(网络/顺序/数据卷)。Docker Compose 用一个 yml 文件声明整套服务,一条命令全起。
一、为什么要 Compose
一个完整应用 = app 容器 + mysql 容器 + redis 容器
docker run 一个个起 → 麻烦、容易忘参数、容器间连接难管理
docker-compose.yml 声明全部 → docker compose up -d 一键全起 ✅核心价值:把"起哪些容器、怎么连、数据放哪、端口怎么映射"写进一个文件——任何机器(开发/测试/生产)一条命令复现完全一样的环境。这也是"环境一致性"在服务编排层面的延伸(基础概念见《Docker 核心概念与 Dockerfile 基础》)。
二、docker-compose.yml 基础结构
以 Spring Boot + MySQL + Redis 为例:
yaml
services:
app:
build: . # 用当前目录 Dockerfile 构建
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/shop
SPRING_DATA_REDIS_HOST: redis
depends_on: # 启动顺序:先起依赖
- mysql
- redis
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: "123456"
MYSQL_DATABASE: shop
volumes:
- mysql-data:/var/lib/mysql # 数据放卷里,容器删了不丢
redis:
image: redis:7
volumes:
- redis-data:/data
volumes:
mysql-data:
redis-data:关键点:
services:定义所有容器(app/mysql/redis)- 服务发现:同 compose 网络下,app 用
mysql/redis名字连(不是 IP)——jdbc:mysql://mysql:3306就是连到 mysql 容器 depends_on:控制启动顺序(先 mysql/redis 再 app)volumes:声明数据卷,compose down后up数据还在
三、常用命令
bash
# 构建并启动(-d 后台)
docker compose up -d
# 只重建 app(代码改了重新构建)
docker compose up -d --build app
# 看所有服务状态
docker compose ps
# 看日志
docker compose logs -f app
# 进容器
docker compose exec app bash
# 停止并删除容器/网络(卷保留)
docker compose down
# 全删(连卷一起,数据没了!慎用)
docker compose down -v
# 改完配置重新应用
docker compose restart四、完整实战:一条命令起 Spring Boot + MySQL + Redis
bash
# 1. 项目根目录放 docker-compose.yml(如上)
# 2. app 的 Dockerfile(build: . 用的)dockerfile
# Dockerfile
FROM eclipse-temurin:17-jdk
COPY target/myapp.jar /app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]bash
# 3. 一条命令全部起来
docker compose up -d
# 4. 验证
docker compose ps
# NAME IMAGE STATUS PORTS
# app myapp:1.0 Up 2 minutes 0.0.0.0:8080->8080/tcp
# mysql mysql:8.0 Up 2 minutes 3306/tcp
# redis redis:7 Up 2 minutes 6379/tcp注意:app 里连数据库的地址必须是 mysql(服务名)不是 localhost——因为每个容器网络是独立的,localhost 指容器自己。
五、常见坑
- 连不上数据库:检查连接串是不是用了服务名(
mysql)而不是localhost - 顺序问题:
depends_on只保证启动顺序,不保证"就绪"(MySQL 还在初始化)——需要healthcheck或应用层重试 - 端口冲突:
8080:8080被本机占用 → 换主机端口如8081:8080 - 配置改了不生效:
docker compose down && up -d(或up -d --force-recreate) - 生产别用 build:生产环境应该
image: registry.com/myapp:1.0(镜像推到仓库),而不是现场 build
小结
- Compose = 一个 yml 声明多容器 + 一条命令全起
- 核心概念:services / 服务发现(名字互访)/ depends_on / volumes
- 常用命令:up -d / ps / logs -f / exec / down(-v 慎用)
- 生产用镜像仓库地址,不现场 build
下一篇可以看《Docker 常用命令速查》或我的《CI/CD 快速入门》(Compose + 流水线才是完整部署链路)。
