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

 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.

  1. Definir uma imagem base;
  2. Definir a pasta de trabalho;
  3. Definir o ponto de entrada da aplicação e criar um arquivo texto com uma mensagem e data;

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:


José Carlos Macoratti