Docker Compose 深度解析:多容器应用部署利器

Docker Compose 是 Docker 生态系统中的重要工具,专为简化多容器应用程序的管理而设计。本文将深入探讨 Docker Compose 的定义、核心用途、显著优势,并详细介绍其常用命令和如何创建与运行 `compose.yml` 文件,帮助开发者高效管理复杂应用。

阅读时长: 7 分钟
共 3175字
作者: eimoon.com

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.ymldocker-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 文件是定义多容器应用程序的第一步,它主要涉及生成文件和配置所需服务。

  1. 生成文件: 在您的主项目目录中使用文本编辑器创建一个新的 YAML 文件。推荐的文件名是 compose.ymldocker-compose.yml。 例如,使用 nano 编辑器创建文件:

    nano compose.yml
    
  2. 定义服务: 在创建的文件中,使用 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 密钥、密码),这些信息以文件形式挂载到容器中。
  3. 保存并退出文件: 完成 compose.yml 文件的编写后,保存并关闭文本编辑器。

如何运行 Docker Compose 文件

当您在项目目录中准备好 compose.yml 文件后,只需运行一个简单的命令,即可一次性启动整个多容器应用程序:

docker compose up

此命令会读取 compose.yml 文件,并执行以下操作:

  1. 如果需要,会构建或拉取定义的所有服务镜像。
  2. 创建并启动所有容器,并按照 depends_on 定义的顺序和依赖关系进行。
  3. 为服务创建网络,并允许它们通过服务名互相发现。
  4. 将容器的日志输出到当前终端。

如果您希望在后台(分离模式)运行命令,以便继续使用当前的 shell 提示符,请执行:

docker compose up -d

-d 选项会使 Docker Compose 在后台运行容器,并立即返回控制台,这对于长时间运行的服务非常有用。


关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计