Tutorial: Create a multi-container (preview) app in Web App for Containers (Tutorial: Criar uma aplicação com vários contentores (pré-visualização) na Aplicação Web para Contentores)
Nota
Os contêineres de sidecar (visualização) terão êxito aos aplicativos de vários contêineres no Serviço de Aplicativo. Para começar, consulte Tutorial: Configurar um contêiner sidecar para contêiner personalizado no Serviço de Aplicativo do Azure (visualização).
A Aplicação Web para Contentores proporciona uma forma flexível de utilizar imagens do Docker. Neste tutorial, irá aprender a criar uma aplicação com vários contentores utilizando o WordPress e MySQL. Este tutorial deverá ser concluído no Cloud Shell, mas também poderá executar estes comandos localmente com a ferramenta de linha de comandos CLI do Azure (2.0.32 ou posterior).
Neste tutorial, irá aprender a:
- Converter uma configuração do Docker Compose para funcionar com a Aplicação Web para Contentores
- Implementar uma aplicação com vários contentores no Azure
- Adicionar definições da aplicação
- Utilizar o armazenamento persistente para os contentores
- Ligar à Base de Dados do Azure para MySQL
- Resolver erros
Se não tiver uma subscrição do Azure, crie uma conta gratuita do Azure antes de começar.
Pré-requisitos
Para concluir este tutorial, você precisa de experiência com o Docker Compose.
Transferir o exemplo
Para este tutorial, você usa o arquivo de composição do Docker, mas o modificará para incluir o Banco de Dados do Azure para MySQL, armazenamento persistente e Redis. O ficheiro de configuração pode ser encontrado 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 suportadas, consulte Opções de composição do Docker.
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, em seguida, altere-o.
mkdir tutorial
cd tutorial
Em seguida, execute o seguinte comando para clonar o repositório da aplicação de exemplo para o seu diretório de tutorial. Em seguida, mude 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, pode optar por eliminar todo o grupo de recursos num único passo simples mais tarde.
No Cloud Shell, crie um grupo de recursos com o comando az group create
. O exemplo seguinte cria um grupo de recursos com o nome myResourceGroup na localização E.U.A. Centro-Sul. Para ver todas as localizações suportadas para o Serviço de Aplicações no Linux no escalão Standard, execute o comando az appservice list-locations --sku S1 --linux-workers-enabled
.
az group create --name myResourceGroup --location "South Central US"
Geralmente, o grupo de recursos e os recursos são criados numa região perto de si.
Quando o comando for concluído, uma saída JSON mostra as propriedades do grupo de recursos.
Criar um plano do Serviço de Aplicações do Azure
No Cloud Shell, crie um plano do Serviço de Aplicações no grupo de recursos com o comando az appservice plan create
.
O exemplo seguinte cria um Plano do Serviço de Aplicações com o nome myAppServicePlan
, no escalão de preços Standard (--sku S1
) e num contentor do Linux (--is-linux
).
az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku S1 --is-linux
Quando o plano do Serviço de Aplicações tiver sido criado, o Cloud Shell mostra informações semelhantes ao seguinte exemplo:
{ "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 contentores do WordPress e MySQL
Criar uma aplicação Docker Compose
No seu Cloud Shell, crie uma aplicação Web com vários contentores no plano do Serviço de Aplicações myAppServicePlan
com o comando az webapp create. Não se esqueça de substituir <o 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 a aplicação Web tiver sido criada, o Cloud Shell mostra informações semelhantes ao seguinte exemplo:
{ "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 para a aplicação
Navegue para a aplicação implementada em (http://<app-name>.azurewebsites.net
). A aplicação pode demorar alguns minutos a carregar. Se receber uma mensagem de erro, aguarde mais alguns minutos e, em seguida, atualize o browser. Se estiver a ter problemas e os quiser resolver, consulte os registos de contentor.
Parabéns, criou uma aplicação com vários contentores na Aplicação Web para Contentores. Em seguida, irá configurar a sua aplicação para utilizar a Base de Dados do Azure para MySQL. Não instale o WordPress neste momento.
Ligar à base de dados de produção
Não é recomendado utilizar os contentores da base de dados num ambiente de produção. Os contentores locais não são dimensionáveis. Em alternativa, irá utilizar a Base de Dados do Azure para MySQL que pode ser dimensionada.
Criar uma Base de Dados do Azure para o servidor MySQL
Criar uma Base de Dados do Azure para servidor MySQL com o comando az mysql server create
.
No comando a seguir, substitua o nome do servidor MySQL onde você vê o espaço reservado <mysql-server-name> (caracteres válidos são a-z
, 0-9
e -
). Este nome faz parte do nome de anfitrião do servidor MySQL (<mysql-server-name>.database.windows.net
); tem de 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
Criar o servidor pode demorar alguns minutos a concluir. Quando o servidor MySQL tiver sido criado, o Cloud Shell mostra informações semelhantes às do exemplo abaixo:
{ "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 a firewall do servidor
Crie uma regra de firewall para o servidor MySQL permitir ligações ao cliente com o comando az mysql server firewall-rule create
. Quando os IPs inicial e final estão definidos como 0.0.0.0, a firewall apenas é aberta 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
Gorjeta
Pode ser ainda mais restritivo na sua regra de firewall ao utilizar apenas os endereços IP de saída que a aplicação utiliza.
Criar a base de dados do WordPress
az mysql db create --resource-group myResourceGroup --server-name <mysql-server-name> --name wordpress
Quando a base de dados tiver sido criada, o Cloud Shell mostra informações semelhantes às do exemplo abaixo:
{ "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 base de dados no WordPress
Para ligar a aplicação WordPress a este novo servidor MySQL, irá configurar algumas variáveis de ambiente específico do WordPress, incluindo o caminho de AC de SSL definido por MYSQL_SSL_CA
. O Baltimore CyberTrust Root da DigiCert é fornecida na imagem personalizada abaixo.
Para fazer estas alterações, utilize o comando az webapp config appsettings set no Cloud Shell. As definições da aplicação são sensíveis a maiúsculas e 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"
Quando a definição de aplicação tiver sido criada, o Cloud Shell mostra informações semelhantes ao seguinte exemplo:
[ { "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, consulte Configurar variáveis de ambiente.
Use uma imagem personalizada para MySQL TLS/SSL e outras configurações
Por padrão, TLS/SSL é usado pelo Banco de Dados do Azure para MySQL. 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, estaria a adicionar as alterações pretendidas à sua própria imagem.
A imagem personalizada baseia-se na "imagem oficial" do WordPress do Hub do Docker. Foram feitas as seguintes alterações nesta imagem personalizada para a Base de Dados do Azure para MySQL:
- Adiciona o ficheiro de certificado Baltimore Cyber Trust Root para SSL ao MySQL.
- Utiliza a Definição da Aplicação para o Certificado SSL do MySQL da Autoridade de certificação no wp-config.php do WordPress.
- Adiciona a definição do WordPress para MYSQL_CLIENT_FLAGS necessária para o SSL do MySQL.
Foram feitas as seguintes alterações para o Redis (a ser utilizado numa secção posterior):
- Adiciona a extensão PHP para o Redis v4.0.2.
- Adiciona o comando unzip necessário para a extração de ficheiros.
- Adiciona o plug-in Redis Object Cache 1.3.8 do WordPress.
- Utiliza a Definição da Aplicação para o nome do anfitrião do Redis no wp-config.php do WordPress.
Para utilizar a imagem personalizada, deverá atualizar o ficheiro docker-compose-wordpress.yml. No Cloud Shell, abra um editor de texto e altere o image: wordpress
para usar image: mcr.microsoft.com/azuredocs/multicontainerwordpress
. Já não precisa do contentor de base de dados. Remova as secções db
, environment
, depends_on
e volumes
do ficheiro de configuração. O seu ficheiro deverá ser semelhante ao seguinte código:
version: '3.3'
services:
wordpress:
image: mcr.microsoft.com/azuredocs/multicontainerwordpress
ports:
- "8000:80"
restart: always
Atualizar a aplicação com uma nova configuração
No Cloud Shell, reconfigure a aplicação Web de vários contentores com o comando az webapp config container set. Não se esqueça de substituir <o 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 a aplicação tiver sido reconfigurada, o Cloud Shell mostra informações semelhantes ao seguinte exemplo:
[ { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICB3b3JkcHJlc3M6CiAgICAgaW1hZ2U6IG1zYW5nYXB1L3dvcmRwcmVzcwogICAgIHBvcnRzOgogICAgICAgLSAiODAwMDo4MCIKICAgICByZXN0YXJ0OiBhbHdheXM=" } ]
Navegar para a aplicação
Navegue para a aplicação implementada em (http://<app-name>.azurewebsites.net
). A aplicação está agora a utilizar a Base de Dados do Azure para MySQL.
Adicionar armazenamento persistente
Os seus vários contentores estão agora em execução na Aplicação Web para Contentores. No entanto, se instalar o WordPress agora e reiniciar a aplicação mais tarde, irá ver que a sua instalação do WordPress foi removida. Isto acontece porque a configuração do Docker Compose está atualmente a apontar para uma localização de armazenamento no interior do contentor. Os ficheiros instalados no seu contentor não persistem para além do reinício da aplicação. Nesta seção, você adicionará armazenamento persistente ao seu contêiner WordPress.
Configurar variáveis de ambiente
Para usar o armazenamento persistente, você habilitará essa configuração no Serviço de Aplicativo. Para fazer esta alteração, utilize o comando az webapp config appsettings set no Cloud Shell. As definições da aplicação são sensíveis a maiúsculas e 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
Quando a definição de aplicação tiver sido criada, o Cloud Shell mostra informações semelhantes ao seguinte exemplo:
[ < JSON data removed for brevity. > { "name": "WORDPRESS_DB_NAME", "slotSetting": false, "value": "wordpress" }, { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "TRUE" } ]
Modificar o ficheiro 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 ficheiros para um diretório dentro do contentor. ${WEBAPP_STORAGE_HOME}
é uma variável de ambiente no Serviço de Aplicações, que está mapeado para um armazenamento persistente para a sua aplicação. Irá utilizar esta variável de ambiente na opção volumes para que os ficheiros do WordPress sejam instalados no armazenamento persistente em vez de no contentor. Efetue as seguintes alterações ao ficheiro:
Na secção wordpress
, adicione uma opção de volumes
para que se pareça com o seguinte código:
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 a aplicação com uma nova configuração
No Cloud Shell, reconfigure a aplicação Web de vários contentores com o comando az webapp config container set. Não se esqueça de substituir <o 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, mostra um resultado semelhante ao seguinte exemplo:
[ { "name": "WEBSITES_ENABLE_APP_SERVICE_STORAGE", "slotSetting": false, "value": "TRUE" }, { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo=" } ]
Navegar para a aplicação
Navegue para a aplicação implementada em (http://<app-name>.azurewebsites.net
).
O contentor do WordPress está agora a utilizar a Base de Dados do Azure para MySQL e o armazenamento persistente.
Adicionar o contentor do Redis
A "imagem oficial" do WordPress não inclui as dependências para Redis. Estas dependências e a configuração adicional necessária para utilizar o Redis com o WordPress foram preparadas para si nesta imagem personalizada. Na prática, estaria a adicionar as alterações pretendidas à sua própria imagem.
A imagem personalizada baseia-se na "imagem oficial" do WordPress do Hub do Docker. Foram feitas as seguintes alterações nesta imagem personalizada para Redis:
- Adiciona a extensão PHP para o Redis v4.0.2.
- Adiciona o comando unzip necessário para a extração de ficheiros.
- Adiciona o plug-in Redis Object Cache 1.3.8 do WordPress.
- Utiliza a Definição da Aplicação para o nome do anfitrião do Redis no wp-config.php do WordPress.
Adicione o contentor do Redis ao final do ficheiro de configuração para que tenha um aspeto semelhante ao do exemplo abaixo:
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 utilizar o Redis, terá de ativar a definição WP_REDIS_HOST
no Serviço de Aplicações. Esta é uma definição necessária para o WordPress comunicar com o anfitrião do Redis. Para fazer esta alteração, utilize o comando az webapp config appsettings set no Cloud Shell. As definições da aplicação são sensíveis a maiúsculas e 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"
Quando a definição de aplicação tiver sido criada, o Cloud Shell mostra informações semelhantes ao seguinte exemplo:
[ < JSON data removed for brevity. > { "name": "WORDPRESS_DB_USER", "slotSetting": false, "value": "adminuser" }, { "name": "WP_REDIS_HOST", "slotSetting": false, "value": "redis" } ]
Atualizar a aplicação com uma nova configuração
No Cloud Shell, reconfigure a aplicação Web de vários contentores com o comando az webapp config container set. Não se esqueça de substituir <o 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, mostra um resultado semelhante ao seguinte exemplo:
[ { "name": "DOCKER_CUSTOM_IMAGE_NAME", "value": "COMPOSE|dmVyc2lvbjogJzMuMycKCnNlcnZpY2VzOgogICBteXNxbDoKICAgICBpbWFnZTogbXlzcWw6NS43CiAgICAgdm9sdW1lczoKICAgICAgIC0gZGJfZGF0YTovdmFyL2xpYi9teXNxbAogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgTVlTUUxfUk9PVF9QQVNTV09SRDogZXhhbXBsZXBhc3MKCiAgIHdvcmRwcmVzczoKICAgICBkZXBlbmRzX29uOgogICAgICAgLSBteXNxbAogICAgIGltYWdlOiB3b3JkcHJlc3M6bGF0ZXN0CiAgICAgcG9ydHM6CiAgICAgICAtICI4MDAwOjgwIgogICAgIHJlc3RhcnQ6IGFsd2F5cwogICAgIGVudmlyb25tZW50OgogICAgICAgV09SRFBSRVNTX0RCX1BBU1NXT1JEOiBleGFtcGxlcGFzcwp2b2x1bWVzOgogICAgZGJfZGF0YTo=" } ]
Navegar para a aplicação
Navegue para a aplicação implementada em (http://<app-name>.azurewebsites.net
).
Conclua os passos e instale o WordPress.
Ligar o WordPress ao Redis
Inicie sessão no administrador do WordPress. No painel de navegação esquerdo, selecione Plug-ins e, em seguida, selecione Plug-ins instalados.
Mostrar todos os plug-ins aqui
Na página de plug-ins, localize Redis Object Cache e clique em Activate (Ativar).
Clique em Definições.
Clique no botão Enable Object Cache (Ativar a Cache de Objeto).
O WordPress é ligado ao servidor do Redis. O estado da ligação aparece na mesma página.
Parabéns, ligou o WordPress ao Redis. A aplicação pronta para produção está agora a utilizar a Base de Dados do Azure para MySQL, o armazenamento persistente e o Redis. Pode agora aumentar horizontalmente o seu plano do Serviço de Aplicações para múltiplas instâncias.
Localizar registos de Contentor do Docker
Caso se depare com problemas ao utilizar vários contentores, pode aceder aos registos de contentor ao navegar até: https://<app-name>.scm.azurewebsites.net/api/logs/docker
.
Irá ver um resultado semelhante ao do exemplo abaixo:
[ { "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" } ]
Pode ver um registo para cada contentor e um registo adicional para o processo principal. Copie o respetivo valor href
para o browser para ver o registo.
Limpar a implementação
Depois de executar o script de exemplo, pode ser utilizado o seguinte comando para remover o grupo de recursos e todos os recursos associados ao mesmo.
az group delete --name myResourceGroup
Próximos passos
Neste tutorial, ficou a saber como:
- Converter uma configuração do Docker Compose para funcionar com a Aplicação Web para Contentores
- Implementar uma aplicação com vários contentores no Azure
- Adicionar definições da aplicação
- Utilizar o armazenamento persistente para os contentores
- Ligar à Base de Dados do Azure para MySQL
- Resolver erros
Avance para o próximo tutorial para saber como proteger seu aplicativo com um domínio e certificado personalizados.
Ou confira outros recursos: