Como compartilhar dados entre contêineres Docker


0

Os contêineres do Docker são ambientes intencionalmente isolados. Cada contêiner tem seu próprio sistema de arquivos que não pode ser acessado diretamente por outros contêineres ou pelo seu host.

Às vezes, os contêineres podem precisar compartilhar dados. Embora você deva ter como objetivo que os contêineres sejam autossuficientes, há cenários em que o compartilhamento de dados é inevitável. Isso pode ocorrer para que um segundo contêiner possa acessar um cache combinado, usar um banco de dados com backup de arquivo, criar um backup ou realizar operações em dados gerados pelo usuário, como um contêiner otimizador de imagem que processa fotos de perfil carregadas por meio de um contêiner de servidor web separado .

Neste guia, veremos alguns métodos para passar dados entre seus contêineres do Docker. Vamos supor que você já tenha o Docker configurado e esteja familiarizado com os conceitos fundamentais, como contêineres, imagens, volumes e redes.

Usando Volumes para Compartilhar um Diretório

Os volumes são a maneira de fato de configurar o compartilhamento de dados. Eles são sistemas de arquivos independentes que armazenam seus dados fora de qualquer contêiner individual. Montar um volume em um caminho de sistema de arquivos dentro de um contêiner fornece acesso de leitura e gravação aos dados do volume.

Os volumes podem ser anexados a vários contêineres simultaneamente. Isso facilita o compartilhamento perfeito e a persistência de dados gerenciados pelo Docker.

Crie um volume para começar:

docker volume create --name shared-data
Propaganda

Em seguida, crie seus contêineres, montando o volume no caminho do sistema de arquivos esperado por cada imagem:

docker run -d -v shared-data:/data --name example example-image:latest
docker run -d -v shared-data:/backup-source --name backup backup-image:latest

Neste exemplo, o backup contêiner obterá acesso efetivo ao example containers /data diretório. Será montado como /backup-source; as alterações feitas por um dos contêineres serão refletidas no outro.

Recipientes de inicialização rápida com volumes correspondentes

O exemplo acima pode ser simplificado usando o docker run comando --volumes-frombandeira. Isso fornece um mecanismo para montar automaticamente os volumes que já são usados ​​por um contêiner existente:

docker run -d --volumes-from example --name backup backup-image:latest

Desta vez o backup recipiente irá receber o shared-data volume montado em seu /data diretório. O --volumes-from sinalizador puxa em todas as definições de volume anexadas ao example recipiente. É particularmente ideal para tarefas de backup e outros contêineres de curta duração que atuam como componentes auxiliares para seu serviço principal.

Melhorando a segurança com montagens somente leitura

Os volumes são sempre montados no modo de leitura e gravação por padrão. Todos os seus contêineres com acesso a um volume têm permissão para alterar seu conteúdo, podendo causar perda de dados não intencional.

É uma prática recomendada montar volumes compartilhados no modo somente leitura quando não se espera que um contêiner faça modificações. No exemplo acima, o backup contêiner só precisa ler o conteúdo do shared-data volume. Definir a montagem para o modo somente leitura reforça essa expectativa, evitando que bugs ou binários maliciosos na imagem excluam dados usados ​​pelo example recipiente.

docker run -d -v shared-data:/backup-source:ro --name backup backup-image:latest
Propaganda

Adicionando ro como um terceiro parâmetro separado por dois pontos para o -v sinalizador indica que o volume deve ser montado em modo somente leitura. Você também pode escrever readonly em vez de ro como uma alternativa mais explícita.

Compartilhando dados em uma rede

Você pode usar trocas de rede como uma abordagem alternativa para o compartilhamento de dados por meio de volumes do sistema de arquivos. Unir dois contêineres à mesma rede Docker permite que eles se comuniquem perfeitamente usando nomes de host atribuídos automaticamente:

docker network create demo-network
docker run -d --net demo-network --name first example-image:latest
docker run -d --net demo-network --name second another-image:latest

Aqui first será capaz de pingar second e vice versa. Seus contêineres podem executar um serviço de API HTTP, permitindo que eles interajam com os dados uns dos outros.

Continuando o exemplo de backup, agora seu backup contêiner pode fazer uma solicitação de rede para http://example:8080/backup-data para adquirir os dados para backup. O example o contêiner deve responder com um arquivo contendo todos os dados que precisam ser armazenados. O contêiner de backup é então responsável por manter o arquivo em um local de armazenamento adequado.

Impor que o compartilhamento de dados ocorra em uma rede geralmente ajuda nos esforços de desacoplamento. Você acaba com interfaces claramente definidas que não criam dependências rígidas entre os serviços. O acesso aos dados pode ser controlado com mais precisão expondo APIs para cada tipo de dados, em vez de dar a cada contêiner acesso total a um volume.

É importante considerar a segurança se você usar essa abordagem. Certifique-se de que quaisquer APIs HTTP projetadas para acesso interno por seus outros contêineres Docker não tenham portas expostas na rede de ponte do host Docker. Este é o comportamento padrão ao usar as opções de rede mostradas acima; ligando uma porta com -p 8080:8080 permitiria o acesso à API de backup por meio das interfaces de rede do seu host. Isso seria um problema de segurança.

Resumo

Os contêineres do Docker são ambientes isolados que não podem acessar os sistemas de arquivos uns dos outros. No entanto, você pode compartilhar dados criando um volume montado em todos os contêineres participantes. Usar uma rede Docker compartilhada é uma opção alternativa que fornece uma separação mais forte em cenários onde as interações diretas do sistema de arquivos não são necessárias.

Propaganda

É uma boa prática limitar as interações entre contêineres tanto quanto possível. Os casos em que você precisa de compartilhamento de dados devem ser claramente definidos para evitar o acoplamento estreito de seus serviços. Recipientes que têm uma dependência rígida de dados de outro O contêiner pode ser mais complicado de implantar e manter ao longo do tempo, corroendo os benefícios mais amplos de contêinerização e isolamento.


Like it? Share with your friends!

0

What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
0
win

0 Comments

Your email address will not be published. Required fields are marked *