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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
ASP .NET Core 2 - MiniCurso Básico - Macoratti
ASP .NET Core - Macoratti
https://www.udemy.com/docker-essencial-para-a-plataforma-net/
Docker Essencial para a plataforma .NET - Macoratti.net
Docker - Uma introdução básica - Macoratti
ASP .NET Core - Acesso ao MySQL c/ EF Core usando o Docker
Docker Essencial para a plataforma .NET - YouTube