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

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

Hoje vamos incluir um banco de dados na aplicação ASP .NET Core MVC, mas antes vamos criar uma imagem, definir um volume e criar um contêiner para o MySQL.  (artigo anterior)

No artigo - Docker uma introdução básica - VII - criamos uma imagem para uma aplicação ASP .NET Core MVC que foi criada neste artigo : Criando uma aplicação Web no Linux

A aplicação web que criamos usava um repositório com dados estáticos e não usava um banco de dados para persistência.

Vamos agora incluir um banco de dados para ser usado pela nossa aplicação ASP .NET Core MVC, e, isso signfica que vão existir arquivos de banco de dados que deverão ser armazenados de forma que eles não serão deletados quando um contêiner da nossa aplicação for destruído. Para isso vamos podemos criar um volume.

Não fique tentado a criar uma imagem Docker que contenha seu aplicativo Asp.Net Core MVC e o banco de dados para que eles possam ser executados em um único contêiner. A convenção para o Docker é usar um contêiner separado para cada componente em um aplicativo, o que facilita a atualização ou a substituição de partes do aplicativo e permite uma abordagem mais flexível para expandir o aplicativo depois de implantado. Você não se beneficiará dos recursos mais úteis do Docker se você criar um contêiner monolítico que inclua todos os seus componentes de aplicativo.

No entanto, como o conteúdo de um volume não é incluído nas imagens, mesmo quando o comando docker commit é usado, algumas medidas especiais são necessárias para garantir que o esquema do modelo de dados da aplicação seja criado e que qualquer dado inicial seja aplicado quando o banco de dados for iniciado pela primeira vez.

Vamos então adicionar um banco de dados à nossa aplicação ASP .NET Core MVC, criar um volume e a seguir usar o volume para conter os arquivos de dados.

A primeira coisa a fazer é decidir qual banco de dados usar, e, no caso de aplicações Web em ambiente Linux o mais recomendado é usar o MySQL que também tem o suporte para o Entity Framework Core.

Antes de iniciar vamos remover todos os contêineres criados em nosso ambiente digitando o comando:

docker rm -f $(docker ps -aq)

Baixando e inspecionando a imagem do MySQL

Vamos baixar uma imagem base do MySQL a partir do repositório, e, quando vamos adicionar um novo componente a um aplicativo em um contêiner, é importante começar inspecionando a imagem para saber como ela sua volumes de forma a poder configurar os contêineres criados.

Primeiro vamos baixar a imagem do MySQL usando o comando:

docker pull mysql:8.0.0

Conferindo a imagem baixada localmente: docker images

A seguir vamos inspecionar essa imagem baixada para saber como ela trata volumes:

docker inspect mysql:8.0.0

Examinando a saida do comando vemos a seção Volumes que indica que esta imagem usa o volume para o diretório /var/lib/mysql que é o local onde o MySQL armazena os seus arquivos de dados.

Criando o Volume e o Contêiner

Para preparar o contêiner do banco de dados, vamos primeiro criar o volume usando o comando:

docker volume create --name produtosdata



Estamos criando um volume chamado produtosdata que será usado para armazenar os arquivos de dados do banco de dados.

Para exibir o volume criado usamos o comando : docker volume ls

Vemos o nome do volume e o seu driver, ou seja, qual é a forma que ele deve montar o volume. Para este exemplo usamos o driver local, o driver padrão (built-in) do Docker.

Vamos agora criar e inciar um novo contêiner MySQL que usa este volume para fornecer ao contêiner o conteúdo do diretório /var/lib/mysql :

docker container run -d --name mysql -v produtosdata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=numsey -e bind-address=0.0.0.0 mysql:8.0.0

Nota: Este comando deve ser informado em uma única linha

Verificando o contêiner cujo processo esta em execução : docker container ps

Vamos entender melhor o comando usado:

docker container run - Este comando crie e inicia um contêiner a partir de uma imagem

-d Esse argumento informa ao Docker para executar o contêiner em segundo plano
--name mysql Este argumento é usado para atribuir o nome mysql ao container
-e MYSQL_ROOT_PASSWORD Este argumento define uma variável de ambiente. Neste caso, o contêiner MySQL usa a variável de ambiente MYSQL_ROOT_PASSWORD para definir a senha necessária para se conectar ao banco de dados.
-e bind-address Define uma variável de ambiente que assegura que o MySQL aceita requisições de todas as interfaces de rede
-v produtosdata:/var/lib/mysql Este argumento diz ao Docker para usar um volume chamado produtosdata para fornecer o conteúdo do diretório /var/lib/mysql do contêiner.

Agora vamos examinar a informação gerada pela execução do contêinerdo banco de dados na inicialização usando o comando :

docker logs -f mysql

Durante a inicialização do MySQL serão gravadas mensagens de log, dentre elas a mais importante é que informa que o banco de dados esta pronto para aceitar conexões de rede como mostrado na imagem acima : ready for connections.

As inicializações subseqüentes serão muito mais rápidas porque poderão usar os arquivos que foram
criados no volume produtosdata. Quando o banco de dados estiver em execução, digite Control+C para parar de monitorar saída e deixar o banco de dados em execução em seu contêiner em segundo plano.

Dessa forma já temos uma imagem do MySQL e um contêiner com um volume preparado.

Na próxima aula vamos ajustar a aplicação ASP .NET Core MVC para usar o MySQL.

"Eu sou o Alfa e o Ômega, o princípio e o fim, diz o Senhor, que é, e que era, e que há de vir, o Todo-Poderoso. "
Apocalipse 1:8

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