Руководство. Создание многоконтейнерного приложения (предварительная версия) в Веб-приложении для контейнеров

Примечание.

Контейнеры на стороне (предварительная версия) будут успешными приложениями с несколькими контейнерами в Служба приложений. Сведения о начале работы см. в руководстве по настройке контейнера на стороне для пользовательского контейнера в службе приложение Azure (предварительная версия).

Платформа Веб-приложение для контейнеров предоставляет гибкие возможности для использования образов Docker. В этом руководстве объясняется, как создать многоконтейнерное приложение с помощью WordPress и MySQL. Примеры из этого руководства вы будете выполнять в Cloud Shell, но эти команды также можно выполнить на локальном компьютере с помощью программы командной строки Azure CLI (версии 2.0.32 или более поздней).

В этом руководстве описано следующее:

  • преобразование конфигурации Docker Compose для работы на платформе "Веб-приложение для контейнеров";
  • развертывание многоконтейнерного приложения в Azure;
  • Добавление параметров приложения
  • использование постоянного хранилища для контейнеров;
  • Подключение к базе данных Azure для MySQL
  • Устранение неполадок

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу.

Необходимые компоненты

Для изучения этого учебника требуется опыт работы с Docker Compose.

Скачивание примера приложения

При работе с этим руководством вы будете использовать файл из Docker Compose, но измените его, добавив сведения о Базе данных Azure для MySQL, постоянном хранилище и Redis. Файл конфигурации можно найти в репозитории примеров для Azure. В приведенном ниже примере обратите внимание, что depends_on это неподдерживаемый параметр и игнорируется. Поддерживаемые параметры конфигурации см. в разделе Docker Compose options (Параметры 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 (например, веб-приложений, баз данных и учетных записей хранения) и управление ими. Например, в дальнейшем можно удалить всю группу ресурсов при помощи одного простого действия.

В 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.

В следующем примере создается план службы приложений с именем myAppServicePlan в ценовой категории Стандартный (--sku S1) в контейнере Linux (--is-linux).

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
}

Docker Compose с контейнерами WordPress и MySQL

Создание приложения Docker Compose

В Cloud Shell создайте многоконтейнерное веб-приложение в рамках плана службы приложений myAppServicePlan с помощью команды az webapp create. Не забудьте указать уникальное имя приложения вместо <app-name>.

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

Когда веб-приложение будет создано, в 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. Для загрузки приложения может потребоваться несколько минут. Если произойдет ошибка, подождите несколько минут, а затем обновите страницу в браузере. Если возникнет проблема, которую нужно будет устранить, просмотрите журналы контейнера.

Пример многоконтейнерного приложения на платформе

Поздравляем! Вы создали многоконтейнерное приложение на платформе "Веб-приложение для контейнеров". Далее вам предстоит настроить приложение для использования базы данных Azure для MySQL. Не устанавливайте WordPress в этом этапе.

Подключение к рабочей базе данных

Не рекомендуется использовать контейнеры базы данных в рабочей среде. Локальные контейнеры не являются масштабируемыми. Вместо этого вы будете использовать базу данных Azure для MySQL, которую можно масштабировать.

Создайте сервер базы данных Azure для MySQL.

Создайте сервер базы данных Azure для MySQL с помощью команды az mysql server create.

В следующей команде замените <mysql-server-name> именем своего сервера MySQL везде, где встречается этот заполнитель. Допустимые символы: a-z, 0-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",
  ...
}

Настройка брандмауэра сервера

Создайте правило брандмауэра для сервера MySQL, чтобы разрешить подключения клиентов, выполнив команду az mysql server firewall-rule create. Если для начального и конечного 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, включая путь к выданному центром сертификации SSL-сертификату, который определяется с помощью MYSQL_SSL_CA. Сведения о сертификате Baltimore CyberTrust Root от DigiCert см. в разделе о пользовательском образе ниже.

Чтобы внести эти изменения, выполните команду az webapp config appsettings set в Cloud Shell. Параметры приложения чувствительны к регистру и используются с разделителями-пробелами.

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"
  }
]

Подробные сведения о переменных среды см. в разделе Configure environment variables (Настройка переменных среды).

Использование пользовательского образа для TLS/SSL-соединения с MySQL и других конфигураций

По умолчанию TLS/SSL-соединение используется в базе данных Azure для MySQL. Но чтобы использовать такие соединения в WordPress, нужно задать дополнительную конфигурацию. "Официальный образ" WordPress не содержит таких настроек, но для удобства мы подготовили пользовательский образ. На практике требуемые изменения нужно добавлять в свой образ.

Пользовательский образ создан на основе официального образа WordPress из Docker Hub. В этот пользовательский образ внесены следующие изменения для базы данных Azure для MySQL:

Для Redis (используется в следующем разделе) внесены следующие изменения:

Чтобы применить пользовательский образ, нужно обновить файл docker-compose-wordpress.yml. В Cloud Shell откройте текстовый редактор и измените image: wordpress его.image: mcr.microsoft.com/azuredocs/multicontainerwordpress Вам больше не понадобится контейнер базы данных. Удалите разделы db, environment, depends_on и volumes из файла конфигурации. Ваш файл должен выглядеть примерно как приведенный ниже фрагмент кода.

version: '3.3'

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

Обновление приложения с указанием новой конфигурации

В Cloud Shell измените конфигурацию многоконтейнерного веб-приложения с помощью команды az webapp config container set. Не забудьте заменить <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. Теперь в приложении используется база данных Azure для MySQL.

Пример многоконтейнерного приложения на платформе

Добавление постоянного хранилища

Ваше многоконтейнерное приложение теперь работает на платформе "Веб-приложение для контейнеров". Но если установить WordPress сейчас и после этого перезапустить приложение, вы обнаружите, что данные установки WordPress удалены. Это происходит потому, что сейчас в конфигурации Docker Compose указано расположение для хранения в контейнере. Файлы, установленные в контейнере, исчезают после перезапуска приложения. Из этого раздела вы узнаете, как добавить постоянное хранилище в контейнер WordPress.

Настройка переменных среды

Чтобы использовать постоянное хранилище, вам нужно включить этот параметр в Службе приложений. Чтобы внести это изменение, выполните команду az webapp config appsettings set в Cloud Shell. Параметры приложения чувствительны к регистру и используются с разделителями-пробелами.

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. Не забудьте указать уникальное имя приложения вместо <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 для MySQL и постоянное хранилище.

Добавление контейнера Redis

Официальный образ WordPress не содержит зависимостей для Redis. Эти зависимости и дополнительные конфигурации, необходимые для использования Redis с WordPress, подготовлены для вас в этом пользовательском образе. На практике требуемые изменения нужно добавлять в свой образ.

Пользовательский образ создан на основе официального образа WordPress из Docker Hub. В пользовательский образ для 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. Чтобы внести это изменение, выполните команду az webapp config appsettings set в Cloud Shell. Параметры приложения чувствительны к регистру и используются с разделителями-пробелами.

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. Не забудьте указать уникальное имя приложения вместо <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 Object Cache (Кэш объектов Redis) и щелкните Activate (Активировать).

Активация Redis

Щелкните Параметры.

Щелкните Параметры

Нажмите кнопку Enable Object Cache (Включить Object Cache).

Нажатие кнопки

WordPress подключится к серверу Redis. Состояние подключения отобразится на той же странице.

WordPress подключается к серверу Redis. Состояние подключения отображается на той же странице.

Поздравляем! Вы подключили WordPress к Redis. Сейчас в готовом для рабочей среды приложении используется база данных Azure для 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 для работы на платформе "Веб-приложение для контейнеров";
  • развертывание многоконтейнерного приложения в Azure;
  • Добавление параметров приложения
  • использование постоянного хранилища для контейнеров;
  • Подключение к базе данных Azure для MySQL
  • Устранение неполадок

Перейдите к следующему руководству, чтобы узнать, как защитить приложение с помощью личного домена и сертификата.

Также ознакомьтесь с другими ресурсами: