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

教程:在用于容器的 Web 应用中创建多容器(预览版)应用

注意

Sidecar 容器(预览版)将在应用服务中成功使用多容器应用。 若要开始使用,请参阅教程:在 Azure 应用服务中为自定义容器配置 sidecar 容器(预览版)

用于容器的 Web 应用中可以灵活使用 Docker 映像。 本教程介绍如何使用 WordPress 和 MySQL 创建多容器应用。 你将在 Cloud Shell 中完成本教程,但是也可以使用 Azure CLI 命令行工具(2.0.32 或更高版本)在本地运行这些命令。

在本教程中,你将了解如何执行以下操作:

  • 转换 Docker Compose 配置以使用用于容器的 Web 应用
  • 将多容器应用部署到 Azure
  • 添加应用程序设置
  • 对容器使用持久性存储
  • 连接到 Azure Database for MySQL
  • 排查错误

如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户

先决条件

若要完成本教程,需要具有使用 Docker Compose 的经验。

下载示例

本教程使用 Docker 中的 compose 文件,但我们将对其进行修改,使之包含 Azure Database for MySQL、持久性存储和 Redis。 可在 Azure 示例中找到该配置文件。 在下面的示例中,请注意,depends_on不受支持的选项,并且将被忽略。 有关受支持的配置选项,请参阅 Docker Compose 选项

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

在 Cloud Shell 中,创建一个 tutorial 目录,然后切换到该目录。

mkdir tutorial

cd tutorial

接下来,运行以下命令将示例应用存储库克隆到 tutorial 目录。 然后切换到 multicontainerwordpress 目录。

git clone https://github.com/Azure-Samples/multicontainerwordpress

cd multicontainerwordpress

创建资源组

资源组是在其中部署和管理 Azure 资源(例如 Web 应用、数据库和存储帐户)的逻辑容器。 例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。

在 Cloud Shell 中,使用 az group create 命令创建资源组。 下面的示例命令在“美国中南部”位置创建名为 myResourceGroup 的资源组。 若要查看标准层中 Linux 上的应用服务支持的所有位置,请运行 az appservice list-locations --sku S1 --linux-workers-enabled 命令。

az group create --name myResourceGroup --location "South Central US"

通常在附近的区域中创建资源组和资源。

此命令完成后,JSON 输出会显示资源组属性。

创建 Azure 应用服务计划

在 Cloud Shell 中,使用 az appservice plan create 命令在资源组中创建应用服务计划。

以下示例在标准定价层 (--sku S1) 和 Linux 容器 (--is-linux) 中创建名为 myAppServicePlan 的应用服务计划。

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku S1 --is-linux

创建应用服务计划后,Cloud Shell 会显示类似于以下示例的信息。

{
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "South Central US",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "South Central US",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
}

使用 WordPress 和 MySQL 容器的 Docker Compose

创建 Docker Compose 应用

在 Cloud Shell 中,使用 az webapp create 命令在 myAppServicePlan 应用服务计划中创建一个多容器 Web 应用。 不要忘记将 <app-name> 替换为唯一的应用名称。

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

创建 Web 应用后,Cloud Shell 会显示类似于以下示例的输出:

{
  "additionalProperties": {},
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.azurewebsites.net",
  "enabled": true,
  < JSON data removed for brevity. >
}

浏览到应用

浏览到所部署的应用 (http://<app-name>.azurewebsites.net)。 该应用可能需要几分钟时间才能完成加载。 如果收到错误,请在几分钟后刷新浏览器。 如果遇到问题并想要进行故障排除,请查看容器日志

用于容器的 Web 应用中的示例多容器应用

祝贺你,现已在用于容器的 Web 应用中创建了多容器应用。 接下来,请将应用配置为使用 Azure Database for MySQL。 暂时不要安装 WordPress。

连接到生产数据库

不建议在生产环境中使用数据库容器。 本地容器不可缩放。 应改用可缩放的 Azure Database for MySQL。

创建 Azure Database for MySQL 服务器

使用 az mysql server create 命令创建 Azure Database for MySQL 服务器。

在以下命令中,请将 <mysql-server-name> 占位符替换为你的 MySQL 服务器名称(有效字符是 a-z0-9-)。 此名称是 MySQL 服务器主机名 (<mysql-server-name>.database.windows.net) 的一部分,必须全局唯一。

az mysql server create --resource-group myResourceGroup --name <mysql-server-name>  --location "South Central US" --admin-user adminuser --admin-password My5up3rStr0ngPaSw0rd! --sku-name B_Gen5_1 --version 5.7

创建服务器可能需要几分钟才能完成。 创建 MySQL 服务器后,Cloud Shell 会显示类似于以下示例的信息:

{
  "administratorLogin": "adminuser",
  "administratorLoginPassword": null,
  "fullyQualifiedDomainName": "<mysql-server-name>.database.windows.net",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>",
  "location": "southcentralus",
  "name": "<mysql-server-name>",
  "resourceGroup": "myResourceGroup",
  ...
}

配置服务器防火墙

使用 az mysql server firewall-rule create 命令创建 MySQL 服务器的防火墙规则,以便建立客户端连接。 若同时将起始 IP 和结束 IP 设置为 0.0.0.0,防火墙将仅对其他 Azure 资源开启。

az mysql server firewall-rule create --name allAzureIPs --server <mysql-server-name> --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 0.0.0.0

提示

你甚至可以让防火墙规则更严格,即只使用应用所使用的出站 IP 地址

创建 WordPress 数据库

az mysql db create --resource-group myResourceGroup --server-name <mysql-server-name> --name wordpress

创建数据库后,Cloud Shell 会显示类似于以下示例的信息:

{
  "additionalProperties": {},
  "charset": "latin1",
  "collation": "latin1_swedish_ci",
  "id": "/subscriptions/12db1644-4b12-4cab-ba54-8ba2f2822c1f/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/<mysql-server-name>/databases/wordpress",
  "name": "wordpress",
  "resourceGroup": "myResourceGroup",
  "type": "Microsoft.DBforMySQL/servers/databases"
}

在 WordPress 中配置数据库变量

若要将 WordPress 应用连接到这个新的 MySQL 服务器,请配置几个特定于 WordPress 的环境变量,包括 MYSQL_SSL_CA 定义的 SSL CA 路径。 以下自定义映像中提供了来自 DigiCertBaltimore 网络信任根证书

若要进行这些更改,请在 Cloud Shell 中使用 az webapp config appsettings set 命令。 应用设置区分大小写,用空格分开。

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WORDPRESS_DB_HOST="<mysql-server-name>.mysql.database.azure.com" WORDPRESS_DB_USER="adminuser" WORDPRESS_DB_PASSWORD="My5up3rStr0ngPaSw0rd!" WORDPRESS_DB_NAME="wordpress" MYSQL_SSL_CA="BaltimoreCyberTrustroot.crt.pem"

创建应用设置后,Cloud Shell 会显示类似于以下示例的信息。

[
  {
    "name": "WORDPRESS_DB_HOST",
    "slotSetting": false,
    "value": "<mysql-server-name>.mysql.database.azure.com"
  },
  {
    "name": "WORDPRESS_DB_USER",
    "slotSetting": false,
    "value": "adminuser"
  },
  {
    "name": "WORDPRESS_DB_NAME",
    "slotSetting": false,
    "value": "wordpress"
  },
  {
    "name": "WORDPRESS_DB_PASSWORD",
    "slotSetting": false,
    "value": "My5up3rStr0ngPaSw0rd!"
  },
  {
    "name": "MYSQL_SSL_CA",
    "slotSetting": false,
    "value": "BaltimoreCyberTrustroot.crt.pem"
  }
]

有关环境变量的详细信息,请参阅配置环境变量

对 MySQL TLS/SSL 和其他配置使用自定义映像

默认情况下,TLS/SSL 由 Azure Database for MySQL 使用。 WordPress 需要附加的配置才能将 TLS/SSL 和 MySQL 配合使用。 WordPress“官方映像”不提供附加的配置,但出于方便,已准备了一个自定义映像。 在实践中,请将所需的更改添加到自己的映像。

自定义映像基于 Docker 中心的 WordPress 的“官方映像”。 适用于 Azure Database for MySQL 的此自定义映像中已做出以下更改:

为 Redis 做出了以下更改(在稍后的部分中使用):

若要使用自定义映像,请更新 docker-compose-wordpress.yml 文件。 在 Cloud Shell 中,打开文本编辑器,然后将 image: wordpress 更改为使用 image: mcr.microsoft.com/azuredocs/multicontainerwordpress。 不再需要数据库容器。 从配置文件中删除 dbenvironmentdepends_onvolumes 节。 文件应如以下代码所示:

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     ports:
       - "8000:80"
     restart: always

使用新配置更新应用

在 Cloud Shell 中,使用 az webapp config container set 命令重新配置多容器 Web 应用。 不要忘记将 <app-name> 替换为前面创建的 Web 应用的名称。

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

重新配置应用后,Cloud Shell 会显示类似于以下示例的信息:

[
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICB3b3JkcHJlc3M6CiAgICAgaW1hZ2U6IG1zYW5nYXB1L3dvcmRwcmVzcwogICAgIHBvcnRzOgogICAgICAgLSAiODAwMDo4MCIKICAgICByZXN0YXJ0OiBhbHdheXM="
  }
]

浏览到应用

浏览到所部署的应用 (http://<app-name>.azurewebsites.net)。 应用正在使用 Azure Database for MySQL。

用于容器的 Web 应用中的示例多容器应用

添加持久性存储

多容器应用正在用于容器的 Web 应用中运行。 但是,如果现在安装 WordPress 并稍后重启应用,则会发现 WordPress 安装已消失。 之所以发生这种情况,是因为 Docker Compose 配置当前指向容器中的存储位置。 重启应用后,在容器中安装的文件不会保留。 在本部分,我们将向 WordPress 容器添加持久性存储

配置环境变量

若要使用持久性存储,请在应用服务中启用此设置。 若要进行此项更改,请在 Cloud Shell 中使用 az webapp config appsettings set 命令。 应用设置区分大小写,用空格分开。

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_ENABLE_APP_SERVICE_STORAGE=TRUE

创建应用设置后,Cloud Shell 会显示类似于以下示例的信息。

[
  < JSON data removed for brevity. >
  {
    "name": "WORDPRESS_DB_NAME",
    "slotSetting": false,
    "value": "wordpress"
  },
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "slotSetting": false,
    "value": "TRUE"
  }
]

修改配置文件

在 Cloud Shell 中,在文本编辑器中打开 docker-compose-wordpress.yml 文件。

volumes 选项将文件系统映射到容器中的某个目录。 ${WEBAPP_STORAGE_HOME} 是应用服务中已映射到应用持续性存储的环境变量。 将在 volumes 选项中使用此环境变量,以便将 WordPress 文件安装到持久性存储,而不是安装到容器。 对文件做出以下修改:

如以下代码所示,在 wordpress 节中添加 volumes 选项:

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     volumes:
      - ${WEBAPP_STORAGE_HOME}/site/wwwroot:/var/www/html
     ports:
       - "8000:80"
     restart: always

使用新配置更新应用

在 Cloud Shell 中,使用 az webapp config container set 命令重新配置多容器 Web 应用。 不要忘记将 <app-name> 替换为唯一的应用名称。

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml

该命令运行后,会显示类似于以下示例的输出:

[
  {
    "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE",
    "slotSetting": false,
    "value": "TRUE"
  },
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo="
  }
]

浏览到应用

浏览到所部署的应用 (http://<app-name>.azurewebsites.net)。

WordPress 容器正在使用 Azure Database for MySQL 和持久性存储。

添加 Redis 容器

WordPress“官方映像”不包含 Redis 的依赖项。 此自定义映像中准备好这些依赖项和所需的附加配置,以便用户能够配合 WordPress 使用 Redis。 在实践中,请将所需的更改添加到自己的映像。

自定义映像基于 Docker 中心的 WordPress 的“官方映像”。 适用于 Redis 的此自定义映像中已做出以下更改:

如以下示例所示,将 Redis 容器添加到配置文件的底部:

version: '3.3'

services:
   wordpress:
     image: mcr.microsoft.com/azuredocs/multicontainerwordpress
     ports:
       - "8000:80"
     restart: always

   redis:
     image: mcr.microsoft.com/oss/bitnami/redis:6.0.8
     environment:
      - ALLOW_EMPTY_PASSWORD=yes
     restart: always

配置环境变量

若要使用 Redis,请在应用服务中启用 WP_REDIS_HOST 设置。 WordPress 在与 Redis 主机通信时必须使用此设置。 若要进行此项更改,请在 Cloud Shell 中使用 az webapp config appsettings set 命令。 应用设置区分大小写,用空格分开。

az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WP_REDIS_HOST="redis"

创建应用设置后,Cloud Shell 会显示类似于以下示例的信息。

[
  < JSON data removed for brevity. >
  {
    "name": "WORDPRESS_DB_USER",
    "slotSetting": false,
    "value": "adminuser"
  },
  {
    "name": "WP_REDIS_HOST",
    "slotSetting": false,
    "value": "redis"
  }
]

使用新配置更新应用

在 Cloud Shell 中,使用 az webapp config container set 命令重新配置多容器 Web 应用。 不要忘记将 <app-name> 替换为唯一的应用名称。

az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file compose-wordpress.yml

该命令运行后,会显示类似于以下示例的输出:

[
  {
    "name": "DOCKER_CUSTOM_IMAGE_NAME",
    "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo="
  }
]

浏览到应用

浏览到所部署的应用 (http://<app-name>.azurewebsites.net)。

完成上述步骤并安装 WordPress。

将 WordPress 连接到 Redis

以管理员身份登录到 WordPress。在左侧导航栏中选择“插件”,然后选择“安装插件”。

选择 WordPress 插件

此处显示了所有插件

在插件页中,找到“Redis 对象缓存”并单击“激活”。

激活 Redis

单击“设置” 。

单击“设置”

单击“启用对象缓存”按钮。

单击“启用对象缓存”按钮

WordPress 将连接到 Redis 服务器。 同一页面上会显示连接状态

WordPress 连接到 Redis 服务器。连接状态显示在同一页面上。

祝贺你,现已将 WordPress 连接到 Redis。 生产就绪的应用正在使用 Azure Database for MySQL、持久性存储和 Redis。 现在可以扩展应用服务计划以包含多个实例。

查找 Docker 容器日志

如果使用多个容器时遇到问题,可以通过浏览到 https://<app-name>.scm.azurewebsites.net/api/logs/docker 来访问容器日志。

将会看到类似于以下示例的输出:

[
   {
      "machineName":"RD00XYZYZE567A",
      "lastUpdated":"2018-05-10T04:11:45Z",
      "size":25125,
      "href":"https://<app-name>.scm.azurewebsites.net/api/vfs/LogFiles/2018_05_10_RD00XYZYZE567A_docker.log",
      "path":"/home/LogFiles/2018_05_10_RD00XYZYZE567A_docker.log"
   }
]

查看每个容器的日志,以及父进程的附加日志。 将相应的 href 值复制到浏览器以查看日志。

清理部署

运行示例脚本后,可以使用以下命令删除资源组以及与其关联的所有资源。

az group delete --name myResourceGroup

后续步骤

在本教程中,你了解了如何执行以下操作:

  • 转换 Docker Compose 配置以使用用于容器的 Web 应用
  • 将多容器应用部署到 Azure
  • 添加应用程序设置
  • 对容器使用持久性存储
  • 连接到 Azure Database for MySQL
  • 排查错误

请继续学习下一教程,了解如何使用自定义域和证书保护应用。

或者,查看其他资源: