Docker - Como compartilhar dados entre o Container e o host


 Neste artigo veremos como compartilhar dados entre o contêiner e o host.

Para este artigo eu estou usando o seguinte ambiente:

Você também pode acompanhar o artigo usando o Docker instalado no Windows 10.

Se você ainda não conhece o Docker veja a série de artigos : Docker uma introdução básica

Compartilhando dados entre o Contêiner e o host

Em geral, os contêineres do Docker são efêmeros, sendo executados apenas o tempo necessário para que o comando emitido no contêiner seja concluído. Dessa forma, por padrão, todos os dados criados dentro do contêiner só estão disponíveis no contêiner enquanto o contêiner estiver em execução.

Os volumes do Docker podem ser usados para compartilhar arquivos entre o host e o contêiner do Docker.

Por exemplo, vamos supor que você queira usar a imagem oficial do Nginx para criar um contêiner e deseja manter uma cópia permanente dos arquivos de log do Nginx para analisar posteriormente.

Por padrão, a imagem do nginx vai registrar os logs na pasta /var/log/nginx dentro do contêiner criado, e,  normalmente, não é possível acessar esses arquivos diretamente a partir do host.

Assim, hoje veremos como tornar os dados de dentro do contêiner acessíveis na máquina host.

Recursos usados:

Montando um Volume usando o recurso bind mounting

Para poder compartilhar dados entre o contêiner e o host podemos usar o recurso Volumes do Docker.

Os Volumes são o mecanismo preferido para persistir dados gerados e usados pelos contêineres do Docker sendo completamente gerenciados pelo Docker.

Uma forma mais simples de compartilhar dados entre o contêiner é realizar um bind mounting que vou traduzir para montagem de vinculação. Este recurso possui funcionalidades limitadas em comparação com volumes.

Qual a diferença ?

Quando você usa uma montagem de vinculação, um arquivo ou diretório na máquina host é montado em um contêiner. O arquivo ou diretório é referenciado por seu caminho completo ou relativo na máquina host.

Por outro lado, quando você usa um volume, um novo diretório é criado no diretório de armazenamento do Docker na máquina host e o Docker gerencia o conteúdo desse diretório.

Assim, os volumes são uma opção melhor para persistir dados visto que um volume não aumenta o tamanho dos contêineres que o utilizam, e, o conteúdo do volume existe fora do ciclo de vida de um determinado contêiner.

Neste artigo eu vou usar o bind mounting.

Para criar um contêiner e compartilhar dados de uma pasta do contêiner com o host podemos usar a flag -v ou
--volume (existe também a flag --mount que é usada em serviços swarms e que eu não vou abordar).

A sintaxe para a flag -v é :  -v  pasta_contêiner:pasta_host

Vamos então criar um contêiner usando a imagem oficial do Nginx obtida a partir do Docker Hub e vamos compartilhar a pasta  /var/log/nginx do contêiner com o host de forma que poderemos acessar os logs do Nginx na pasta mapeada no host.

docker run --name ws1 -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx



Vamos detalhar o comando usado:

docker run  O comando que cria o contêiner (uma abreviação de docker container run.
--name ws1  Vamos criar o contêiner com o nome ws1
-d  Executa o contêiner em segundo plano (detached)
-v ~/nginxlogs:/var/log/nginx  Mapeia a pasta /var/log/nginx do contêiner para uma pasta chamada /nginxlogs que será criada no host
-p 5000:80  Mapeia a porta 80 do contêiner para a porta 5000 do host
nginx  A imagem usada para criar o contêiner

A seguir emitimos o comando docker container ps para exibir o contêiner em execução e notamos que ao iniciar o contêiner criado emitiu o comando 'nginx -g 'daemon off' para iniciar o Ngnix.

Agora estamos prontos para poder acessar os dados a partir do host.

Acessando dados a partir do Host

Agora temos uma cópia do Nginx sendo executado dentro de um contêiner Docker identificado pelo nome ws1 em nossa máquina, e a porta da máquina host 5000 mapeia diretamente para essa cópia da porta 80 do Nginx.

Vamos carregar em um navegador, e usar o endereço IP ou o nome do host do seu servidor e o número da porta: http://localhost:5000. Fazendo isso iremos obter:

 

Isso prova que o nosso contêiner esta em execução e esta gerando logs.

Vamos agora usar o comando docker container inspect para inspecionar informações sobre o container Docker.

docker container inspect ws1

Este comando permite acessar diversas informações sobre os objetos Docker.

Procurando a seção Mounts vemos a definição do mapeando que definimos em nosso comando para criar o contêiner :

Source : /home/macoratti/nginxlogs
Destination : /var/log/nginx

Vemos que agora podemos acessar os logs no host a partir da pasta /home/macoratti/nginxlogs.

Vamos acessar essa pasta e exibir o conteúdo de um arquivo de log. Para isso vamos emitir os comandos:

pwd
cd nginxlogs
cat access.log

Podemos agora acessar as informações dos logs do Nginx para o contêiner criado no host graças à utilização do mapeamento usando a flag -v usando o recurso do bind mounting.

Vimos assim duas maneiras de obter o shell do contêiner estando ele em execução.

Se você fizer alguma alteração na pasta ~/nginxlogs, poderá vê-las também dentro do contêiner ws1 em tempo real.

Aguarde mais artigos sobre Docker.

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

Referências:


José Carlos Macoratti