Neste artigo vou apresentar os conceitos básicos relativos ao Docker sob o ponto de vista de um desenvolvedor .NET. |
Neste artigo vamos tratar de volumes no Docker.(artigo anterior)
O recurso volumes separa os arquivos de dados que são gerados por um aplicativo ou banco de dados do restante do armazenamento do contêiner, o que facilita a substituição ou atualização de um contêiner.
|
Os volumes permitem que dados importantes existam fora do contêiner, o que significa que você pode substituir um contêiner sem perder os dados que ele criou.
Os volumes tornam possível excluir um contêiner sem também excluir o dados que contém, o que permite que os contêineres sejam alterados ou atualizados sem perder dados do usuário.
Para usar esse recurso usamos o comando Volume, e, ele deve ser preparado antes que os contêineres que usam os dados sejam criados.
Existem dois tipos de arquivos associados a um aplicativo:
1- Os arquivos necessários para executar o aplicativo;
2- Os arquivos de dados que o aplicativo gera enquanto é executado, que são tipicamente produzidos como resultado de ações do usuário;
No mundo
Docker, esses dois tipos de arquivos são tratados de maneira diferente. Os
arquivos necessários para executar o aplicativo fazem parte do
contêiner Docker
de um aplicativo. Quando
o Docker processa as instruções em um Dockerfile,
ele cria a imagem que forma o modelo para criar
contêineres.
Para uma
aplicação ASP.NET Core MVC, isso significa que os contêineres incluem o
.NET
Core runtime,
os pacotes ASP.NET Core, as classes C# personalizadas, a folha de estilo CSS do
Bootstrap, as views Razor, e todos os arquivos de configuração. Sem esses
arquivos, a aplicação MVC em um contêiner não seria capaz de ser executado com
sucesso.
Os arquivos de dados não são incluídos em contêineres. Um dos principais benefícios do uso de contêineres é que eles são fáceis de criar e destruir. Quando um contêiner é destruído, os arquivos em seu sistema de arquivos também são excluídos. Excluir um contêiner seria desastroso para os arquivos de dados, porque eles seriam perdidos para sempre.
O Docker fornece um recurso chamado volumes para gerenciar dados do aplicativo e veremos como os volumes funcionam, e como usar ferramentas disponíveis para trabalhar com eles e mostrar um tipo comum de aplicativo que usa volumes: um banco de dados.
Entendendo Volumes : demonstrando o problema
Creio que a melhor maneira de entender Volumes é mostrar o que acontece quando não usamos volumes em uma aplicação que gera dados.
Para isso vamos criar uma imagem usando a distribuição Alpine do Linux e gerar um arquivo de texto que contém uma mensagem e uma data que serão os dados da aplicação.
Vamos então criar o arquivo Dockerfile para gerar a imagem.
Criando o arquivo Dockerfile
A primeira coisa que temos que fazer é definir o passos que vamos usar para criar a imagem.
Vamos criar uma pasta App2 dentro da pasta projetos e criar o arquivo DockerFile nesta pasta. Vamos entrar na pasta e abrir o Visual Studio Code digitando o comando code.
cd projetos
md App2
cd App2
code .
Com o Visual Studio Code aberto crie o arquivo Dockerfile e inclua o código abaixo:
Nota: O nome do arquivo tem que ser exatamente Dockerfile
Os comandos definidos para o nosso arquivo Dockerfile foram:
FROM alpine:3.4
WORKDIR /data
ENTRYPOINT (test -e msg.txt &&
echo "Arquivo existe" \
|| (echo "Criando arquivo..." \
&& echo Ola, Docker $(date '+%X') > msg.txt)) && cat msg.txt
Vamos entender cada uma das instruções usadas:
FROM alpine:3.4
Definimos a imagem base como: alpine:3.4. Esta
é uma distribuição mínima do Linux.
WORKDIR /data
Definimos a pasta data como diretório de trabalho
ENTRYPOINT (test -e msg.txt && echo "Arquivo
existe" \ ....
Para simular um aplicativo que gera dados, o comando ENTRYPOINT cria um arquivo
de dados chamado arquivo /data/msg.txt que contém uma mensagem e um timestamp.
O arquivo de dados não será criado até que o contêiner seja iniciado e não será
parte da imagem criada do arquivo Docker, semelhante ao conteúdo de um banco de
dados em um aplicativo real.
Dessa
forma já temos o arquivo Dockerfile criado para
gerar a imagem. Vamos executar o Dockerfile:
docker build -t macvol/app2:1.0 .
onde:
docker build -> O comando
-t -> Parâmetro usado para informar que a imagem pertence ao meu usuário
macvol/app2:1.0 -> O nome da imagem e a
tag atribuída à imagem
.
-> significa o diretório atual (pois dei o build dentro da pasta do
DockerFile)
Exibindo as imagens: docker images
Vemos a imagem macvol/app2:1.0 criada com a TAG igual a 1.0, o ID, data de criação e tamanho.
Agora vamos criar e executar um contêiner com base nesta imagem:
docker container run --name testevol macvol/app2:1.0
Aqui usamos o parâmetro --name para dar um novo ao contêiner criado.
Vemos na figura acima a saída produzida pela execução do contêiner.
O
contêiner é executado e sai depois de ter escrito a mensagem, o que mostra que
os dados no arquivo /data/msg.txt foram criados e que
foi definido um timestamp às 21:12:52.
Como não configuramos um volume para o arquivo de dados, ele se tornou parte do
sistema de arquivos do contêiner. O sistema de arquivos é persistente, e,
podemos provar isso iniciando novamente o contêiner com o comando:
docker container start -a testevol
A saída indica que o arquivo /data/msg.txt já existe e possui o mesmo registro de data e hora.
Tudo bem, esse é o comportamento esperado. Vamos agora excluir o contêiner para mostrar o que vai acontecer, digitando os comandos:
docker container rm -f testevol
docker container ps -a
O primeiro comando exclui o contêiner identificado por testevol e o segundo exibe todos os contêineres.
Como vemos não temos mais o contêiner que criamos pois o mesmo foi excluído. Assim o Docker excluiu o contêiner e o arquivo de dados /data/msg.txt foi perdido. Perdemos os dados...
Para confirmar isso vamos criar outro contêiner a partir da mesma imagem:
docker container run --name testevol macvol/app2:1.0
O resultado exibido na execução do contêiner mostra que o arquivo foi criado novamente com uma nova data e que os dados anteriores foram perdidos.
Como resolver esse problema ?
Na próxima aula vamos veremos como criar volumes para evitar a perda de dados.
"Porque Deus não nos deu
o espírito de temor, mas de fortaleza, e de amor, e de
moderação."
2
Timóteo 1:7
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