在现代应用开发中,微服务架构已成为主流趋势。应用系统通常由多个功能独立、分工明确的服务(如用户身份认证、商品目录管理、订单处理等)共同组成。每个微服务关注一项具体职责,通过协作完成复杂业务流程。
在实际运维与开发过程中,如何高效管理这些相互独立但又需要协同工作的服务,成为一项技术挑战。手动逐一启动、连接、停止各个服务,不仅操作繁琐,且容易由于环境或顺序配置失误导致系统不可用。
Docker Compose 作为面向容器化环境的多服务编排工具,致力于通过统一的配置文件和命令接口,实现服务的批量管理、自动化部署与拆卸。其出现极大提升了微服务系统的可维护性与一致性,是现代 DevOps 流程中的重要基础组件。

Docker Compose 是一款用于定义和管理多容器 Docker 应用的专业编排工具,通过 YAML 配置文件集中声明应用所依赖的全部服务及其参数。
运维人员与开发者仅需通过一条命令便可自动化地批量启动、停止、扩缩容、构建和管理所有相关的服务组件,有效简化了手动执行 docker run 命令时的繁杂操作和由此带来的环境一致性风险。compose.yaml 配置文件不仅承担着应用配置中心的角色,更充当了系统架构的文档载体,显著提升了可维护性和团队协作效率。
值得注意的是,Docker Compose 的诞生源于 Orchard 公司开发的 Fig 项目,该项目以其在多容器编排中的高效与优雅,迅速获得业界认可。
随后,Docker 官方收购并升级该项目,将其整合进 Docker 生态,定名为 Docker Compose。目前,Docker Compose 作为 docker 命令的一等公民,成为现代容器化微服务应用开发与运维的标准工具之一。
请注意,旧版命令为 docker-compose(带连字符),现已升级为 docker compose(以空格区分)。虽然 docker-compose 命令仍能兼容,但官方建议优先采用新版语法以获得最新功能与最佳兼容性。

compose.yaml 文件是 Docker Compose 体系的核心配置载体。作为多容器应用的集中声明中心,它系统性地定义了各服务(Service)的职责、相互依赖及其资源关系,确保应用整体结构的可维护性与一致性。
该文件通常包含三个顶层配置段落:services、networks 以及 volumes,分别用于定义服务编排、网络拓扑及数据持久化策略。
services 是最核心的部分,它定义了构成我们应用的各个微服务。每个服务都会被 Compose 部署为一个或多个容器。
在 services 下,你可以为每个服务指定:
image: 使用哪个镜像来创建容器,例如 redis:alpine。build: 如果镜像是定制的,可以指定 Dockerfile 的路径来现场构建。ports: 将容器的端口映射到主机的哪个端口,以便外部访问。environment: 设置容器内的环境变量。command: 覆盖容器启动时要执行的默认命令。networks 定义了服务之间沟通的渠道。默认情况下,Compose 会创建一个默认的网络,让所有服务都在这个网络内,这样它们就可以通过服务名直接相互访问。
你也可以自定义网络,实现更复杂的网络隔离和连接策略。
volumes 用于数据的持久化。容器本身是“无状态”的,意味着容器删除后,里面的数据就丢失了。这对于数据库、日志文件等需要长期保存的数据是致命的。volumes 独立于容器的生命周期存在。
即使容器被销毁重建,只要连接到同一个 volume,数据依然安然无恙。
纸上谈兵终觉浅,让我们通过一个实例来感受 Docker Compose 的魔力。我们将部署一个简单的 Web 应用,它会记录你访问页面的次数。这个应用包含两个服务:
web-fe:一个用 Python Flask 编写的网页前端。redis:一个内存数据库,用来存储访问次数。首先,你需要获取一个简单的示例代码。如果你安装了 Git,可以运行以下命令:
|$ git clone https://github.com/nigelpoulton/ddd-book.git
然后,进入到 ddd-book/multi-container 目录,这里存放着我们本次实战所需的所有文件。
|$ cd ddd-book/multi-container/ $ ls -l -rw-rw-r-- 1 ubuntu ubuntu 288 May 21 15:53 Dockerfile -rw-rw-r-- 1 ubuntu ubuntu 332 May 21 15:53 README.md drwxrwxr-x 4 ubuntu ubuntu 4096 May 21 15:53 app -rw-rw-r-- 1 ubuntu ubuntu 355 May 21 15:53
让我们一起看看 compose.yaml 是如何编排我们的应用的。
|services: web-fe: build: . command: python app.py ports: - target: 8080 published: 5001 networks: - counter-net volumes: - type: volume source: counter-vol target: /app redis:
services:
web-fe 服务:
build: .: 指示 Compose 使用当前目录下的 Dockerfile 来构建一个新镜像。command: python app.py: 在容器内运行 python app.py 命令来启动应用。ports: 将容器内的 8080 端口映射到我们电脑的 5001 端口。networks: 将此服务连接到名为 counter-net 的网络。volumes: 将名为 counter-vol 的数据卷挂载到容器的 /app 目录。redis 服务:
image: "redis:alpine": 直接使用 Docker Hub 上的官方 redis:alpine 镜像。networks: 同样连接到 counter-net 网络,这样 web-fe 就能通过服务名 redis 找到它。networks: 定义了一个名为 counter-net 的网络。
volumes: 定义了一个名为 counter-vol 的数据卷。
准备就绪,指挥家可以登场了!只需在 multi-container 目录下运行一个命令:
|$ docker compose up &
& 符号会让应用在后台运行。Compose 会开始阅读 compose.yaml 文件,然后:
web-fe 和 redis 所需的镜像。counter-net 网络和 counter-vol 数据卷。web-fe 和 redis 两个容器,并将它们连接到网络和数据卷。整个过程全自动完成,就像指挥家挥下指挥棒,所有乐手便开始演奏。
应用启动后,我们可以通过常规的 docker 命令来查看 Compose 为我们创建的资源。Compose 创建的所有资源名都会以项目名(即当前目录名 multi-container)作为前缀。
|$ docker ps
你会看到 multi-container-web-fe-1 和 multi-container-redis-1 两个正在运行的容器。
|$ docker network ls
你会找到 multi-container_counter-net 这个网络。
|$ docker volume ls
你会看到 multi-container_counter-vol 这个数据卷。
现在,打开你的浏览器,访问 http://localhost:5001。你应该能看到一个显示访问次数的页面。每次刷新页面,计数器都会增加,这证明我们的 web-fe 服务正在与 redis 服务正常通信!
Compose 不仅能启动应用,还能轻松管理它的整个生命周期。
查看应用状态 (ps):
想看看你的应用里有哪些服务正在运行?
|$ docker compose ps
停止应用 (stop):
临时暂停应用,但保留容器和网络等资源,以便快速重启。
|$ docker compose stop
重启应用 (restart):
重新启动已停止的应用。
|$ docker compose restart
关闭并移除应用 (down):
这是 up 的逆操作。它会停止并删除应用的所有容器和网络。
|$ docker compose down
Docker Compose 是每一位使用 Docker 的开发者都应该掌握的利器。它将复杂的多容器部署流程简化为一份配置文件和一个命令,极大地提升了开发和测试的效率。
通过 compose.yaml,我们可以清晰地定义应用架构,实现环境的快速复制和一致性。无论是对于个人项目还是团队协作,它都是你指挥微服务时,不可或缺的指挥棒。
docker compose down 默认不会删除数据卷(volumes)。这是为了保护你的数据。如果你想在关闭应用时一并删除数据卷,需要显式地添加 --volumes 标志。