Conceitos de armazenamento para contêineres
Por padrão, os contêineres do Windows usam armazenamento efêmero (espaço de rascunho) para todas as entradas e saídas. Cada contêiner tem seu próprio espaço de rascunho, onde toda a criação e gravação 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 de trabalho é fornecido para a instância.
Armazenamento em camadas
Todos os contêineres são criados a partir de 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 sua máquina 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:
- Ofereça suporte ao seu aplicativo
- Qualquer tempo de execução do aplicativo
- Dependências do seu aplicativo
- Quaisquer outros arquivos de configuração diversos que seu aplicativo precisa para ser executado corretamente
Em um ambiente Windows, as camadas são armazenadas usando CimFS e são suportadas em NTFS (New Technology File System), ReFS ou RefDisks para armazenamento em camadas. Você pode alterar onde os arquivos são armazenados usando a docker-root
configuração (ou equivalente com contêiner), mas não deve modificar nenhum arquivo nos diretórios de camada. Eles são cuidadosamente gerenciados usando docker (ou comandos equivalentes).
Armazenamento persistente
Você pode ter casos em que seu aplicativo precisa ser capaz de persistir dados em um contêiner. Ou talvez você queira armazenar arquivos em um contêiner que não foram incluídos no tempo de compilação do contêiner. Você pode fornecer armazenamento persistente aos contêineres do Windows de algumas maneiras:
- Suportes de ligação
- Volumes nomeados
Suportes de ligação
As montagens de ligaçã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 ligação são úteis se você quiser um local para armazenar arquivos na máquina local que estejam 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.
No entanto, se você quiser que um contêiner seja executado em várias máquinas com acesso aos mesmos arquivos, um volume nomeado ou uma montagem SMB (Server Message Block) deve ser usada. É importante que você não vincule diretórios confidenciais de montagem, como C:\
em um contêiner não confiável. Essa associação permitiria alterar 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 ligação para a pasta C:\ContainerData
no host, para C:\data
dentro do contêiner com acesso de leitura/gravação padrão:
docker run -v c:\ContainerData:c:\data
Volumes nomeados
Os volumes nomeados permitem criar um volume por nome, atribuí-lo a um contêiner e reutilizá-lo posteriormente com o mesmo nome. Os volumes oferecem uma maneira de criar e gerenciar um local especial no host dedicado ao armazenamento de dados de contêiner. Você não precisa acompanhar o caminho real de onde ele foi criado, apenas o nome.
O mecanismo Docker no Windows tem um plug-in de volume nomeado interno que pode criar volumes na máquina local. Se você quiser usar volumes nomeados em várias máquinas, outro plug-in é 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
Enquanto as montagens de ligação dependem da estrutura de diretórios e do sistema operacional (SO) da máquina host, o Docker gerencia completamente os volumes. Os volumes têm várias vantagens em relação aos suportes de ligação:
- Os volumes são mais fáceis de fazer backup ou migrar do que as montagens de ligação.
- Você pode gerenciar volumes usando os 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 rascunho). Um volume não aumenta o tamanho dos contêineres que o usam (assim como bind mount), e o conteúdo do volume existe fora do ciclo de vida de um determinado contêiner.