DEV Community

Celso Nery
Celso Nery

Posted on Edited on

Docker - Parte 3: Persistindo Dados com Volumes

🇺🇸 English version here

Docker para Desenvolvedores - Parte 3: Persistindo Dados com Volumes

Na Parte 2 desta série, vimos os comandos essenciais para operar containers no dia a dia. Mas há um detalhe importante: por padrão, os dados escritos dentro de um container são efêmeros, se o container for removido, esses dados desaparecem junto. Para aplicações com estado (bancos de dados, uploads de usuários, arquivos de configuração), isso é um problema. É para resolver isso que existem os volumes.

Bind mount x Volume

Existem duas formas principais de persistir dados fora do ciclo de vida do container:

  • Bind mount: monta uma pasta específica do host (a máquina onde o Docker roda) dentro do container. Você tem controle total sobre onde os dados ficam no host, mas fica mais dependente da estrutura de pastas daquela máquina específica.
  • Volume: gerenciado pelo próprio Docker, armazenado em uma área interna (/var/lib/docker/volumes/ no Linux). É a forma recomendada para a maioria dos casos, pois é mais portável entre ambientes e mais fácil de fazer backup, inspecionar e limpar.

Este artigo foca em volumes, a abordagem mais indicada para uso profissional.

Criando um volume

Para criar um volume nomeado, que vai armazenar os dados de uma aplicação:

docker volume create nome_do_vol
Enter fullscreen mode Exit fullscreen mode

Listando volumes

Para ver todos os volumes já existentes no sistema:

docker volume ls
Enter fullscreen mode Exit fullscreen mode

Inspecionando um volume

Para ver detalhes de um volume específico, como o caminho real onde os dados ficam armazenados no host:

docker volume inspect nome_do_vol
Enter fullscreen mode Exit fullscreen mode

Rodando um container com um volume -v

Usando bind mount

docker run --rm -d -it -v pasta_local:pasta_remota httpd
Enter fullscreen mode Exit fullscreen mode

Aqui, pasta_local é um caminho absoluto no host (por exemplo, /home/celso/dados), e pasta_remota é o caminho dentro do container onde esses dados devem aparecer (por exemplo, /var/www/htdocs/).

Usando um volume criado

docker run --rm -d -it -v nome_do_volume:pasta_remota httpd
Enter fullscreen mode Exit fullscreen mode

Nesse caso, nome_do_volume é o nome do volume criado anteriormente com docker volume create, o Docker cuida de onde esses dados ficam fisicamente armazenados.

Removendo um volume

Se algum container ainda estiver usando o volume, será preciso remover o container primeiro:

docker rm <nome_do_container>
Enter fullscreen mode Exit fullscreen mode

Depois, para remover o volume:

docker volume rm nome_do_vol
Enter fullscreen mode Exit fullscreen mode

Limpando volumes não utilizados

Com o tempo, é comum acumular volumes órfãos (criados por containers que já foram removidos). Para limpar todos os volumes que não estão sendo usados por nenhum container:

docker volume prune
Enter fullscreen mode Exit fullscreen mode

Esse comando remove permanentemente os dados de qualquer volume não referenciado por um container ativo, confirme antes de rodar em um ambiente com dados importantes.

Usando volumes NFS

Em ambientes com múltiplos hosts Docker (ou quando você quer compartilhar dados entre diferentes servidores), é possível criar um volume que aponta para um compartilhamento NFS em vez de armazenamento local:

docker volume create --opt type=nfs --opt o=addr=10.0.0.35,rw,nfsvers=4 --opt device=:/home/nfsshare nfs-volume
Enter fullscreen mode Exit fullscreen mode

Onde:

  • type=nfs: define o driver de volume como NFS;
  • o=addr=10.0.0.35,rw,nfsvers=4: endereço do servidor NFS e opções de montagem (leitura/escrita, versão do protocolo);
  • device=:/home/nfsshare: caminho exportado pelo servidor NFS;
  • nfs-volume: nome dado ao volume no Docker.

Isso é especialmente útil em cenários onde múltiplos containers (possivelmente em hosts diferentes) precisam acessar o mesmo conjunto de dados compartilhado.

Próximos passos

Com volumes garantindo persistência de dados, o próximo desafio é a comunicação entre containers, especialmente quando uma aplicação depende de vários serviços (por exemplo, uma API que precisa falar com um banco de dados). Na Parte 4 desta série, vamos ver como criar e gerenciar redes no Docker.

Continua na Parte 4.

Top comments (0)