Tutorial: Criar um aplicativo multicontêiner (versão prévia) no Aplicativo Web para Contêineres
Observação
Os contêineres Sidecar (versão prévia) sucederão os aplicativos com vários contêineres no Serviço de Aplicativo. Para começar, confira Tutorial: configurar um contêiner sidecar para contêiner personalizado no Serviço de Aplicativo do Azure (versão prévia).
O Aplicativo Web para Contêineres fornece uma maneira flexível de usar imagens do Docker. Neste tutorial, você aprenderá como criar um aplicativo multicontêiner usando WordPress e MySQL. Você conclui este tutorial no Cloud Shell, mas também pode executar esses comandos localmente com a ferramenta de linha de comando da CLI do Azure (2.0.32 ou posterior).
Neste tutorial, você aprenderá como:
- Converter uma configuração do Docker Compose para trabalhar com Aplicativo Web para Contêineres
- Implantar um aplicativo multicontêiner no Azure
- Adicionar configurações de aplicativo
- Usar armazenamento persistente para contêineres
- Conectar-se ao Banco de Dados do Azure para MySQL
- Solucionar problemas de erros
Caso você não tenha uma assinatura do Azure, crie uma conta gratuita do Azure antes de começar.
Pré-requisitos
Para concluir este tutorial, você precisa ter experiência com o Docker Compose.
Baixar o exemplo
Para este tutorial, você usará o arquivo de composição do Docker, mas o modificará para incluir o Banco de Dados do Azure para MySQL, o armazenamento persistente e o Redis. O arquivo de configuração podem ser localizados em Exemplos do Azure. No exemplo abaixo, observe que depends_on
é uma opção sem suporte e é ignorada. Para obter as opções de configuração compatíveis, confira Opções do 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:
No Cloud Shell, crie um diretório de tutorial e depois altere para ele.
mkdir tutorial
cd tutorial
Em seguida, execute o comando a seguir para clonar o repositório de aplicativos de exemplo ao seu diretório de tutorial. Em seguida, altere para o diretório multicontainerwordpress
.
git clone https://github.com/Azure-Samples/multicontainerwordpress
cd multicontainerwordpress
Criar um grupo de recursos
Um grupo de recursos é um contêiner lógico no qual os recursos do Azure, como aplicativos Web, bancos de dados e contas de armazenamento, são implantados e gerenciados. Por exemplo, é possível excluir posteriormente todo o grupo de recursos com uma única etapa simples.
No Cloud Shell, crie um grupo de recursos com o comando az group create
. O exemplo a seguir cria um grupo de recursos nomeado myResourceGroup no localização Centro-Sul dos EUA. Para ver todas as localizações com suporte no Serviço de Aplicativo no Linux na camada Standard, execute o comando az appservice list-locations --sku S1 --linux-workers-enabled
.
az group create --name myResourceGroup --location "South Central US"
Em geral, você cria seu grupo de recursos e os recursos em uma região próxima a você.
Quando o comando for concluído, uma saída JSON mostra as propriedades do grupo de recursos.
Criar um Plano do Serviço de Aplicativo do Azure
No Cloud Shell, crie um plano do Serviço de Aplicativo no grupo de recursos com o comando az appservice plan create
.
O exemplo a seguir cria um plano do Serviço de Aplicativo denominado myAppServicePlan
no tipo de preço Standard (--sku S1
) e em um contêiner do Linux (--is-linux
).
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku S1 --is-linux
Quando o Plano do Serviço de Aplicativo tiver sido criado, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
{ "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 com contêineres do WordPress e MySQL
Criar um aplicativo Docker Compose
Em seu Cloud Shell, crie um aplicativo Web multicontêiner no plano do Serviço de Aplicativo do myAppServicePlan
com o comando az webapp create. Não se esqueça de substituir <nome-do-aplicativo> por um nome de aplicativo exclusivo.
az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml
Quando o aplicativo Web tiver sido criado, o Cloud Shell mostrará um resultado semelhante ao exemplo a seguir:
{ "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. > }
Navegar até o aplicativo
Navegue até o aplicativo implantado em (http://<app-name>.azurewebsites.net
). O aplicativo pode demorar alguns minutos para carregar. Se um erro for exibido, aguarde mais alguns minutos e atualize o navegador. Caso tenha problemas e queira solucioná-los, analise os logs do contêiner.
Parabéns, você criou um aplicativo multicontêiner no Aplicativo Web para Contêineres. Em seguida, você configurará o aplicativo para usar o Banco de Dados do Azure para MySQL. Não instale o WordPress neste momento.
Conectar o banco de dados de produção
Não é recomendável usar contêineres de banco de dados em um ambiente de produção. Os contêineres locais não são escalonáveis. Em vez disso, será utilizado o Banco de Dados do Azure para MySQL, que pode ser dimensionado.
Criar um Banco de Dados do Azure para o servidor MySQL
Crie um Banco de Dados do Azure para MySQL com o comando az mysql server create
.
No comando a seguir, substitua o nome do servidor MySQL no qual o espaço reservado <nome-do-servidor-mysql> é exibido (os caracteres válidos são a-z
, 0-9
e -
). Esse nome faz parte do nome do host do servidor MySQL (<mysql-server-name>.database.windows.net
) e precisa ser globalmente exclusivo.
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
A conclusão da criação do servidor pode demorar alguns minutos. Quando o servidor MySQL for criado, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
{ "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", ... }
Configurar o firewall do servidor
Crie uma regra de firewall para o servidor MySQL para permitir conexões de cliente usando o comando az mysql server firewall-rule create
. Quando o IP inicial e o IP final estiverem definidos como 0.0.0.0, o firewall estará aberto somente para outros recursos do 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
Dica
Você pode ser ainda mais restritivo na regra de firewall ao usar somente os endereços de IP de saída que seu aplicativo usa.
Criar o banco de dados do WordPress
az mysql db create --resource-group myResourceGroup --server-name <mysql-server-name> --name wordpress
Quando o banco de dados for criado, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
{ "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" }
Configurar variáveis de banco de dados no WordPress
Para conectar o aplicativo WordPress a esse novo servidor MySQL, você configurará algumas variáveis de ambiente específicas do WordPress, incluindo o caminho de AC do SSL definido por MYSQL_SSL_CA
. O Baltimore CyberTrust Root da DigiCert é fornecido na imagem personalizada abaixo.
Para fazer essas alterações, use o comando az webapp config appsettings set no Cloud Shell. As configurações do aplicativo diferenciam maiúsculas de minúsculas e são separadas por espaços.
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"
Após a criação da configuração do aplicativo, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
[ { "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" } ]
Para obter mais informações sobre variáveis de ambiente, confira Configurar variáveis de ambiente.
Usar uma imagem personalizada para MySQL TLS/SSL e outras configurações
Por padrão, o TLS/SSL é usado pelo Banco de Dados do Azure para MySQL. O WordPress requer configuração adicional para usar TLS/SSL com MySQL. A 'imagem oficial' do WordPress não fornece a configuração adicional, mas uma imagem personalizada foi preparada para sua conveniência. Na prática, você adicionaria as alterações desejadas à sua própria imagem.
A imagem personalizada é baseada na 'imagem oficial' do WordPress do Hub do Docker. As alterações a seguir foram feitas nessa imagem personalizada do Banco de Dados do Azure para MySQL:
- Adicionar arquivo do certificado de Baltimore CyberTrust Root do SSL para MySQL.
- Usar Configuração do Aplicativo para certificado de Autoridade de Certificação do SSL do MySQL no wp-config.php do WordPress.
- Adicionar WordPress define para MYSQL_CLIENT_FLAGS necessário para MySQL SSL.
As alterações a seguir foram feitas para Redis (a ser usado em uma seção posterior):
- Adicionar extensão PHP para Redis v4.0.2.
- Adicionar descompactador necessário para extração de arquivo.
- Adicionar plug-in do WordPress do Cache de Objetos do Redis 1.3.8.
- Usar Configuração do Aplicativo para nome do host do Redis no wp-config.php do WordPress.
Para usar a imagem personalizada, você atualizará o arquivo docker-compose-wordpress.yml. Em Cloud Shell, abra um editor de texto e altere o image: wordpress
para usar image: mcr.microsoft.com/azuredocs/multicontainerwordpress
. Não será mais necessário o contêiner do banco de dados. Remova as seções db
, environment
, depends_on
e volumes
do arquivo de configuração. O arquivo deverá ser semelhante ao código a seguir:
version: '3.3'
services:
wordpress:
image: mcr.microsoft.com/azuredocs/multicontainerwordpress
ports:
- "8000:80"
restart: always
Atualizar aplicativo com nova configuração
No Cloud Shell, reconfigure o aplicativo Web multicontêiner com o comando az webapp config container set. Não se esqueça de substituir <nome-do-aplicativo> pelo nome do aplicativo Web criado anteriormente.
az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml
Quando o aplicativo for reconfigurado, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
[ { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICB3b3JkcHJlc3M6CiAgICAgaW1hZ2U6IG1zYW5nYXB1L3dvcmRwcmVzcwogICAgIHBvcnRzOgogICAgICAgLSAiODAwMDo4MCIKICAgICByZXN0YXJ0OiBhbHdheXM=" } ]
Navegar até o aplicativo
Navegue até o aplicativo implantado em (http://<app-name>.azurewebsites.net
). O aplicativo agora está usando o Banco de Dados do Azure para MySQL.
Adicionar armazenamento persistente
O multicontêiner agora está em execução no Aplicativo Web para Contêineres. No entanto, se você instalar o WordPress agora e reiniciar o aplicativo mais tarde, descobrirá que a instalação do WordPress não existe mais. Isso acontece porque a configuração do Docker Compose atualmente aponta para um local de armazenamento dentro do contêiner. Os arquivos instalados no contêiner não persistem além do reinício do aplicativo. Nesta seção, você adicionará um armazenamento persistente ao contêiner do WordPress.
Configurar variáveis de ambiente
Para usar o armazenamento persistente, você habilitará essa configuração no Serviço de Aplicativo. Para fazer essa alteração, use o comando az webapp config appsettings set no Cloud Shell. As configurações do aplicativo diferenciam maiúsculas de minúsculas e são separadas por espaços.
az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WEBSITES_ENABLE_APP_SERVICE_STORAGE=TRUE
Após a criação da configuração do aplicativo, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
[ < JSON data removed for brevity. > { "name": "WORDPRESS_DB_NAME", "slotSetting": false, "value": "wordpress" }, { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "TRUE" } ]
Modifique o arquivo de configuração
No Cloud Shell, abra o arquivo docker-compose-wordpress.yml
em um editor de texto.
A opção volumes
mapeia o sistema de arquivos para um diretório dentro do contêiner. ${WEBAPP_STORAGE_HOME}
é uma variável de ambiente no Serviço de Aplicativo mapeada para armazenamento persistente para o aplicativo. Você usará essa variável de ambiente na opção de volumes para que os arquivos do WordPress sejam instalados no armazenamento persistente em vez do contêiner. Faça as modificações a seguir no arquivo:
Na seção wordpress
, adicione uma opção volumes
para que seja semelhante ao código a seguir:
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
Atualizar aplicativo com nova configuração
No Cloud Shell, reconfigure o aplicativo Web multicontêiner com o comando az webapp config container set. Não se esqueça de substituir <nome-do-aplicativo> por um nome de aplicativo exclusivo.
az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file docker-compose-wordpress.yml
Após a execução do comando, ele mostrará uma saída semelhante ao exemplo a seguir:
[ { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "TRUE" }, { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo=" } ]
Navegar até o aplicativo
Navegue até o aplicativo implantado em (http://<app-name>.azurewebsites.net
).
O contêiner do WordPress agora está usando Banco de Dados do Azure para MySQL e armazenamento persistente.
Adicionar contêiner do Redis
A 'imagem oficial' do WordPress não inclui as dependências para Redis. Essas dependências e configurações adicionais necessárias para usar Redis com WordPress foram preparadas para você nesta imagem personalizada. Na prática, você adicionaria as alterações desejadas à sua própria imagem.
A imagem personalizada é baseada na 'imagem oficial' do WordPress do Hub do Docker. As alterações a seguir foram feitas nesta imagem personalizada para Redis:
- Adicionar extensão PHP para Redis v4.0.2.
- Adicionar descompactador necessário para extração de arquivo.
- Adicionar plug-in do WordPress do Cache de Objetos do Redis 1.3.8.
- Usar Configuração do Aplicativo para nome do host do Redis no wp-config.php do WordPress.
Adicione o contêiner do Redis na parte inferior do arquivo de configuração para que seja semelhante ao exemplo a seguir:
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
Configurar variáveis de ambiente
Para usar o Redis, você habilitará essa configuração WP_REDIS_HOST
no Serviço de Aplicativo. Esta é uma configuração necessária para WordPress comunicar-se com host do Redis. Para fazer essa alteração, use o comando az webapp config appsettings set no Cloud Shell. As configurações do aplicativo diferenciam maiúsculas de minúsculas e são separadas por espaços.
az webapp config appsettings set --resource-group myResourceGroup --name <app-name> --settings WP_REDIS_HOST="redis"
Após a criação da configuração do aplicativo, o Cloud Shell mostrará informações semelhantes ao exemplo a seguir:
[ < JSON data removed for brevity. > { "name": "WORDPRESS_DB_USER", "slotSetting": false, "value": "adminuser" }, { "name": "WP_REDIS_HOST", "slotSetting": false, "value": "redis" } ]
Atualizar aplicativo com nova configuração
No Cloud Shell, reconfigure o aplicativo Web multicontêiner com o comando az webapp config container set. Não se esqueça de substituir <nome-do-aplicativo> por um nome de aplicativo exclusivo.
az webapp config container set --resource-group myResourceGroup --name <app-name> --multicontainer-config-type compose --multicontainer-config-file compose-wordpress.yml
Após a execução do comando, ele mostrará uma saída semelhante ao exemplo a seguir:
[ { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo=" } ]
Navegar até o aplicativo
Navegue até o aplicativo implantado em (http://<app-name>.azurewebsites.net
).
Conclua as etapas e instale o WordPress.
Conecte o WordPress ao Redis
Entre no administrador do WordPress. Na navegação esquerda, selecione Plug-ins, e, em seguida, selecione Plug-ins Instalados.
Mostrar todos os plug-ins aqui
Na página de plug-ins, localize Cache de Objetos do Redis e clique em Ativar.
Clique em Configurações.
Clique no botão Habilitar Cache de Objetos.
O WordPress conecta-se ao servidor de Redis. A conexão status aparece na mesma página.
Parabéns, você conectou o WordPress ao Redis. O aplicativo pronto para produção agora está usando Banco de Dados do Azure para MySQL, armazenamento persistente e Redis. Agora é possível escalar horizontalmente o Plano do Serviço de Aplicativo para várias instâncias.
Localizar logs do contêiner do Docker
Se você tiver problemas ao usar vários contêineres, poderá acessar os logs do contêiner navegando até: https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
Você verá uma saída semelhante ao exemplo a seguir:
[ { "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" } ]
Você verá um log para cada contêiner e um log adicional para o processo pai. Copie o respectivo valor href
no navegador para exibir o log.
Limpar a implantação
Depois que o script de exemplo foi executado, o comando a seguir pode ser usado para remover o grupo de recursos e todos os recursos associados a ele.
az group delete --name myResourceGroup
Próximas etapas
Neste tutorial, você aprendeu a:
- Converter uma configuração do Docker Compose para trabalhar com Aplicativo Web para Contêineres
- Implantar um aplicativo multicontêiner no Azure
- Adicionar configurações de aplicativo
- Usar armazenamento persistente para contêineres
- Conectar-se ao Banco de Dados do Azure para MySQL
- Solucionar problemas de erros
Avance para o próximo tutorial para saber como proteger seu aplicativo com um domínio e um certificado personalizados.
Se preferir, confira outros recursos: