docker-volumes vs montagem Liga. quais são os casos de uso?

Depois de ler e brincar com o docker por um curto período de tempo, estou pensando em usá-lo em meu ambiente de produção. No entanto, ainda estou tentando entender a diferença entre mount binds e volumes.

De acordo com a documentação do Dockers no mount binds (https://docs.docker.com/storage/bind-mounts/):

As montagens de ligação existem desde os primeiros dias do Docker. As montagens de ligação têm funcionalidade limitada em comparação com os volumes. Quando você usa uma montagem de ligação, um arquivo ou diretório na máquina host é montado em um contêiner. O arquivo ou diretório é referenciado por seu caminho completo ou relativo na máquina host. Por outro lado, quando você usa um volume, um novo diretório é criado no diretório de armazenamento do Docker na máquina host e o Docker gerencia o conteúdo desse diretório.

A partir disso (e de brincar), parece-me que mount binds e volumes são a mesma coisa, a única diferença é a localização dos dados. (volumes armazenados na área de armazenamento "privada" do docker, enquanto as ligações de montagem podem ser armazenadas em qualquer lugar). Sim, o mount bind deve existir antes de iniciar o contêiner docker, enquanto os volumes podem ser criados pelo mecanismo docker quando o contêiner é iniciado - mas essa diferença é irreverente em termos de desempenho ou manutenção.

Não consegui entender os supostamente benefícios dos volumes declarados pela documentação (https://docs.docker.com/storage/volumes/) como todos eles parecem se aplicar ao monte Liga da mesma forma.

Alguém pode explicar as principais diferenças entre volumes e Mount-binds (desempenho e manutenção) e, o mais importante, seus casos de uso?

obrigado pela ajuda.

Por padrão, um volume nomeado local é exatamente como você descreve, uma montagem de ligação a um diretório docker especial. As diferenças que vejo:

  • Primeiro, o grande é uma diferença de comportamento entre volumes nomeados e volumes de host (também conhecido como montagens bind). O Docker inicializará um volume nomeado a partir do conteúdo da imagem. Isso inclui os proprietários de arquivos e permissões. Isso significa que você pode evitar se preocupar com problemas de permissão que são comumente encontrados com volumes de host.

  • Em segundo lugar, portabilidade. Volumes nomeados podem ser usados de diferentes hosts docker sem se preocupar com os caminhos locais do sistema de arquivos ou com o usuário executando os comandos. Seja em um laptop MacOS ou em um servidor Linux em produção, você pode apenas nomear um volume e assumir que ele funcionará como parte da instalação padrão do docker.

  • Terceiro, como eles são gerenciados. Os volumes de Host são comumente gerenciados fora do docker, que é onde os problemas de permissão geralmente entram em jogo (já que UID/GID no host geralmente não corresponde ao UID/GID dentro do contêiner). Com volumes nomeados, você os gerenciaria de dentro de outro contêiner do docker, onde você pode controlar quais ferramentas estão instaladas, usuários criados, etc.

Há também outra grande diferença com volumes nomeados. Isso é porque eu disse "por padrão" acima, e um volume nomeado pode ser configurado de algumas maneiras. O driver de volume pode ser alterado para outro que esteja ciente da nuvem. Ou você pode passar opções para o driver de volume local para mudar da montagem de ligação local para um diretório específico para qualquer coisa que você possa fazer com o Mount syscall. Isso inclui a execução de uma montagem bind em um diretório diferente, uma montagem NFS, e você pode até criar seu próprio sistema de arquivos de sobreposição como um volume para permitir que os contêineres acessem e modifiquem alguns dados dentro do contêiner sem alterar os arquivos subjacentes em uma camada base.

Ao usar volumes nomeados, você também pode separar o gerenciamento do armazenamento do gerenciamento dos contêineres. Você simplesmente aponta para o nome e uma ferramenta externa pode criar esse volume para apontar para o local apropriado nesse ambiente.

Alguns exemplos de volumes nomeados que usei com o driver de volume local incluem:

# named bind mount$ docker volume create --driver local \      --opt type=none \      --opt device=/home/user/test \      --opt o=bind \      test_vol# nfs$ docker volume create --driver local \      --opt type=nfs \      --opt o=nfsvers=4,addr=nfs.example.com,rw \      --opt device=:/path/to/dir \      foo# overlay$ docker volume create --driver local --opt type=overlay \    --opt o=lowerdir=${PWD}/ro-data,upperdir=${PWD}/upper1,workdir=${PWD}/work1 \    --opt device=overlay overlay1