Header Ads

Como lidar com a persistência e o armazenamento do Docker Container

O Docker é um serviço de contêiner, projetado para executar aplicativos em seu próprio ambiente em qualquer sistema. Ele é destinado a ser independente de plataforma, mas se você precisar armazenar dados em um disco, isso pode ser feito com montagens de volume e ligação.

Use um banco de dados externo ou armazenamento de objetos

Este é o método que a maioria das pessoas recomendará. O armazenamento do estado como um arquivo no disco não está alinhado com o modelo do Docker e, embora possa ser feito, é sempre melhor considerar o que você realmente precisa considerar.

Por exemplo, digamos que você esteja executando um aplicativo Web no Docker que precisa armazenar dados em um banco de dados. Não faz muito sentido executar o MySQL em um contêiner Docker; portanto, você deve implantar o MySQL no RDS ou EC2 e fazer com que o contêiner Docker se conecte diretamente a ele. O contêiner do Docker é totalmente sem estado, como deve ser; ele pode ser parado, iniciado ou atingido com uma marreta e uma nova pode ser ativada em seu lugar, tudo sem perda de dados. Com as permissões do IAM, isso pode ser realizado com segurança, inteiramente dentro da sua VPC.

Se você realmente precisa armazenar arquivos, como fotos e vídeos enviados por usuários, deve usar o Serviço de Armazenamento Simples (S3) da AWS. É muito mais barato que o armazenamento baseado em EBS e muito mais barato em comparação com o armazenamento EFS, que é sua principal escolha para um sistema de arquivos compartilhado para contêineres ECS. Em vez de armazenar um arquivo no disco, você faz o upload diretamente para o S3. Esse método também permite que você execute processamento adicional usando as funções do Lambda no conteúdo carregado, como compactação de imagens ou vídeo, o que pode economizar muito em custos de largura de banda.

Solução simples: monte uma unidade em um contêiner

O Docker tem duas maneiras de obter persistência: montagens de volume e montagens de ligação. As montagens de ligação permitem montar um local específico no sistema de arquivos do servidor em um local dentro do contêiner do Docker. Esse link pode ser somente leitura, mas também leitura / gravação, onde os arquivos gravados pelo contêiner do Docker persistirão no disco.

Você pode vincular diretórios de host individuais a diretórios de destino no contêiner do Docker, o que é útil, mas o método recomendado é criar um novo “ volume, ” gerenciado por Docker. Isso facilita o backup, a transferência e o compartilhamento de volumes entre diferentes instâncias de contêineres.

Uma palavra de cautela: se você não tem acesso direto ao servidor, está executando o Docker, como é o caso de implantações gerenciadas, como o Serviço Elástico de Recipientes (ECS) da AWS e Kubernetes, você vai querer ter cuidado com isso. Ele está vinculado ao espaço em disco do servidor, que geralmente é efêmero. Você desejará usar um armazenamento de arquivos externo como o EFS para obter persistência real com o ECS (mais sobre isso mais tarde).

No entanto, montagens de ligação e volume funcionam bem se você estiver simplesmente usando o Docker para executar uma instalação fácil de um aplicativo em seu servidor ou apenas desejar uma persistência rápida para fins de teste. De qualquer forma, o método de criação de volumes será o mesmo, independentemente de onde você os estiver armazenando.

Você pode criar um novo volume na linha de comando com:

O volume da janela de encaixe

 cria o nginx-config 

E quando você executar o contêiner do Docker, vincule-o ao destino no contêiner com o sinalizador --mount:

Janela de encaixe

 execute -d \ --name devtest \ - monte origem = nginx-config, destino = / etc / nginx \ nginx: mais recente 

Se você executar o docker, inspecione < name & gt ;, você verá o volume listado na seção Montagens.

Se você estiver usando o Docker Compose, a configuração também será fácil. Simplesmente adicione uma entrada de volumes para cada serviço de contêiner que você possui e, em seguida, mapeie um nome de volume para um local no convidado. Você também precisará fornecer uma lista de volumes em uma chave de volumes de nível superior para o Compose fornecer.

 versão: "3.0" serviços: web: imagem: nginx: portas mais recentes: - "80:80" volumes: - nginx-config: / etc / nginx / volumes: nginx-config: 

Isso criará o volume automaticamente para esta composição. Se você deseja usar um volume pré-fabricado de fora do Compose, especifique external: true na configuração do volume:

volumes

: conteúdo cms: externo: verdadeiro 

Se você preferir simplesmente montar uma ligação e não se preocupar com volumes, basta digitar um nome de caminho no lugar do nome do volume e renunciar a definir os nomes dos volumes.

 versão: "3.0" serviços: web: imagem: nginx: portas mais recentes: - "80:80" volumes: - / docker / nginx-config /: / etc / nginx / 

Você pode ler a documentação completa do Docker sobre o uso de volumes com o Compose se o seu caso de uso exigir algo mais específico que isso.

Para implantações gerenciadas, use um sistema de arquivos compartilhados (AWS EFS)

Se você estiver implantando no AWS ECS, não poderá usar uma montagem normal de volume ou ligação, porque depois de desligar o contêiner, provavelmente não estará executando no mesma máquina na próxima vez em que for inicializada, derrotando o objetivo da persistência.

No entanto, você ainda pode obter persistência usando outro serviço da AWS - Elastic File System (EFS). O EFS é um sistema de arquivos de rede compartilhado. Você pode montá-lo em vários servidores EC2 e os dados acessados ​​serão sincronizados em todos eles. Por exemplo, você pode usar isso para hospedar o conteúdo e o código estáticos do seu site e, em seguida, executar todos os nós dos trabalhadores no ECS para lidar com a veiculação real do seu conteúdo. Isso contorna a restrição de não armazenar dados no disco, porque a montagem do volume está vinculada a uma unidade externa que persiste nas implantações do ECS.

Para configurar isso, você precisará criar um sistema de arquivos EFS. Isso é bastante simples e pode ser feito no EFS Management Console, mas você desejará anotar o ID do volume, pois precisará dele para trabalhar com o volume.

Se você precisar adicionar ou alterar manualmente os arquivos no seu volume EFS, poderá montá-lo em qualquer instância do EC2. Você precisará instalar o amazon-efs-utils:

 sudo yum install -y amazon-efs-utils 

E monte-o com o seguinte comando, usando o ID:

 sudo mount -t efs fs-12345678: / / mnt / efs 

Dessa forma, você pode visualizar e editar diretamente o conteúdo do seu volume EFS como se fosse outro HDD no seu servidor. Você quer ter certeza de que o nfs-utils está instalado para que tudo funcione corretamente.

Em seguida, você precisará conectar o ECS a este volume. Crie uma nova definição de tarefa no ECS Management Console. Role até a parte inferior e selecione "Configurar via JSON". Em seguida, substitua os volumes vazios ” chave com o seguinte JSON, adicionando a família “ ” chave no final:

 "volumes": [{"nome": "efs-demo", "host": nulo, "dockerVolumeConfiguration": {"autoprovision": true, "labels": null, "scope": " shared "," driver ":" local "," driverOpts ": {" type ":" nfs "," device ":": / "," o ":" addr = fs-XXXXXX. efs. us-east- 1. amazonaws. com, nfsvers = 4.1, rsize = 1048576, wsize = 1048576, rígido, timeo = 600, retrans = 2, noresvport "}}}]," família ":" nginx ", 

Substitua fs-XXXXXX. efs. us-east-1. amazonaws. com pelo endereço real do seu volume EFS. Você deve ver um novo volume:

Você pode usar isso na sua definição de contêiner como um ponto de montagem. Selecione "Adicionar contêiner" ” (ou edite um existente) e, em "Armazenamento e registro", ” selecione o volume recém-criado e especifique um caminho de contêiner.

Salve a definição da tarefa e, ao iniciar um cluster com essa nova definição, todos os contêineres poderão acessar seu sistema de arquivos compartilhado.

Via: How to Geek

Nenhum comentário