你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 Docker Compose 应用迁移到 Azure 应用服务中的 sidecar 容器

如果在 Azure 应用服务中运行 Docker Compose 应用,则应将其迁移到 sidecars。 将 Docker Compose 应用迁移到 sidecars 有两个主要策略。

  • 基于脚本的迁移 - 建议用于简单设置。
  • 手动迁移

先决条件

  • PowerShell
  • Azure CLI
  • Docker (用于生成和推送映像)

使用脚本进行迁移

如果 Docker Compose 文件非常简单,则可以使用官方迁移脚本自动执行该过程。

重要

在运行迁移脚本之前,请始终从 Azure 门户备份应用。

  1. 从 Azure 示例 GitHub 存储库下载迁移脚本。

  2. 在 PowerShell 中运行脚本,提供订阅 ID、Web 应用名称、资源组、注册表 URL、base64 编码的 Docker Compose 文件、主服务名称和目标端口。

    ./update-webapp.ps1 `
      -subscriptionId "<subscriptionId>" `
      -webAppName "<webAppName>" `
      -resourceGroup "<resourceGroup>" `
      -registryUrl "<registryUrl>" `
      -base64DockerCompose "<base64DockerCompose>" `
      -mainServiceName "<mainServiceName>" `
      -targetPort "<targetPort>"
    

    如果注册表需要身份验证,脚本会提示你以交互方式提供 dockerRegistryServerUsernamedockerRegistryServerPassword

手动迁移

  1. 登录到 Azure 并设置订阅。

    az login
    az account set --subscription <your-subscription-id>
    
  2. 收集所需的详细信息。

    az account show --query id --output tsv
    az webapp list --query "[].{name:name}" --output tsv
    az group list --query "[].{name:name}" --output tsv
    az acr list --query "[].{name:name}" --output tsv
    

    它们将帮助你标识订阅 ID、应用名称、资源组和 Azure 容器注册表。

  3. 创建部署槽位。 在将槽切换到生产环境之前,将验证迁移的挎斗。

    az webapp deployment slot create --name <webapp-name> --resource-group <resource-group> --slot <slot-name>
    
  4. 从生产应用解码现有的 Docker Compose 配置。

    az webapp config show --name <webapp-name> --resource-group <resource-group> --query linuxFxVersion
    

    从输出复制 base64 部件,并在 PowerShell 中解码它:

    [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String("<base64value>"))
    
  5. 对于 Compose 文件中的每个服务,请在 sitecontainers URL 路径下的部署槽中创建相应的 container 资源:

    az rest --method PUT \
      --url https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Web/sites/<webapp-name>/slots/<slot-name>/sitecontainers/<container-name>?api-version=2023-12-01 \
      --body '{"name":"<container-name>", "properties":{"image":"<image-name>", "isMain": <true/false>, "targetPort": <port>}}'
    
    • 使用 Docker Compose 属性和挎斗配置的映射来帮助完成映射。

    • <container-name> 中使用您想要的容器名称。

    • 将主应用容器的 isMain 设置为 true,将挎斗的设置为 false

    • 对于 <image-name>,请使用包含服务器名称的映像的完整路径。 例如:

      "image":"myregistry.azurecr.io/myapp/backend:latest"
      
    • 对所有容器重复此步骤。

  6. 将部署槽切换为使用挎斗模式。

    az webapp config set --name <webapp-name> --resource-group <resource-group> --slot <slot-name> --linux-fx-version "sitecontainers"
    
  7. 重启部署槽位,然后在部署槽中验证迁移的应用的功能。

    az webapp restart --name <webapp-name> --resource-group <resource-group> --slot <slot-name>
    
  8. 验证后,将槽交换到生产环境:

    az webapp deployment slot swap --name <webapp-name> --resource-group <resource-group> --slot <slot-name> --target-slot production
    

Docker Compose 属性和挎斗配置的映射

以下 Docker Compose 字段对应于 sidecar 配置:

Docker Compose 挎斗配置 注释
commandentrypoint startUpCommand
environment environmentVariables
image image
ports targetPort 仅支持端口 80 和 8080 用于外部流量。
volumes volumeMounts 不支持持久性 Azure 存储。

挎斗不支持以下 Docker Compose 字段:

Docker Compose 字段 支持 注释
build 不允许 预生成映像并将映像推送到注册表。
depends_on 忽略 不保证容器的启动顺序。
networks 忽略 网络连接在系统内部处理。
secrets 忽略 使用应用服务应用设置或 Key Vault 来管理机密信息。
volumes 使用 {WEBAPP_STORAGE_HOME}{WEBSITES_ENABLE_APP_SERVICE_STORAGE} 不支持

迁移限制和注意事项

下表显示了 Docker Compose 应用中当前支持的功能,这些功能在挎斗中不受支持或支持有限。

功能 / 特点 Docker Compose Sidecar
存储 容器之间共享的卷 容器专用的持久存储受限
网络 服务名称作为主机名 所有容器共享 localhost;每个容器需要独特的端口
日志记录和监测 自定义驱动程序,外部工具 与 Azure Monitor 和 Log Analytics 集成
应用服务环境 (ASE) 已支持 尚不支持
国家云 已支持 尚不支持

更多资源