Skip to main content

Volumes | Docker

understanding_volumes_in_docker.webp

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

danger

Quando você roda um docker-compose, ele pega o nome da pasta onde foi executado e acrescenta o nome do volume conforme imagem abaixo: alt text

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.
danger

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
danger

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

TipoPersistênciaLocalizaçãoDesempenhoControle do Host
VolumeSimGerenciado pelo DockerMuito bomMédio
Bind MountSimCaminho específicoVariávelTotal
tmpfs MountNãoMemória RAMMuito rápidoNenhum