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.

Aplicativo multicontêiner de exemplo no Aplicativo Web para Contêineres

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:

As alterações a seguir foram feitas para Redis (a ser usado em uma seção posterior):

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.

Aplicativo multicontêiner de exemplo no Aplicativo Web para Contêineres

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:

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.

Selecione Plug-ins do WordPress

Mostrar todos os plug-ins aqui

Na página de plug-ins, localize Cache de Objetos do Redis e clique em Ativar.

Ativar Redis

Clique em Configurações.

Clique em configurações

Clique no botão Habilitar Cache de Objetos.

Clicar no botão

O WordPress conecta-se ao servidor de Redis. A conexão status aparece na mesma página.

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