Olá PessoALL,

Eu venho estudando e palestrando bastante sobre Azure App Services e Containers, digo isso por 2 motivos simples, eu amo App Services e porque acredito que App Services + Containers são uma combinação muito poderosa.

Vocês podem ver minha talk sobre o assunto aqui: https://rafaeldossantos.net/containers-app-services-uma-combinacao-simples-e-poderosa-capiconf-online/

Quero começar uma série de posts sobre o assunto e alguns experimentos que venho fazendo para ver até onde consigo ir e nesse primeiro post quero fazer sobre Docker-Compose e Volumes.

Docker Compose

Para quem está começando no mundo de containers e ainda não conhece o docker compose:

Compose é uma ferramenta para definir e executar multi-container Docker apps.

Vamos começar com um exemplo bem simples, executar o nginx em um container, utilizando um arquivo de configuração via file system do app service.

1 - Criando um App Service
Vamos seguir os passos normais para criar um app service, conforme as imagens a baixo:

Criando um novo App Service
New App Service + Docker Compose

Configure o App Service conforme a imagem anterior, um ponto de atenção, quando estiver usando múltiplos containers eles precisam estar todos no mesmo registro, mas isso é assunto para o próximo post.

A configuração do docker compose:

version: "3"  
services:  
  nginx: 
    image: nginx:latest
    restart: always
    container_name: dev_nginx
    volumes:
      - ${WEBAPP_STORAGE_HOME}/site/wwwroot/nginx.az.conf:/etc/nginx/nginx.conf
      - ${WEBAPP_STORAGE_HOME}/site/wwwroot:/var/www/html
    ports:
      - "80:80"

A configuração é bem simples, mas gostaria de abordar a sessão volumes:

  • ${WEBAPP_STORAGE_HOME} - usamos a váriavel de ambiente para montarmos volumes nos nossos containers.
  • Estou criando 2 volumes: 1 para mudar as configurações do container e outro para os arquivos do meu "site".

Quando utilizamos volumes, eles são persistidos mesmo que os containers restartem ou quando escalamos os arquivos continuam acessiveis entre todas as instâncias, isso é possivel porque o Azure utiliza o Azure Storage para persistir os volumes.

2 - Habilitando a persistência dos volumes
Para habilitar a persistência dos volumes, acesse as configurações do App Service e inclua a chave: WEBSITES_ENABLE_APP_SERVICE_STORAGE:true conforme a imagem a baixo:

3 - Fazendo upload dos arquivos
Agora que temos nosso container configurado e os volumes persistidos, precisamos fazer o upload dos nossos arquivos de configuração e os arquivos do nosso "site".
O App Service tem suporte a FTP e acredito que seja a maneira mais simples de fazermos upload dos arquivos para nossos estudos.

Caso possua arquivos de configuração maiores ou em ambientes de produção eu recomendaria que voce criasse sua imagem customizada com as configurações necessárias.

Para obter as configurações de FTP, na guia principal do seu App Service clique na opção Get Publish Profile.

Obtendo o publish profile com a senha do ftp

Após obter o arquivo, abra no seu editor favorito, você encontrará uma configuração parecida com a configuração à seguir:

<publishProfile profileName="rsantosdev-dockercompose - FTP" publishMethod="FTP" 
        publishUrl="ftp://waws-prod-bn1-025.ftp.azurewebsites.windows.net/site/wwwroot" 
        ftpPassiveMode="True" 
        userName="seuUsuario" 
        userPWD="suaSenhaAqui" 
        destinationAppUrl="http://rsantosdev-dockercompose.azurewebsites.net" 
        SQLServerDBConnectionString="" mySQLDBConnectionString="" hostingProviderForumLink="" 
        controlPanelLink="http://windows.azure.com" 
        webSystem="WebSites">
        <databases />
    </publishProfile>

Utilize seu cliente ftp (ou terminal) para fazer o upload dos arquivos a seguir:

  • nginx.az.conf
worker_processes 1;

events { worker_connections 1024; }

http {

    log_format compression '$remote_addr - $remote_user [$time_local] '
        '"$request" $status $upstream_addr '
        '"$http_referer" "$http_user_agent" "$gzip_ratio"';

    server {
        listen 80;
        server_name _;
        root /var/www/html;
        access_log /var/log/nginx/access.log compression;

        index index.html;
    }
}
  • index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Azure App Services - Multi Container App</title>
</head>
<body>
    <h1>Hello from my NGINX server!</h1>
</body>
</html>
FTP

Pronto! Ao acessar nosso site podemos ver que o container esta usando as configurações que acabamos de atualizar.

Esse foi nosso primeiro post sobre o assunto, na próximo post vou mostrar como podemos usar múltiplos containers e criar um API GATEWAY usando um único Azure App Service.

Não deixe de comentar o que achou do post ou deixar sua sugestão.
[]s e até a próxima.