Volumes | Docker
-
Volumes | Docker
-
Artigo: Understanding Volumes in Docker
-
A cada comando que rodamos no
dockerfileé uma camada criada- Consultar documentação Layer Caching

Para entender o que é um volume Docker, primeiro precisamos esclarecer como o sistema de arquivos normalmente funciona no Docker. As imagens Docker são armazenadas como uma série de camadas somente leitura. Quando iniciamos um contêiner, o Docker pega a imagem somente leitura e adiciona uma camada de leitura e gravação no topo. Se o contêiner em execução modificar um arquivo existente, o arquivo será copiado da camada somente leitura subjacente e para a camada superior de leitura e gravação, onde as alterações serão aplicadas. A versão na camada de leitura e gravação oculta o arquivo subjacente, mas não o destrói – ele ainda existe na camada subjacente. Quando um contêiner Docker é excluído, reiniciar a imagem iniciará um novo contêiner sem nenhuma das alterações feitas no contêiner em execução anterior – essas alterações serão perdidas. Docker chama essa combinação de camadas somente leitura com uma camada de leitura e gravação no topo de Sistema de Arquivos União .
Declarando um volume
docker run -it --name vol-test -h CONTAINER -v /data debian /bin/bash
Isso fará com que o diretório /data dentro do contêiner fique fora do Union File System e seja diretamente acessível no host. Quaisquer arquivos que a imagem mantenha dentro do diretório /data serão copiados para o volume.
Exatamente o mesmo efeito pode ser alcançado usando uma instrução VOLUME em um Dockerfile:
FROM debian:wheezy
VOLUME /data
Também podemos criar volumes usando o comando docker volume create
docker volume create --name my-vol
Há outro caso de uso importante para volumes que só pode ser realizado por meio do sinalizador -v – montar um diretório específico do host em um contêiner. Por exemplo
docker run -v /home/adrian/data:/data debian ls /data
Montará o diretório /home/adrian/data no host como /data dentro do contêiner. Quaisquer arquivos já existentes no diretório /home/adrian/data estarão disponíveis dentro do contêiner. Isso é muito útil para compartilhar arquivos entre o host e o contêiner, por exemplo, montando o código-fonte a ser compilado. O diretório host de um volume não pode ser especificado a partir de um Dockerfile, para preservar a portabilidade (o diretório host pode não estar disponível em todos os sistemas). Quando esta forma do argumento -v é usada, quaisquer arquivos na imagem no diretório não são copiados para o volume. Esses volumes não são "gerenciados" pelo Docker como nos exemplos anteriores - eles não aparecerão na saída dodocker volume ls e nunca será excluído pelo daemon do Docker.
Permissões e propriedade
Frequentemente, você precisará definir as permissões e a propriedade de um volume ou inicializar o volume com alguns dados padrão ou arquivos de configuração. Um ponto importante a ser observado aqui é que qualquer coisa após a instrução VOLUME em um Dockerfile não será capaz de fazer alterações nesse volume, por exemplo:
FROM debian:wheezy
RUN useradd foo
VOLUME /data
RUN touch /data/x
RUN chown -R foo:foo /data
Excluindo Volumes
Provavelmente, se você estiver usando o docker rm para excluir seus contêineres, provavelmente terá muitos volumes órfãos ocupando espaço.
Os volumes só serão excluídos automaticamente se o contêiner pai for removido com o comando docker rm -v (o -v é essencial) ou se o sinalizador --rm tiver sido fornecido para docker run . Mesmo assim, um volume só será excluído se nenhum outro contêiner estiver vinculado a ele. Os volumes vinculados aos diretórios host especificados pelo usuário nunca são excluídos pelo docker.
Para dar uma olhada nos volumes do seu sistema, use docker volume ls :
docker volume ls
Para excluir todos os volumes que não estão em uso, tente:
docker volume rm $(docker volume ls -q)
Tipos de volumes
Quando você roda um docker-compose, ele pega o nome da pasta onde foi executado e acrescenta o nome do volume conforme imagem abaixo:
Qualquer alteração de caminho, o container vai criar um novo volume
No Docker, volumes são uma das formas principais de persistir dados entre execuções de containers. Existem três tipos principais de volumes que podem ser usados:
1. Volumes (gerenciados pelo Docker)
- Criados e gerenciados pelo Docker.
- Armazenados em uma pasta especial no host (geralmente
/var/lib/docker/volumes/). - São independentes do ciclo de vida do container.
- Podem ser nomeados ou anônimos.
Não aparece a pasta na máquina. Caso haja a necessidade de realizar alguma alteracão no arquivo fica mais difícil. IDEAL PARA PRODUÇÃO
Exemplo no Docker-Compose
services:
app:
image: my_image
volumes:
- app_data:/app/data
volumes:
app_data:
📌 Exemplo:
docker volume create meu_volume
docker run -v meu_volume:/app/data my_image
2. Bind Mounts
- Montam um diretório ou arquivo específico do host no container.
- Total controle sobre onde está localizado no host.
- Mais flexíveis, mas menos seguros que volumes.
📌 Exemplo:
docker run -v /meu/diretorio/host:/app/data my_image
IDEAL PARA DESENVOLVIMENTO LOCAL
Exemplo no Docker-Compose
services:
app:
image: my_image
volumes:
- ./dados_local:/app/data
3. tmpfs Mounts
- Volumes temporários armazenados apenas na memória (RAM).
- Úteis para dados sensíveis ou que não precisam ser persistidos.
- Não sobrevivem a reinícios do container.
📌 Exemplo:
docker run --tmpfs /app/cache:rw,size=64m my_image
Exemplo no Docker-Compose
services:
app:
image: my_image
tmpfs:
- /app/cache
Comparativo Rápido
| Tipo | Persistência | Localização | Desempenho | Controle do Host |
|---|---|---|---|---|
| Volume | Sim | Gerenciado pelo Docker | Muito bom | Médio |
| Bind Mount | Sim | Caminho específico | Variável | Total |
| tmpfs Mount | Não | Memória RAM | Muito rápido | Nenhum |