Conceitos de armazenamento para contêineres
Por padrão, os contêineres do Windows usam armazenamento efêmero (espaço de trabalho) para todas as entradas e saídas. Cada contêiner tem seu próprio espaço de trabalho, onde todas as criações e gravações de arquivos são capturadas para que não escapem para o host. Quando uma instância de contêiner é excluída, todas as alterações que ocorreram no espaço de rascunho são descartadas. Quando uma nova instância de contêiner é iniciada, um novo espaço temporário é fornecido para a instância.
Armazenamento em camadas
Todos os contêineres são criados com base em imagens de contêiner. Uma imagem de contêiner é um pacote de arquivos organizados em uma pilha de camadas (conhecida como armazenamento de camadas) que reside em seu computador local ou em um registro de contêiner remoto. A imagem de contêiner consiste nos arquivos do sistema operacional de modo de usuário necessários para:
- Dar suporte ao aplicativo
- Qualquer runtime do aplicativo
- Dependências do aplicativo
- Quaisquer outros arquivos de configuração diversos de que o aplicativo precisa para ser executado corretamente
Em um ambiente Windows, as camadas são armazenadas usando CimFS e têm suporte em NTFS (New Technology File System), ReFS ou RefDisks para armazenamento em camadas. Você pode alterar onde os arquivos são armazenados usando a configuração docker-root
(ou equivalente com contêiner), mas não deve modificar nenhum arquivo nos diretórios de camada. Eles são cuidadosamente gerenciados usando o Docker (ou comandos equivalentes).
Armazenamento persistente
Você pode ter casos em que o aplicativo precisa ser capaz de persistir dados em um contêiner. Ou você pode querer armazenar arquivos em um contêiner que não foram incluídos no momento da compilação do contêiner. Você pode fornecer armazenamento persistente para seus contêineres do Windows de algumas maneiras:
- Associar montagens
- Volumes nomeados
Associar montagens
As montagens de associação permitem que um contêiner compartilhe um diretório com o host mapeando um diretório no host para um diretório dentro do contêiner. As montagens de associação serão úteis se você quiser um local para armazenar arquivos no computador local que estarão disponíveis se você reiniciar um contêiner e perder o espaço de trabalho. Ou, se você quiser compartilhar um arquivo com vários contêineres.
Se você quiser que um contêiner seja executado em vários computadores com acesso aos mesmos arquivos, será preciso usar um volume nomeado ou uma montagem SMB (Server Message Block). É importante não associar diretórios confidenciais de montagem, como C:\
em um contêiner não confiável. Essa associação permitiria que ele alterasse arquivos no host aos quais normalmente não teria acesso e poderia criar uma violação de segurança.
O exemplo a seguir mostra o comando Docker para criar uma montagem de associação à pasta C:\ContainerData
no host, para C:\data
dentro do contêiner com acesso padrão de leitura/gravação:
docker run -v c:\ContainerData:c:\data
Volumes nomeados
Os volumes nomeados permitem que você crie um volume pelo nome, atribua-o a um contêiner e reutilize-o posteriormente usando o mesmo nome. Os volumes oferecem uma maneira de criar e gerenciar um local especial no host dedicado para armazenamento de dados de contêiner. Não é necessário rastrear o caminho real de onde ele foi criado, apenas o nome.
O mecanismo do Docker no Windows tem um plug-in de volume nomeado interno que pode criar volumes no computador local. Se você quiser usar volumes nomeados em vários computadores, outro plug-in será necessário.
O exemplo a seguir mostra os comandos Docker para criar e iniciar um contêiner chamado mycontainer que é mapeado para o volume c:data
local:
docker volume create myvolume
docker run -v myvolume:c:\data microsoft/windowsservercore
Embora as montagens de associação dependam da estrutura do diretório e do sistema operacional (SO) do computador host, o Docker gerencia completamente os volumes. Os volumes têm várias vantagens em relação às montagens de associação:
- Os volumes são mais fáceis de fazer backup ou migrar do que as montagens de associação.
- Você pode gerenciar volumes usando comandos da CLI do Docker ou a API do Docker.
- Os volumes funcionam em contêineres Linux e Windows.
- Os volumes podem ser compartilhados entre vários contêineres com mais segurança.
- Os drivers de volume permitem armazenar volumes em hosts remotos ou provedores de nuvem, criptografar o conteúdo de volumes ou adicionar outras funcionalidades.
- Novos volumes podem ter seu conteúdo pré-preenchido por um contêiner.
Além disso, os volumes geralmente são uma escolha melhor do que a persistência de dados na camada gravável de um contêiner (espaço de trabalho). Um volume não aumenta o tamanho dos contêineres que o usam (assim como a montagem de associação) e o conteúdo do volume existe fora do ciclo de vida de um determinado contêiner.