Docker - Uma introdução básica - XIII

 Neste artigo vou apresentar os conceitos básicos relativos ao Docker sob o ponto de vista de um desenvolvedor .NET.

No artigo anterior, vimos como combinar contêineres, volumes e redes em uma aplicação mais complexa. O problema com a abordagem usada é que cada passo foi executado manualmente, o que pode ser um processo sujeito a erros.

Não apenas cada comando deve ser inserido corretamente, mas as etapas devem ser executadas na ordem correta, porque um contêiner tem que estar habilitado para enviar requisições para outro contêiner que tem que ser criado antes dele. Se você pular uma etapa ou executar uma etapa fora de ordem, então sua aplicação vai falhar.

É justamente para evitar esses problemas que serve o Docker Compose, o orquestrador de contêineres do Docker.

Neste artigo veremos como usar o Docker Compose que é uma ferramenta usada para descrever aplicações complexas e gerenciar os contêineres, as redes e os volumes que essas aplicações exigem para funcionar. Ele simplifica o processo de configuração e execução de aplicativos para que você não precise digitar comandos complexos, o que pode levar a erros de configuração.

O Docker Compose é usado para descrever aplicações de forma consistente e previsível usando um arquivo de composição que contém detalhes de todos os volumes, redes e contêineres que compõem um aplicativo e os relacionamentos entre eles. Para processar o arquivo de composição usamos o comando : docker-compose

Você não é obrigado a user o Docker Compose, podendo gerenciar seus contêineres manualmente ou usar outra alternativa como o Crowdr (https://github.com/polonskiy/crowdr).

A primeira coisa a fazer é instalar o Docker Compose em nosso ambiente.

Instalando o Docker Compose no Linux

As instruções de instalação estão disponíveis neste link: https://docs.docker.com/compose/install/

Para instalar o Docker Compose digite o comando abaixo e depois aplique as permissões aos binários:

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

Para verificar digite o comando : docker-compose --version

Você deverá ver exibida a versão instalada do docker-compose.

Preparando o ambiente

Antes de prosseguir vamos limpar todos os contêineres, volumes e redes criadas em nosso ambiente digitando os comandos a seguir:

docker container rm -f $(docker ps -aq)
docker volume rm $(docker volume ls -q
docker network rm $(docker network ls -q)


Vamos agora ajustar a aplicação que criamos no artigo 7  alterando o código do controlador HomeController conforme abaixo:

Estamos incluindo uma variável message e definindo um item de configuração chamado HOSTNAME para exibir o nome do Host na view.

Na classe Startup, no método ConfigureServices() inclua a linha de código abaixo que registra um serviço para IConfiguration:

...
services.AddSingleton<IConfiguration>(Configuration);
services.AddTransiente<IRepository, ProdutoRepository>();
...

Iremos aplicar este recurso para usar a variável de ambiente do Docker chamada HOSTNAME dentro dos contêineres que será atribuída para o ID do contêiner e exibida na View para identificar o contêiner.

Criando o arquivo de composição

Vamos agora criar  um arquivo de composição para configurar corretamente os componentes de uma aplicação que o Docker compose vai usar para gerenciar os contêineres, volumes e redes.

Este arquivo de composição possui a  extensão .yml e o formato YAML que possui um formato específico onde a indentação com espaços é usada para definir a estrutura do arquivo.

Vamos criar o arquivo docker-compose.yml na pasta App1 da aplicação de exemplo criada no artigo 7.

A seguir vamos definir a seguinte configuração neste arquivo:

Neste arquivo temos as seguinte seções:

Nome Descrição
 version Essa configuração especifica a versão do esquema Docker Compose que o arquivo usa. Atualmente, a versão mais recente é 3.
 volumes Esta configuração é usada para configurar os volumes que serão usados pelos contêineres definidos para  compor arquivo. Este exemplo define um volume chamado produtosdados
 networks Esta configuração é usada para configurar as redes que serão usadas pelos contêineres definidos no arquivo de composição. Este exemplo define redes chamadas frontend e backend.

A seção version informa ao Docker qual versão do esquema do arquivo de composição está sendo usada. A versão mais recente é 3, que inclui suporte para os recursos mais recentes do Docker.

Os arquivos de composição são processados usando uma ferramenta de linha de comando chamada docker-compose (observe o hífen), que constrói e gerencia o aplicativo.

Nosso arquivo de composição ainda esta no início tendo pouca configuração útil mas mesmo assim vamos executar o arquivo digitando o comando abaixo na pasta App1 apenas para testar:

docker-compose -f docker-compose.yml build

O argumento -f é usado para especificar o nome do arquivo de composição, apesar de o Docker usar como padrão o nome docker-compose.yml ou docker-compose.yaml se um arquivo não for especificado.

O argumento build informa ao Docker para processar o arquivo e criar as imagens do Docker que ele contém. Não há imagens definidas no arquivo no momento, e veremos uma mensagem de alerta(WARNING) indicando qual as redes definidas não estão sendo usadas.

Esse aviso indica que o arquivo de composição informa ao Docker para criar asa redes, mas elas não estão sendo usadas em nenhum outro lugar do aplicativo e, portanto, não foram criadas.

Compondo o banco de dados

Vamos continuar a definir o nosso arquivo de composição configuranco o banco de dados.

O processo para descrever o aplicativo usando o Docker Compose segue o mesmo caminho da criação
dos contêineres manualmente e a próxima etapa é configurar o contêiner do banco de dados.

Vamos incluir no arquivo de composição criado a configuração do contêiner para o MySQL conforme mostrado na figura a seguir:

A palavra-chave services é usada para indicar a seção do arquivo que contém as descrições
que serão usadas para criar contêineres. O termo serviço é usado porque a descrição pode ser usada para crie mais de um contêiner. Cada serviço recebe sua própria seção.

O serviço descrito no arquivo é chamado de mysql e descreve como os contêineres de banco de dados devem ser criados usando as propriedades de configuração descritas a seguir:

Nome Descrição
 services Indica o início da seção de serviços do arquivo de composição, que descreve os serviços que serão usados ​​para criar contêineres
 mysql Esta propriedade indica o início de uma descrição de serviço chamada mysql.
 image Essa propriedade especifica a imagem do Docker que será usada para criar contêineres. Neste
exemplo, a imagem oficial do MySQL será usada
 volumes Esta propriedade especifica os volumes que serão usados ​​pelos contêineres e pelos diretórios
eles serão usados​. Neste exemplo, o volume produtosdados será usado para fornecer o
conteúdo do diretório /var/lib/mysql.
 networks Esta propriedade especifica as redes às quais os contêineres serão conectados. Neste exemplo,
os contêineres serão conectados à rede backend.
 environment Esta propriedade é usada para definir as variáveis ​​de ambiente que serão usadas quando um
recipiente for criado. Neste exemplo, definimos as variáveis ​​MYSQL_ROOT_PASSWORD e bind-address.

Vamos agora executar o comando para verificar se as alterações feitas podem ser processadas.

Digite o comando : docker-compose build

Nota: Eu estou omitindo o nome do arquivo pois estou usando o nome do arquivo padrão que o Docker vai procurar.

O aviso sobre as redes não utilizadas foi alterado porque o contêiner do banco de dados será conectado à rede backend. A outra parte da saída indica que nenhuma ação é necessária para o serviço mysql no momento porque ele é baseado em uma imagem existente, que será usada para criar e configurar um contêiner quando o arquivo de composição for usado para iniciar o aplicativo.

Testando a configuração da aplicação

Já temos configuração suficiente no arquivo de composição para realizar um teste.

Vamos executar, na pasta do projeto App1, o comando : docker-compose up

O comando docker-compose up informa ao Docker para processar o conteúdo do arquivo de composição e configurar os volumes, redes e contêineres especificados. O Docker vai baixar todas as imagens necessárias do Docker Hub para que elas possam ser usadas para criar um contêiner.

Os detalhes do processo de configuração são mostrados no prompt de comando, junto com a saída dos
contêineres criados.

O nome da rede, o volume e o container que o Docker cria são prefixados com app1_. A rede é nomeada como app1_backend, o volume é chamado de app1_produtosdados e o contêiner é chamado de app1_mysql_1_<aleatorio>. (A parte _1 do nome do container MySQL refere-se a como o Docker escala os aplicativos descritos usando arquivos de composição).

O prefixo é retirado do nome do diretório que contém o arquivo de composição e garante que diferentes arquivos de composição podem usar os mesmos nomes para redes, volumes e contêineres sem haver conflitos quando o aplicativo for iniciado. (Você pode alterar o prefixo usado com o argumento -p para o comando docker-compose up command).

Quando o banco de dados tiver concluído seu processo de inicialização, digite Control + C para finalizar o comando dockercompose e pare os contêineres descritos no arquivo de composição.

Você pode explorar o resultado do processamento do arquivo de composição usando os comandos Docker.

1- exibir os contêineres criados :
docker container ps -a



2- exibir as redes criadas :
docker network ls



Apenas uma foi criada pois nenhum contêiner se conecta à rede front_end

3- exibir os volumes :
docker volume ls

Antes de prosseguir vamos executar o comando abaixo na pasta App1 para remover os contêineres e as redes que estão descritos no arquivo de composição. Não vamos remover os volumes (para isso use argumento -v).

docker-compose down

Na próxima parte do artigo vamos continuar a definição do arquivo de composição para a aplicação ASP .NET Core MVC.

"Disse-lhe Jesus: Eu sou o caminho, e a verdade e a vida; ninguém vem ao Pai, senão por mim."
João 14:6

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti