Quando um contêiner Docker é destruído, a criação de um novo contêiner a partir da imagem Docker existente faz isso sem fazer nenhuma alteração no contêiner original. Portanto, você perderá dados sempre que destruir um contêiner e criar um novo.
Para evitar a perda de dados, o Docker fornece volumes e montagens de ligação, dois mecanismos para persistir dados em seu contêiner do Docker. Neste tutorial, vamos examinar volumes e montagens de ligação antes de olhar alguns exemplos e casos de uso para cada um.
Vamos começar!
Unir montagens
Bind mounts estão disponíveis no Docker desde os primeiros dias para a persistência de dados. As montagens de vinculação montam um arquivo ou diretório em seu contêiner a partir de sua máquina host, que você pode fazer referência por meio de seu caminho absoluto.
Para usar montagens de ligação, o arquivo ou diretório não precisa existir no seu host Docker. Se não existir, será criado sob demanda. As montagens do Bind dependem do sistema de arquivos da máquina host com uma estrutura de diretório específica disponível. Você deve criar explicitamente um caminho para o arquivo ou pasta para colocar o armazenamento.
Outra informação importante sobre os bind mounts é que eles dão acesso a arquivos confidenciais. De acordo com os documentos do Docker, você pode alterar o sistema de arquivos do host por meio de processos executados em um contêiner. Isso inclui a criação, modificação e exclusão de arquivos e diretórios do sistema, o que pode ter implicações de segurança bastante graves. Pode até afetar processos não Docker.
Primeiros passos usando montagens de ligação
Para usar montagens de ligação em um contêiner, você tem duas opções de sinalização para usar, --mount
e -v
. A diferença mais notável entre as duas opções é que --mount
é mais detalhado e explícito, enquanto -v
é mais uma abreviação de --mount . Ele combina todas as opções que você passa para
--mount
em um campo.
Superficialmente, os dois comandos criam um contêiner PostgreSQL e definem um volume para persistir os dados. No entanto, existem alguns cenários em que a diferença entre o uso de --mount
e -v
será notavelmente diferente. Por exemplo, é uma prática recomendada usar --mount
ao trabalhar com serviços porque você precisará especificar mais opções do que é possível com -v
.
Especifique a montagem de ligação usando o sinalizador --mount
executando:
docker run--rm--name postgres-db-e POSTGRES_PASSWORD=senha--mount type=bind, source="$ pwd", target=/var/lib/postgresql/data-p 2000: 5432-d postgres
Use este código para especificá-lo com o sinalizador -v
:
docker run--rm--name postgres-db-e POSTGRES_PASSWORD=senha--v"$ pwd":/var/lib/postgresql/data-p 2000: 5432-d postgres
Observe que, em ambos os casos, especificamos $ pwd
, o diretório de trabalho, como a fonte. Basicamente, estamos dizendo ao Docker para criar a montagem de ligação no diretório em que estamos atualmente.
Volumes Docker
Volumes são um ótimo mecanismo para adicionar uma camada de persistência de dados em seus contêineres do Docker, especialmente para uma situação em que você precisa manter os dados após encerrar seus contêineres.
Os volumes do Docker são completamente gerenciados pelo próprio Docker e, portanto, independentes de sua estrutura de diretório e do sistema operacional da máquina host. Quando você usa um volume, um novo diretório é criado dentro do diretório de armazenamento do Docker na máquina host, e o Docker gerencia o conteúdo desse diretório.
Benefícios do uso de volumes
Em volumes Docker, o armazenamento não é acoplado ao ciclo de vida do contêiner, mas existe fora dele. Isso traz muitos benefícios. Por um lado, você pode matar seu contêiner quantas vezes quiser e ainda ter seus dados persistentes. Também é fácil reutilizar o armazenamento em vários contêineres; por exemplo, um contêiner grava no armazenamento enquanto outro lê dele.
Como os volumes não estão vinculados a nenhum contêiner, você pode anexá-los facilmente a vários contêineres em execução ao mesmo tempo. Você também descobrirá que os volumes não aumentam o tamanho do contêiner do Docker ao usá-los. Por último, você pode usar a Docker CLI para gerenciar volumes, por exemplo, recuperando a lista de volumes ou removendo volumes não usados.
Primeiros passos usando volumes
Agora, vamos ver um exemplo!
Digamos que você deseja criar um contêiner PostgreSQL e está interessado em manter os dados. Comece com uma pasta chamada postgres
em $ HOME/docker/volumes/postgres
.
Assim como as montagens de ligação, podemos adicionar o seguinte código para especificar esse volume usando a sinalização --mount
:
docker run--rm--name postgres-db-e POSTGRES_PASSWORD=senha--mount type=volume, source=$ HOME/docker/volumes/postgres, target=/var/lib/postgresql/data-p 2000: 5432-d postgres
Como alternativa, aqui está o mesmo comando usando a sinalização abreviada -v
:
docker run--rm--name postgres-db-e POSTGRES_PASSWORD=senha--v $ HOME/docker/volumes/postgres:/var/lib/postgresql/data-p 2000: 5432-d postgres
Você deve armazenar os dados em $ HOME/docker/volumes/
se estiver usando Mac ou Linux, e em C: \ ProgramData \ docker \ volumes
se você está no Windows. Caso contrário, o Docker não tratará ou gerenciará seus dados como um volume.
Casos de uso
Ao decidir quando usar volumes ou montagens de ligação, existem alguns fatores importantes a serem considerados. Se você deseja que seu armazenamento ou camada persistente seja totalmente gerenciado pelo Docker e acessado apenas por meio de contêineres do Docker e da CLI do Docker, você deve escolher usar volumes.
No entanto, se você precisa de controle total do armazenamento e planeja permitir que outros processos além do Docker acessem ou modifiquem a camada de armazenamento, as montagens de ligação são a ferramenta certa para o trabalho.
Comparar volumes e montagens de ligação
De acordo com a documentação do Docker, usar volumes é a maneira mais fácil de começar a persistir dados em seu contêiner do Docker. Em geral, as montagens de bind são mais limitadas em comparação.
Esse insight não é nenhuma surpresa com base no que vimos até agora. Uma boa regra prática é que, se você estiver em dúvida sobre qual caminho seguir para persistir os dados em seus contêineres do Docker, use volumes.
Um dos principais diferenciais de uma montagem de ligação é que uma montagem de ligação pode ser acessada e modificada por processos fora do Docker. Conforme mencionado anteriormente, isso pode ser uma vantagem quando você deseja integrar o Docker a outros processos, mas também pode causar uma dor de cabeça se você estiver preocupado com a segurança.
Conclusão
Agora que vimos as principais diferenças entre volumes e montagens de ligação, vamos revisar algumas vantagens que tornam os volumes o mecanismo recomendado para dados persistentes no Docker.
Por um lado, os volumes são compartilhados com mais segurança entre os contêineres; eles só podem ser especificados em um único diretório ( $ HOME/docker/volumes
) e são totalmente gerenciados pelo próprio Docker. Você também pode armazenar volumes fora de sua máquina host em hosts remotos ou provedores de nuvem.
Você pode gerenciar os volumes usando o Docker CLI e a Docker API e pode preencher previamente o conteúdo de um novo volume a partir de um contêiner. Além disso, os volumes funcionam no Linux e no Windows, tornando-o perfeito para equipes que usam os dois sistemas operacionais.
Tendo investigado os volumes e montagens de ligação, vimos que os volumes são a melhor opção para dados persistentes com mais frequência do que não. Não se esqueça de me informar qual método você prefere nos comentários!
A postagem Volumes Docker vs. montagens de ligação apareceu primeiro em LogRocket Blog .