Diferenças entre volume e bind mount no Docker
O Docker fornece aos containers diversas formas de gerenciamento de dados. Temos o Volume e o Bind Mount, veja as vantagens e desvantagens de cada um.
Existem algumas diferenças entre o Volume e o Bind Mount no armazenamento de arquivos na máquina hospedeira. Entretanto, elas possuem algo em comum, a persistência dos dados mesmo após os containers serem parados.
Escolhendo o tipo correto de montagem
Antes mais nada, entenda que independente do tipo de montagem, para o container os dados serão vistos da mesma forma, seja ele um arquivo ou um diretório.
No caso do Volume, um espaço gerido pelo Docker na host machine é utilizado para o armazenamento das informações. Portanto, nenhum outro processo do sistema deve poder modificá-lo.
Já com o Bind Mount a coisa é diferente, pois, por se tratar de uma alocação no próprio sistema de arquivos do hospedeiro, qualquer um pode modificá-lo.
Volumes
Como falamos anteriormente, são criados e gerenciados pelo Docker. Entretanto, nada impede que criemos nossos próprios volumes utilizando o comando docker volume create
.
Quando criamos um volume, o Docker armazena os dados em um diretório na sua área gerenciada no host. Assim, quando montarmos ele dentro de algum container, será esse mesmo diretório que montado.
É interessante notar que um volume poderá ser utilizado por vários containers simultaneamente. E, quando nenhum container estiver mais utilizando-o, ele ainda estará disponível para ser montado, pois o Docker não remove os volumes automaticamente.
Para sabermos todos os volumes criados, basta rodar o comando docker volume ls
.
Se for necessário, podemos remover o volume com o seguinte comando docker volume rm
.
Bind Mounts
Apesar de já estarem disponíveis há bastante tempo, o bind mounts são mais limitados que os volumes.
O bind mount realiza a montagem de um arquivo/diretório diretamente do host para o container. Por isso, a montagem é referenciada pelo seu caminho completo no hospedeiro.
Embora seja uma opção com bom desempenho, ela conta com a mesma estrutura do sistema de arquivos (FAT, NTFS, EXT…) do host.
Além do que, algumas questões de segurança devem ser pensadas, já que um container poderá ter acesso a arquivos e diretórios sensíveis na máquina hospedeira.
Montagem do volume e bind mount
A montagem de um volume e bind mount são bem parecidas e são feitas utilizado o -v
ou --volume
.
Quando utilizar Volumes
A recomendação encontrada na própria documentação do Docker é para, preferencialmente, usarmos o volume nos containers e serviços.
Alguns cenários onde o volumes são bem vindos:
- Compartilhamento de dados entre múltiplos containers
- O acesso ao sistema de arquivos do hospedeiro não é garantido e/ou mais custoso
- O armazenamento não é local, os dados estarão num host remoto ou até mesmo na nuvem.
- Quando é preciso fazer um backup, uma restauração ou migrar dados entre hospedeiros Docker.
Quando utilizar Bind Mounts
Ainda que os volumes sejam mais indicados, em alguns casos os bind mounts são uma boa opção, tais como:
- Compartilhamento de arquivos de configurações entre o hospedeiro e os containers.
- Quando o compartilhamento de código fonte e/ou de artefatos de build entre o hospedeiro e os containers.
- Se o sistema de arquivos é garantidamente consistente com o que exige os bind mounts do container.
Comente e tire quaisquer dúvidas abaixo. Até mais!
Ótimo texto. Bem explicado a diferença entre volume e mount.
Estou fazendo um blog de anotações e futuramente vou fazer um texto sobre isso e e te referenciar.
Olá, Gabriel.
Obrigado.
Quando publicar me avise, vamos trocar uns posts. Até mais.