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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Entity Framework - Conceitos Básicos - Uma visão geral - Macoratti
https://docs.microsoft.com/pt-br/dotnet/core/tools/dotnet-publish?tabs=netcore21