Docker Compose 是 Docker 生态系统中的一个强大工具,它极大简化了复杂 Docker 应用程序的部署与管理。通过使用一个简单的 YAML 文件,用户可以定义、配置和编排多个相互关联的容器,并实现它们的一键启动、扩展和管理。
Docker Compose 是什么?
Docker Compose 是 Docker 平台中的一个关键组件,旨在简化多容器应用程序的生命周期管理。它构建在 Docker 的核心功能之上,为其提供额外的编排能力。
Docker 与 Docker Compose 的区别:
- Docker:一个功能丰富的开源平台,用于开发、发布和运行软件。它通过将应用程序及其所有依赖项打包到可移植、自给自足的“容器”中,实现了应用环境的隔离和标准化。
- Docker Compose:作为 Docker 生态系统的一部分,它的核心目标是简化那些由多个容器共同组成的应用程序(如微服务架构)的管理和部署过程。它允许用户通过一个配置文件来定义和运行这些多容器应用。
Docker Compose 的主要用途
Docker Compose 在多种场景下都展现出其独特的价值,以下是一些常见的应用场景:
- 自动化测试环境:开发团队可以轻松创建、销毁并重新创建一致的测试环境,确保每次测试都在干净且可重复的环境中进行。
- 单主机部署:非常适合在单个开发机或服务器上进行本地开发和测试工作流,快速启动和停止整个应用栈。
- 开发环境快速搭建:能够快速启动新的隔离开发环境,并配置所有必要的服务依赖项,包括数据库(如 MySQL、PostgreSQL)、缓存(如 Redis)、Web 服务 API 等,极大地提升了开发效率。
Docker Compose 的核心优势
Docker Compose 的主要目标是简化容器化应用程序的部署和管理,其带来的主要优势包括:
- 快速简单的配置:通过简洁的 YAML 脚本和环境变量,极大地简化了应用程序中各个服务(Service)的配置过程。
- 安全的内部通信:Compose 会自动为所有定义的服务创建一个共享的隔离网络,使得容器间可以安全且便捷地进行内部通信,提升了应用程序的整体安全性。
- 高度可移植性与 CI/CD 支持:由于所有服务、网络和卷的定义都集中在单个 YAML 文件中,这使得应用程序环境可以轻松共享。无论在本地开发机还是 CI/CD 流水线中,都可以在几分钟内启动完全一致的环境,极大地促进了持续集成/持续部署。
- 高效资源利用:它允许在单个主机上托管多个相互隔离的应用程序环境,有效减少了基础设施的开销。此外,Compose 支持容器的重用和配置缓存,进一步优化了资源利用率。
- 促进 DevOps 实践:通过提供一致且可重复的部署流程,Docker Compose 促进了开发(Dev)和运维(Ops)团队之间的协作。它支持快速原型设计和迭代,加速了产品发布周期。
docker compose
命令详解
运行 Docker Compose 命令的基本语法是:
docker compose [command] [options]
例如,要构建 compose.yml
文件中指定的服务镜像,可以执行:
docker compose build
重要提示:在 Docker 的早期版本中,Docker Compose 的命令是 docker-compose
(中间带连字符)。而当前版本,Docker CLI 已将 Compose 功能集成,命令变成了 docker compose
(中间带空格)。虽然命令格式有所变化,但其子命令和选项基本保持不变。
以下是 docker compose
常用子命令及其说明:
命令 | 说明 |
---|---|
docker compose build |
查找 compose.yml 文件中包含 build: 语句的服务,并根据 Dockerfile 运行 docker build 构建其镜像。 |
docker compose run |
在基于服务配置的临时容器中运行一次性命令,例如运行数据库迁移脚本。 |
docker compose up |
构建、(重新)创建、启动并连接到 compose.yml 文件中定义的所有容器。如果容器已存在,它会尝试更新。 |
docker compose start |
启动现有但已停止的容器。 |
docker compose stop |
停止运行中的容器,但不会移除它们(容器状态变为 Exited )。 |
docker compose pause |
暂停运行中的容器,使其暂时停止执行进程。 |
docker compose unpause |
恢复已暂停的容器。 |
docker compose down |
停止并移除由 compose.yml 定义的容器、它们的网络、默认卷和匿名卷。可选择移除镜像。 |
docker compose ps |
列出 compose.yml 中定义的正在运行的容器及其状态。 |
docker compose images |
列出由已创建容器使用的镜像。 |
docker compose ls |
列出正在运行的 Docker Compose 项目(通常是文件夹)。 |
docker compose
常用选项
docker compose
命令还可以接受以下通用选项,以更精细地控制其行为:
选项 | 说明 |
---|---|
--all-resources |
包含所有资源,包括服务未使用的资源(在某些命令中,如 ls ,显示更多信息)。 |
`–ansi [never | always |
--compatibility |
以向后兼容模式运行 Docker Compose,尝试兼容旧版 Docker Swarm 配置。 |
--dry-run |
以空运行模式执行命令,显示将要执行的操作,但不实际执行。 |
--env-file [path] |
指定备用环境文件(例如 .env ),从中加载环境变量。 |
-f [path] |
指定一个或多个 docker-compose 配置文件位置,默认是当前目录下的 compose.yml 或 docker-compose.yml 。 |
--help |
显示 docker compose 命令的帮助信息、用法说明和可用参数。 |
--parallel [number] |
控制最大并行度(默认值:-1,表示无限制),限制同时操作的容器数量。 |
--profile [profile] |
指定要启用的配置文件。在 compose.yml 中可以定义不同的 Profile 来选择性地启动服务。 |
`–progress [tty | plain |
--project-directory [path] |
指定备用工作目录(默认值:compose.yml 文件所在的目录)。 |
-p , --project-name [name] |
为 Compose 项目命名。如果未指定,将使用当前目录名作为项目名。 |
如何创建 Docker Compose 文件
创建 Docker Compose YAML 文件是定义多容器应用程序的第一步,它主要涉及生成文件和配置所需服务。
-
生成文件: 在您的主项目目录中使用文本编辑器创建一个新的 YAML 文件。推荐的文件名是
compose.yml
或docker-compose.yml
。 例如,使用nano
编辑器创建文件:nano compose.yml
-
定义服务: 在创建的文件中,使用 YAML 语法来定义构成您应用程序的各个服务(Service)。每个服务通常会指定要使用的 Docker 镜像、端口映射、卷挂载、环境变量以及服务间的依赖关系等。 以下是一个示例
compose.yml
文件,它定义了一个包含 WordPress、MariaDB 数据库和 Nginx 反向代理的典型 Web 应用程序部署:services: # 定义应用程序中的所有服务 wordpress: # 第一个服务:WordPress 应用 image: wordpress:latest # 使用官方的 WordPress 镜像 ports: # 端口映射,将主机的 8080 端口映射到容器的 80 端口 - "8080:80" depends_on: # 依赖项,表示 wordpress 容器在 database 容器启动后才启动 - database environment: # 环境变量,用于配置 WordPress 连接数据库 WORDPRESS_DB_HOST: database # 数据库主机名,这里是 services 中定义的 database 服务名 WORDPRESS_DB_NAME: wordpress WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: root volumes: # 卷挂载,用于持久化 WordPress 数据 - ./wordpress_data:/var/www/html # 将主机当前目录下的 wordpress_data 目录挂载到容器的 /var/www/html database: # 第二个服务:MariaDB 数据库 image: mariadb:latest # 使用官方的 MariaDB 镜像 environment: # 环境变量,设置 MariaDB 的 root 密码 MYSQL_ROOT_PASSWORD: root volumes: # 卷挂载,用于持久化数据库数据 - ./database_data:/var/lib/mysql # 将主机当前目录下的 database_data 目录挂载到容器的 /var/lib/mysql nginx: # 第三个服务:Nginx 反向代理 image: nginx:latest # 使用官方的 Nginx 镜像 ports: # 端口映射,将主机的 80 端口映射到容器的 80 端口 - "80:80" depends_on: # 依赖项,表示 nginx 容器在 wordpress 容器启动后才启动 - wordpress # 如果需要 Nginx 代理到 WordPress,通常需要挂载一个自定义的 nginx.conf 配置文件 # 例如:- ./nginx.conf:/etc/nginx/conf.d/default.conf volumes: # 声明 Docker Compose 管理的命名卷,这些卷可以在服务之间共享,并且在容器移除后数据依然持久化 wordpress_data: # 定义一个名为 wordpress_data 的卷 database_data: # 定义一个名为 database_data 的卷
services
:这是compose.yml
文件的核心部分,用于定义构成应用程序的各个服务(即容器)。每个服务必须至少有一个键,如image
(指定使用的 Docker 镜像)或build
(指定用于构建镜像的 Dockerfile 上下文)。- 可选的高级部分:除了
services
外,compose.yml
文件还可以包含其他可选部分,用于更复杂的配置:version
:指定 Compose 文件格式的版本,例如3.9
。虽然它现在是一个可选字段,但在早期的 Compose 版本中是必需的。networks
:定义自定义的服务网络,允许您精细控制容器间的通信。volumes
:声明可在服务之间共享或在容器重启后持久化的卷。configs
:定义要挂载到容器中的配置文件,常用于共享非敏感配置数据。secrets
:定义安全传递给容器的敏感信息(如 API 密钥、密码),这些信息以文件形式挂载到容器中。
-
保存并退出文件: 完成
compose.yml
文件的编写后,保存并关闭文本编辑器。
如何运行 Docker Compose 文件
当您在项目目录中准备好 compose.yml
文件后,只需运行一个简单的命令,即可一次性启动整个多容器应用程序:
docker compose up
此命令会读取 compose.yml
文件,并执行以下操作:
- 如果需要,会构建或拉取定义的所有服务镜像。
- 创建并启动所有容器,并按照
depends_on
定义的顺序和依赖关系进行。 - 为服务创建网络,并允许它们通过服务名互相发现。
- 将容器的日志输出到当前终端。
如果您希望在后台(分离模式)运行命令,以便继续使用当前的 shell 提示符,请执行:
docker compose up -d
-d
选项会使 Docker Compose 在后台运行容器,并立即返回控制台,这对于长时间运行的服务非常有用。
关于
关注我获取更多资讯

