Руководство. Создание многоконтейнерного приложения (предварительная версия) в Веб-приложении для контейнеров
Примечание.
Контейнеры на стороне (предварительная версия) будут успешными приложениями с несколькими контейнерами в Служба приложений. Сведения о начале работы см. в руководстве по настройке контейнера на стороне для пользовательского контейнера в службе приложение 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:
- добавлен файл сертификата Baltimore CyberTrust Root для SSL-соединения с MySQL;
- задан параметр приложения для SSL-сертификата MySQL, предоставленного центром сертификации, в файле wp-config.php WordPress;
- добавлено определение WordPress для MYSQL_CLIENT_FLAGS, необходимое для SSL-соединения с MySQL.
Для Redis (используется в следующем разделе) внесены следующие изменения:
- добавлено расширение PHP для Redis версии 4.0.2;
- добавлена команда распаковки, необходимая для извлечения файла;
- добавлен подключаемый модуль Redis Object Cache 1.3.8 для WordPress.
- задан параметр приложения для имени узла Redis в файле wp-config.php WordPress.
Чтобы применить пользовательский образ, нужно обновить файл 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 внесены следующие изменения:
- добавлено расширение PHP для Redis версии 4.0.2;
- добавлена команда распаковки, необходимая для извлечения файла;
- добавлен подключаемый модуль Redis Object Cache 1.3.8 для WordPress.
- задан параметр приложения для имени узла Redis в файле wp-config.php WordPress.
Добавьте контейнер 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. В области навигации слева выберите подключаемые модули и выберите "Установленные подключаемые модули".
Отображение всех подключаемых модулей
На странице подключаемых модулей найдите Redis Object Cache (Кэш объектов Redis) и щелкните Activate (Активировать).
Щелкните Параметры.
Нажмите кнопку Enable Object Cache (Включить Object Cache).
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
- Устранение неполадок
Перейдите к следующему руководству, чтобы узнать, как защитить приложение с помощью личного домена и сертификата.
Также ознакомьтесь с другими ресурсами: