跳转到主内容

Compose 入门

Compose 是一项规范,用于定义和运行多容器的 Docker 应用程序。通过 Compose,您可以使用 YAML 文件来配置应用程序的服务、网络和卷。这使您能够在一个文件中捕获运行一组相互关联的容器作为应用程序所需的全部配置。例如,如果您的应用程序需要一个 Web 服务器、一个数据库和一个缓存服务,您可以在 Compose 文件中定义这些组件及其关系。

要使用 Compose YAML,您可以利用一种规范实现,例如 podman composedocker compose

本教程涵盖了在 Podman Desktop 中使用多容器 Compose 应用程序所需的以下端到端任务:

准备工作

如果您没有安装 Compose,可以按照完整的入门流程在系统范围内安装它。

  1. 从目录中安装 Compose 扩展。更多详情,请参见安装 Podman Desktop 扩展

  2. 设置 Compose 并完成入门流程以在系统范围内配置它。入门流程

  3. 检查您是否能够运行 podman compose

    podman compose
    Run compose workloads via an external provider such as docker-compose or podman-compose

    Description:
    This command is a thin wrapper around an external compose provider such as docker-compose or podman-compose. This means that podman compose is executing another tool that implements the compose functionality but sets up the environment in a way to let the compose provider communicate transparently with the local Podman socket. The specified options as well the command and argument are passed directly to the compose provider.
    ...
注意

如果已安装 Compose,您可以导航到**设置 > 命令行工具**页面来选择升级或降级其版本。

下载并运行示例应用程序

我们的示例应用程序位于 github.com/redhat-developer/podman-desktop-demo

  1. 运行 git clone 以构建 Go 二进制 Web 应用程序

    git clone https://github.com/redhat-developer/podman-desktop-demo
    cd podman-desktop-demo/guestbook-compose
  2. 运行 podman compose up -d 以启动应用程序

    podman compose up -d
    >>>> Executing external compose provider "/usr/local/bin/docker-compose". Please refer to the documentation for details. <<<<

    [+] Running 3/3
    ✔ Container redis-replica Started 0.0s
    ✔ Container web Started 0.0s
    ✔ Container redis-leader Started 0.0s

查看留言簿应用程序

在 Podman Desktop 中,您现在可以看到所有三个容器都已启动并正在运行。

  1. 点击“打开浏览器”按钮以查看 Web 应用程序:打开浏览器

  2. 在留言簿 Web 应用程序中,您可以:

    • “签署”留言簿,这会写入 Redis 主节点并同步到副本。

    • “读取”留言簿,这会从 Redis 副本池中读取。即使 Redis 主节点不可用,这也能保证可读性。

    • /env:查看容器的环境变量。

    • /info:查看有关 Redis 集群的信息。

      Guestbook application

查看并修改数据库

使用 Podman Desktop,您还可以直接从图形界面访问容器的终端并修改数据库。

  1. 点击**打开终端**以访问 redis-leader 终端

    Open terminal

  2. 像进行数据库管理一样修改数据库

    1. 在容器内运行 redis-cli 以访问 Redis 数据库。

    2. 输入 LPUSH guestbook "Hello World!",您将看到您的 Web 应用程序实时更新。

    3. 输入 DEL guestbook,您将看到数据库删除了 guestbook 键并清空了数据库。

      Redis CLI

      更改将实时反映在留言簿上。

您可以进一步修改数据库,并看到更改传播到 Redis 副本。例如,查看 redis-replica 的日志,您会注意到有定期的数据库同步以及对数据库的读取操作。

Redis replica logs

工作原理

简要概述在这种多容器场景中架构是如何工作的

  • 在留言簿应用程序中,它会在端口 6379 上寻找名为 redis-leaderredis-replica 的数据库。
  • 因为这是一个 Compose 应用程序,所以容器连接在同一个网络上。这意味着相邻的容器可以通过其容器名称进行网络访问。

Web 应用程序可以在 Compose 应用程序中修改一组环境变量

  • REDIS_LEADER:默认值为 redis-leader
  • REDIS_REPLICAS:默认值为 redis-replica。可以是逗号分隔的列表,例如 redis-replica-1,redis-replica-2
  • REDIS_PORT:默认值为 6379
  • SERVER_PORT:默认值为 8080

扩展更多副本

想要扩展更多副本吗?这可以通过向您的 compose.yaml 添加一个环境变量并复制您的 redis-replica 条目来实现。

  1. 按如下方式修改您的 compose.yaml

    services:
    redis-leader:
    container_name: redis-leader
    image: redis:latest
    ports:
    - '6379'

    redis-replica:
    container_name: redis-replica
    image: redis:latest
    ports:
    - '6379'
    command: redis-server --replicaof redis-leader 6379

    redis-replica-2:
    container_name: redis-replica-2
    image: redis:latest
    ports:
    - '6379'
    command: redis-server --replicaof redis-leader 6379

    web:
    container_name: web
    build: ./web
    ports:
    - '8080:8080'
  2. 再次运行 podman compose up -d 以确保新容器已添加并且新的环境变量已生效

    podman compose up -d
    >>>> Executing external compose provider "/usr/local/bin/docker-compose". Please refer to the documentation for details. <<<<

    [+] Running 4/4
    ✔ Container redis-replica-2 Started 0.0s
    ✔ Container redis-leader Running 0.0s
    ✔ Container web Started 0.0s
    ✔ Container redis-replica Running 0.0s