教學課程:在用於容器的 Web 應用程式中建立多容器 (預覽) 應用程式

注意

多容器處於預覽狀態。

適用於容器的 Web 應用程式提供彈性的 Docker 映像使用方式。 在本教學課程中,您將了解如何使用 WordPress 和 MySQL 建立多容器應用程式。 您會在 Cloud Shell 中完成本教學課程,但您也可以在本機使用 Azure CLI 命令列工具 (2.0.32 或更新版本) 來執行這些命令。

在本教學課程中,您會了解如何:

  • 將 Docker Compose 組態轉換為使用適用於容器的 Web 應用程式
  • 將多容器應用程式部署至 Azure
  • 新增應用程式設定
  • 對您的容器使用永續性儲存體
  • 連線到適用於 MySQL 的 Azure 資料庫
  • 針對錯誤進行疑難排解

如果您沒有 Azure 訂閱,請在開始之前,先建立 Azure 免費帳戶

必要條件

若要完成本教學課程,您需要有 Docker Compose 的使用經驗。

下載範例

在本教學課程中,您會使用 Docker 中的 Compose 檔案,但您會將其修改為包含適用於 MySQL 的 Azure 資料庫、永續性儲存體和 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 中,建立教學課程目錄並變更為此目錄。

mkdir tutorial

cd tutorial

下一步,執行下列命令,將範例應用程式存放庫複製到您的教學課程目錄。 然後,變更為 multicontainerwordpress 目錄。

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

cd multicontainerwordpress

建立資源群組

資源群組是一個邏輯容器,可在其中部署與管理 Azure 資源 (例如 Web 應用程式、資料庫和儲存體帳戶)。 例如,您可以選擇在稍候透過一個簡單的步驟刪除整個資源群組。

在 Cloud Shell 中,使用 az group create 命令來建立資源群組。 下列範例會在美國中南部位置中建立名為 myResourceGroup 的資源群組。 若要查看標準層中 Linux 上之 App Service 的所有支援位置,請執行 az appservice list-locations --sku S1 --linux-workers-enabled 命令。

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

您通常會在附近的區域中建立資源群組和資源。

當命令完成時,JSON 輸出會顯示資源群組屬性。

建立 Azure App Service 方案

在 Cloud Shell 中,使用 az appservice plan create 命令在資源群組中建立 App Service 方案。

下列範例會在標準定價層 (--sku S1) 和 Linux 容器 (--is-linux) 中,建立名為 myAppServicePlan 的 App Service 方案。

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

建立 App Service 方案後,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 App Service 方案中建立多容器 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)。 此應用程式可能需要數分鐘才能載入。 如果發生錯誤,請再等待數分鐘,然後重新整理瀏覽器。 如果您在到問題而想要進行疑難排解,請檢閱容器記錄

Sample multi-container app on Web App for Containers

恭喜,您已在適用於容器的 Web 應用程式中建立多容器應用程式。 接下來,您必須設定應用程式以使用適用於 MySQL 的 Azure 資料庫。 請勿在此時安裝 WordPress。

連線至生產資料庫

建議您不要在生產環境中使用資料庫容器。 本機容器無法進行調整。 您將使用可調整的「適用於 MySQL 的 Azure 資料庫」。

建立適用於 MySQL 的 Azure 資料庫伺服器

使用 az mysql server create 命令建立適用於 MySQL 伺服器的 Azure 資料庫。

在下列命令中,您會看見 <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 CyberTrust Root

若要進行這些變更,請在 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 和其他設定使用自訂影像

根據預設,適用於 MySQL 的 Azure 資料庫會使用 TLS/SSL。 WordPress 需要經過額外的設定才能讓 TLS/SSL 搭配 MySQL 使用。 WordPress 的「官方映像」並未提供額外設定,但有自訂映像可供您使用。 在實務上,您會將所需的變更新增至您自己的映像。

自訂映像以 Docker Hub 中的 WordPress 的「官方映像」為基礎。 「適用於 MySQL 的 Azure 資料庫」的這個自訂映像中已做了下列變更:

已為 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 應用程式。 別忘了以您稍早建立的 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

應用程式重新設定後,Cloud Shell 會顯示類似下列範例的資訊:

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

瀏覽至應用程式

瀏覽至已部署的應用程式 (位於 http://<app-name>.azurewebsites.net)。 應用程式現在會使用適用於 MySQL 的 Azure 資料庫。

Sample multicontainer app on Web App for Containers

新增永續性儲存體

您的多個容器現在會在適用於容器的 Web 應用程式中執行。 不過,如果您此時安裝 WordPress,並於稍後重新啟動應用程式,您會發現 WordPress 安裝已消失。 之所以發生此狀況,是因為您的 Docker Compose 組態目前指向容器內的儲存位置。 安裝到容器中的檔案在應用程式重新啟動後將不會保存。 在此節中,您會將永續性儲存體新增至 WordPress 容器。

設定環境變數

若要使用永續性儲存體,您必須在 App Service 內啟用此設定。 若要進行這項變更,請在 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} 是 App Service 中與您應用程式的永續性儲存體相對應的環境變數。 您將在 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 容器現在會使用適用於 MySQL 的 Azure 資料庫和永續性儲存體。

新增 Redis 容器

WordPress 的「官方映像」未包含 Redis 的相依性。 此自訂映像中已有要搭配使用 Redis 與 WordPress 所需的相依性和額外設定,可供您使用。 在實務上,您會將所需的變更新增至您自己的映像。

自訂映像以 Docker Hub 中的 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,您必須在 App Service 內啟用此設定 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 管理。在左側導覽中選取 [外掛程式],然後選取 [已安裝的外掛程式]

Select WordPress Plugins

在此處顯示所有的外掛程式

在 [外掛程式] 頁面中,尋找 [Redis 物件快取],然後按一下 [啟動]

Activate Redis

按一下 [設定]

Click on Settings

按一下 [啟用物件快取] 按鈕。

Click the 'Enable Object Cache' button

WordPress 會連線至 Redis 伺服器。 連線狀態會顯示在相同頁面上。

WordPress connects to the Redis server. The connection status appears on the same page.

恭喜,您已將 WordPress 連線至 Redis。 已可用於生產環境的應用程式現在會使用適用於 MySQL 的 Azure 資料庫、永續性儲存體和 Redis。 您現在可以將 App Service 方案擴增至多個執行個體。

尋找 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
  • 新增應用程式設定
  • 對您的容器使用永續性儲存體
  • 連線到適用於 MySQL 的 Azure 資料庫
  • 針對錯誤進行疑難排解

前進到下一個教學課程,以了解如何使用自訂網域和憑證保障您的應用程式。

或者,查看其他資源: