Skip to content

这是我学习 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 Compose:一条命令编排多容器

核心价值:把"起哪些容器、怎么连、数据放哪、端口怎么映射"写进一个文件——任何机器(开发/测试/生产)一条命令复现完全一样的环境。这也是"环境一致性"在服务编排层面的延伸(基础概念见《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 downup 数据还在

三、常用命令

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 指容器自己。

五、常见坑

  1. 连不上数据库:检查连接串是不是用了服务名(mysql)而不是 localhost
  2. 顺序问题depends_on 只保证启动顺序,不保证"就绪"(MySQL 还在初始化)——需要 healthcheck 或应用层重试
  3. 端口冲突8080:8080 被本机占用 → 换主机端口如 8081:8080
  4. 配置改了不生效docker compose down && up -d(或 up -d --force-recreate
  5. 生产别用 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 + 流水线才是完整部署链路)。