Docker Compose 怎么部署多服务应用?

文章导读
使用 Docker Compose 部署多服务应用,最推荐的方式是通过一个 docker-compose.yml 文件定义所有服务,然后用一条命令启动整个应用栈,适合本地开发、测试环境和中小规模生产部署。
📋 目录
  1. 一 命令速用版
  2. 二 为什么会这样
  3. 三 分步处理
  4. 四 怎么验证是否生效
  5. 五 常见坑
  6. 六 参考来源
A A

使用 Docker Compose 部署多服务应用,最推荐的方式是通过一个 docker-compose.yml 文件定义所有服务,然后用一条命令启动整个应用栈,适合本地开发、测试环境和中小规模生产部署。

先说结论:Docker Compose 通过 YAML 配置文件统一管理多个容器的依赖、网络和存储,用单条命令完成多服务应用的部署和生命周期管理。

  • 适合:本地开发环境搭建、微服务依赖管理、中小规模应用部署
  • 先准备:安装 Docker 和 Docker Compose,编写 docker-compose.yml 配置文件
  • 验收:使用 docker compose ps 检查服务状态,通过端口或日志验证服务可用性

命令速用版

如果你已经写好配置文件,直接执行以下命令即可启动所有服务:

docker compose up -d

常用命令速查:

# 启动所有服务(后台运行)
docker compose up -d

# 停止并移除所有容器和网络
docker compose down

# 查看服务状态
docker compose ps

# 查看服务日志
docker compose logs -f

# 重新构建并启动
docker compose up -d `--build`

为什么会这样

Docker Compose 的核心价值在于把原本需要多条 docker run 命令手动配置的容器集群,通过一个 YAML 文件集中定义。没有 Compose 时,启动一个包含 Web 应用、数据库、缓存的三服务应用,需要分别执行三条 docker run 命令,还要手动配置网络连接、端口映射和启动顺序。使用 Compose 后,这些配置都固化在 docker-compose.yml 中,一条命令就能完成所有服务的创建和启动。

Compose 管理的基本单位是项目(Project),一个项目由一组关联的服务组成。每个服务可以是一个或多个运行相同镜像的容器实例。服务之间的依赖关系、网络通信、数据持久化都通过配置文件声明,而不是在命令行中临时指定。

分步处理

第一步:准备配置文件

在项目根目录创建 docker-compose.yml 文件,定义所有服务。以下是一个典型的 Web 应用配置示例:

services:
  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      db:
        condition: service_healthy
    environment:
      - DATABASE_URL=postgresql://db:5432/app
  db:
    image: postgres:15
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=app
      - POSTGRES_USER=app
      - POSTGRES_PASSWORD=secret
    healthcheck:
      test: ["CMD", "pg_isready", "-U", "app"]
      interval: 10s
      timeout: 5s
      retries: 5
volumes:
  db-data:

第二步:启动服务

Docker Compose 怎么部署多服务应用?

在配置文件所在目录执行:

docker compose up -d

添加 -d 参数让服务在后台运行。首次执行时,Docker 会自动拉取所需镜像并创建容器。

第三步:配置服务依赖

如果服务之间存在依赖关系(如 Web 服务依赖数据库),使用 depends_on 定义启动顺序。注意基础依赖只控制启动顺序,不等待服务就绪;如需等待服务健康,需配合 healthcheck 和 condition: service_healthy 使用。

第四步:数据持久化

数据库等有状态服务必须使用 Volume 持久化数据,否则容器删除后数据会丢失。命名卷适合跨容器共享数据,绑定挂载适合开发环境直接映射主机目录。

怎么验证是否生效

检查服务状态:

docker compose ps

所有服务的 STATE 列应显示 Up,HEALTH 列显示 healthy(如果配置了健康检查)。

查看服务日志:

Docker Compose 怎么部署多服务应用?
docker compose logs web
docker compose logs db

检查日志中是否有启动错误或服务就绪信息。

验证端口映射:

curl http://localhost:8080

如果配置了端口映射,通过宿主机端口访问服务应能收到响应。

验证服务间通信:

进入容器内部测试与其他服务的连接:

docker compose exec web ping db

Compose 会自动为同一项目下的服务创建内部网络,服务名可直接作为主机名使用。

常见坑

1. 依赖服务未就绪就启动

depends_on 只控制启动顺序,不等待服务完全就绪。如果 Web 服务启动时数据库还没准备好,会导致连接失败。解决方案是配合 healthcheck 使用 condition: service_healthy,或在应用代码中实现重试逻辑。

Docker Compose 怎么部署多服务应用?

2. 数据卷未持久化

数据库服务如果没有配置 volumes,容器删除后数据会丢失。务必为有状态服务配置命名卷或绑定挂载。

3. 端口冲突

如果宿主机上已有服务占用相同端口,容器启动会失败。可以修改端口映射,如将 3306:3306 改为 3307:3306。

4. 环境变量未正确传递

环境变量中的特殊字符可能需要转义,或使用 .env 文件统一管理。敏感信息不要直接写在配置文件中。

5. Compose 版本差异

Docker Compose V2 将命令从 docker-compose 改为 docker compose(中间是空格而不是连字符)。较新版本的 Docker 已将其作为 docker cli 的子命令集成,建议统一使用 docker compose 命令。

参考来源

  • 阿里云开发者社区 - 《7 个 Docker Compose 技巧:轻松管理多容器应用部署的完整指南》
  • 阿里云开发者社区 - 《深入探索 Docker Compose:简化多容器应用的部署》(2024 年 11 月 14 日发布)
  • 阿里云开发者社区 - 《掌握 Docker Compose:简化你的多容器应用部署》(2024 年 9 月 27 日)
  • 阿里云开发者社区 - 《Docker-compose 部署多种常用应用实践指南》(2022 年 5 月 11 日发布)
  • 阿里云开发者社区 - 《Docker Compose 实战指南:多容器应用的一站式部署解决方案》(2025 年 11 月 7 日)
  • Docker 官方文档 - 《Docker Compose》(截至 2025 年 5 月 22 日)
  • 阿里云开发者社区 - 《简化多容器应用部署:深入理解 Docker Compose》(2024 年 6 月 7 日)