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.

Aplicação com vários contentores de exemplo na Aplicação Web para Contentores

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-9e -). 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:

Foram feitas as seguintes alterações para o Redis (a ser utilizado numa secção posterior):

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.

Aplicação com vários contentores de exemplo na Aplicação Web para Contentores

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:

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.

Selecionar os Plug-ins do WordPress

Mostrar todos os plug-ins aqui

Na página de plug-ins, localize Redis Object Cache e clique em Activate (Ativar).

Ativar o Redis

Clique em Definições.

Clicar em Definições

Clique no botão Enable Object Cache (Ativar a Cache de Objeto).

Clicar no botão

O WordPress é ligado ao servidor do Redis. O estado da ligação aparece na mesma página.

WordPress se conecta ao servidor Redis. O status da conexã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: