8.1 Introdução aos discos virtuais
Montagem de volumes (Volumes) é uma das funcionalidades mais úteis do Docker. Com isso, os containers conseguem trabalhar facilmente com dados da máquina host. Essa função torna o gerenciamento de dados flexível e conveniente: você pode salvar informações por longo prazo, compartilhá-las entre containers e fazer backup ou restaurar os dados sem dor de cabeça, caso algo dê errado.
Volumes no Docker são uma maneira de salvar dados de forma independente dos containers. Mesmo que um container seja removido, as informações armazenadas nos volumes permanecem seguras. Os volumes podem ser conectados (montados) aos containers, permitindo armazenar dados separadamente e reutilizá-los, independente de quantas vezes você crie ou remova containers.
Principais tipos de volumes
- Volumes Anônimos (Anonymous Volumes)
- São criados automaticamente pelo Docker, caso um volume não seja explicitamente especificado para o container.
- Usados para armazenamento temporário de dados.
- Volumes Nomeados (Named Volumes)
- São criados e gerenciados pelo Docker.
- Podem ser conectados a múltiplos containers e são preservados mesmo após o container ser removido ou parado.
- Volumes de Bind (Bind Mounts)
- Conectam um diretório da máquina host a um diretório no container.
- Ideais para acessar dados do sistema host e são úteis durante o desenvolvimento.
Sintaxe básica do comando docker run
para montar volumes
-v <host_path>:<container_path>
Sintaxe completa:
docker run -v <host_path>:<container_path> [OPTIONS] IMAGE [COMMAND] [ARG...]
Principais parâmetros para montagem de volumes
1. Parâmetro -v
ou --volume
Usado para criar volumes nomeados ou volumes de bind.
Exemplo:
docker run -d -v /host/data:/container/data nginx
2. Parâmetro --mount
Fornece um método mais detalhado e flexível para montar volumes, dando suporte a parâmetros adicionais.
Exemplo:
docker run -d --mount type=bind,source=/host/data,target=/container/data nginx
8.2 Criando e usando volumes
1. Volumes Nomeados
Os volumes nomeados são criados e gerenciados pelo Docker. Eles são feitos para armazenar dados de forma duradoura, dados que precisam continuar disponíveis entre reinicializações ou remoções de containers.
Criando um volume nomeado:
docker volume create my_volume
Rodando um container com montagem de volume:
Neste exemplo, o volume my_volume
é montado no diretório /data
dentro do container my_container
. Todos os dados gravados em /data
serão salvos no volume e permanecerão acessíveis mesmo após a remoção do container.
docker run -d -v my_volume:/data --name my_container nginx
2. Volumes Anônimos
Os volumes anônimos são criados automaticamente pelo Docker e vinculados a um container específico. Eles são úteis para dados temporários que não precisam ser mantidos após a remoção do container.
Rodando um container com um volume anônimo:
Neste exemplo, o Docker criará automaticamente um volume anônimo e o montará no diretório /data
dentro do container.
docker run -d -v /data --name my_container nginx
3. Diretórios Vinculados
Os diretórios vinculados permitem montar diretórios do sistema host nos containers. Isso é prático para compartilhar dados entre containers e o sistema host. Além disso, essa abordagem é frequentemente utilizada no desenvolvimento, onde o código-fonte é armazenado no sistema host.
Rodando um container com um diretório vinculado:
Neste exemplo, o diretório /host/data
da máquina host é montado no diretório /container/data
dentro do container my_container
.
docker run -d -v /host/data:/container/data --name my_container nginx
8.3 Exemplos de Uso de Volumes
1. Salvando dados de um banco de dados
Usar volumes para bancos de dados ajuda a manter os dados mesmo quando o container é reiniciado ou atualizado. Isso é especialmente importante para a confiabilidade em ambientes de produção.
Exemplo:
Neste exemplo, os dados do PostgreSQL são salvos em um volume db_data
, garantindo que eles permaneçam mesmo se o container for reiniciado ou removido.
docker volume create db_data
docker run -d -v db_data:/var/lib/postgresql/data --name postgres_container postgres
2. Compartilhando dados entre containers
Às vezes é necessário compartilhar dados entre vários containers. Volumes tornam isso fácil.
Exemplo
Vamos criar um volume e executar dois containers que usarão esse volume. Ambos os containers terão acesso aos dados no volume shared_data
, permitindo que troquem informações.
docker volume create shared_data
docker run -d -v shared_data:/data --name container1 nginx
docker run -d -v shared_data:/data --name container2 nginx
3. Desenvolvimento e Testes
Durante o desenvolvimento de aplicativos, é conveniente usar diretórios compartilhados para permitir que o código-fonte seja usado tanto pelo container quanto pela máquina host. Isso possibilita aos desenvolvedores editar o código no host e o container trabalhar com as atualizações em tempo real.
Exemplo
Neste exemplo, o diretório /path/to/source
na máquina host é montado no diretório /app
dentro do container dev_container
. Assim, o container pode usar o código atualizado diretamente do sistema host.
docker run -d -v /path/to/source:/app --name dev_container node
8.4 Gerenciamento de volumes
O Docker fornece comandos práticos pra gerenciar volumes, o que facilita criar, deletar e visualizar informações sobre volumes.
1. Ver todos os volumes
Este comando mostra uma lista de todos os volumes disponíveis na máquina host.
docker volume ls
2. Ver informações sobre um volume
Com este comando dá pra obter detalhes sobre o volume my_volume
: sua localização no sistema de arquivos da máquina host e informações sobre os containers que estão usando esse volume.
docker volume inspect my_volume
3. Remover um volume
Este comando remove o volume my_volume
. Antes de remover, é importante garantir que o volume não está sendo usado por nenhum container, senão o comando não vai funcionar.
docker volume rm my_volume
8.5 Backup de volumes
Pra garantir a segurança dos dados, é super importante poder fazer backup dos volumes e restaurar eles caso precise.
1. Fazendo o backup do volume
Nesse exemplo, o conteúdo do volume my_volume
é arquivado no arquivo my_volume_backup.tar.gz
, que fica salvo na pasta /backup
na máquina host.
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar czf /backup/my_volume_backup.tar.gz /volume
2. Restaurando o volume
Esse exemplo restaura o conteúdo do volume my_volume
a partir de um backup que tá salvo no arquivo my_volume_backup.tar.gz
.
docker run --rm -v my_volume:/volume -v /backup:/backup busybox tar xzf /backup/my_volume_backup.tar.gz -C /volume
GO TO FULL VERSION