DEV Community

Celso Nery
Celso Nery

Posted on

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)