🇺🇸 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
Listando volumes
Para ver todos os volumes já existentes no sistema:
docker volume ls
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
Rodando um container com um volume -v
Usando bind mount
docker run --rm -d -it -v pasta_local:pasta_remota httpd
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
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>
Depois, para remover o volume:
docker volume rm nome_do_vol
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
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
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)