Voltar ao blog

Compartilhamento de Dados entre Contêineres Docker

Compartilhamento de Dados entre Contêineres Docker

Introdução

Docker é uma plataforma de contêineres que consiste em um ambiente padronizado, leve, virtualizado, portátil e definido por software que permite que o software seja executado de forma isolada de outros softwares em execução na máquina hospedeira física. O Docker é um componente definidor do aspecto de Desenvolvimento e Integração Contínuos do Desenvolvimento de Software. Ao fornecer um ambiente de execução consistente, o Docker garante que o software se comporte da mesma forma, independentemente da máquina hospedeira física na qual é implantado. Para uma visão geral completa do ecossistema Docker, confira este artigo.

Embora os contêineres Docker sejam autônomos, às vezes eles precisam compartilhar o acesso a dados ou persistir dados no disco após a interrupção do contêiner. Os dados podem estar na forma de bancos de dados, arquivos de log ou dados gerados pelo usuário. É impossível incluir tais dados em um arquivo de configuração de imagem Docker, mas eles precisam estar disponíveis para que sua aplicação funcione conforme o esperado. O compartilhamento e a persistência de dados em contêineres Docker são gerenciados por Volumes do Docker. Os Volumes do Docker podem ser criados durante a criação do contêiner ou criados posteriormente e anexados aos contêineres. Neste tutorial, discutiremos as quatro maneiras diferentes de compartilhar dados entre contêineres.

Pré-requisitos

Observe que, embora estejamos trabalhando com o Ubuntu 20.04, as instruções e comandos do Docker funcionarão em qualquer outro sistema operacional com o Docker instalado e o usuário sudo adicionado ao grupo docker, conforme explicado nos pré-requisitos acima.

Etapa 1: Criar Volumes do Docker Independentes

Começaremos criando volumes independentes que não estão relacionados a nenhum contêiner Docker. Para conseguir isso, temos o comando docker volume create que foi introduzido na versão 1.9 do Docker. Insira o seguinte comando para criar um volume chamado Step1DataVolume :

Você deve ver a seguinte saída indicando que a criação do volume foi bem-sucedida:

Docker Volume Create

Agora que temos um volume independente, podemos criar um novo contêiner a partir da imagem oficial do Ubuntu como exemplo para utilizá-lo. Insira o seguinte comando para criar o contêiner e anexar o volume:

Neste comando, a flag --rm excluirá automaticamente o contêiner após a saída. A flag -v é usada para especificar e montar o volume. A flag -v recebe o nome do volume, dois-pontos e o caminho absoluto dentro do contêiner onde o volume deve aparecer. Tenha em mente que, quando o comando for executado, se os diretórios especificados no caminho não existirem, eles serão criados. Se já existirem, o volume montado ocultará o conteúdo existente. Para a flag -ti, o -t dá acesso ao terminal, e o -i permite interagir com o contêiner através do terminal.

Enquanto estiver dentro do contêiner, execute o seguinte comando para gravar alguns dados no volume:

Digite exit e pressione enter para sair do contêiner. Como explicado, o contêiner é excluído automaticamente quando você sai, graças à flag --rm , no entanto, o volume ainda estará acessível.

Para verificar se o volume ainda existe, você pode usar o comando docker volume inspect comando:

Você deve ver a seguinte saída:

Docker Volume Inspect

Em seguida, vamos criar um novo contêiner. Primeiro, anexe o volume e veja se conseguimos acessar o texto que criamos no contêiner anterior. Insira o seguinte comando para criar e executar o contêiner usando a flag ubuntu imagem:

Dentro do container, execute o seguinte comando para verificar se o StepOne.txt arquivo existe:

Você deve ver uma saída semelhante:

Docker Volume Content 1

Em seguida, digite exit e pressione enter para sair do container. Nesta etapa, você aprendeu como lidar com a persistência de dados usando volumes independentes do Docker e como anexar volumes a containers.

Etapa 2: Criando um Volume Docker que Persiste Dados ao Excluir um Container

Nesta etapa, usaremos um único comando para criar um volume ao mesmo tempo em que criamos um container. Em seguida, excluiremos o container e anexaremos o volume a um novo container. O comando é semelhante ao usado na Etapa 1, no entanto, adicionamos uma flag --name, para especificar um nome para o container:

Enquanto estiver dentro do container, insira o seguinte comando para gravar dados no volume e verificar se os dados estão lá:

Abaixo está a saída dos três comandos:

Persistent Docker Volume

Em seguida, saia do container. Quando você reiniciar o container usando o seguinte comando, o volume será anexado automaticamente:

Dentro do container, verifique se o volume está montado checando a existência do arquivo StepTwo.txt usando o comando:

Aqui está a saída:

Docker Volume After Restart

Você pode sair do container agora. O Docker impede a remoção de um volume que outro container referencia. Você pode tentar remover o volume usando o comando:

Você deve ver a mensagem de erro na saída:

Error Response

Vamos remover o container usando o id do container mostrado na saída com o comando docker rm:

Substitua o container id destacado pelo id do seu container mostrado no seu terminal. O comando remove o container, mas não remove o volume que criamos. Você pode listar os volumes disponíveis usando o comando docker volume ls para verificar:

Aqui está a saída:

Docker Volume List

Para remover o container criado na Etapa 2, insira o seguinte comando:

Nesta etapa, você conseguiu criar um volume Docker ao mesmo tempo em que criava um container. Vamos ver como podemos criar um volume a partir de um diretório existente com dados.

Etapa 3: Criando um Volume Docker a partir de um Diretório Existente com Dados

Se você quiser copiar dados para um volume, você pode criar um volume enquanto cria um container e fornecer o caminho para um diretório que contém os dados na imagem base. No comando abaixo, criamos um container e adicionamos um volume de dados em /var, que é um diretório contendo dados na imagem base:

Quando o comando for executado, o conteúdo do diretório /var da imagem base será copiado para o volume. O volume pode ser anexado a um novo container. Em seguida, saia do container:

Create Docker Volume

Insira o seguinte comando para criar o container, anexar o volume e listar o conteúdo do volume usando o comando ls:

Você deve ver uma saída semelhante do comando, que é uma cópia do conteúdo do diretório /var da imagem base agora disponível no Step3DataVolume:

Copy Docker Volume

Embora a montagem do /var diretório como fizemos neste exemplo possa ser impraticável, isso nos ajuda a entender que você pode montar qualquer diretório criado em suas imagens personalizadas em um volume Docker para disponibilizar os dados para outros contêineres.

Passo 4: Compartilhando dados entre múltiplos contêineres Docker

Na maioria dos casos, você desejará que múltiplos contêineres acessem dados de um único volume Docker. Nos exemplos anteriores, apenas anexamos um volume a um contêiner. Agora, você aprenderá como anexar um volume a múltiplos contêineres. Embora você possa conseguir isso facilmente, o Docker não lida com o bloqueio de arquivos. Para múltiplos contêineres gravando no mesmo volume, você deve projetar individualmente as aplicações executadas nesses contêineres para lidar com a gravação em armazenamentos de dados compartilhados para evitar a corrupção de dados.

  • Crie Step4Container1 e Step4DataVolume

Use o docker run comando com a --name flag para criar um contêiner nomeado:

Dentro do contêiner, execute o seguinte comando para criar um arquivo de texto e adicionar algum texto:

Depois disso, saia do contêiner e volte para o ambiente host. Agora, queremos criar outro contêiner e montar os volumes de Step4Container1 nele.

  • Crie Step4Container2 e anexe os volumes do contêiner Step4Container1

Execute o seguinte comando para criar Step4Container2 e montar volumes de Step4Container1:

Dentro do contêiner, use o cat comando para verificar a persistência de dados:

Você deve ver a seguinte saída:

Container Data Sharing

Podemos anexar mais algum texto ao arquivo a partir do Step4Container2 inserindo o seguinte comando:

Saia do contêiner depois disso e voltaremos para o Step4Container1 para verificar se os dados ainda estão presentes.

  • Verificar as alterações feitas no volume Docker entre diferentes contêineres

Para visualizar as alterações, primeiro você reiniciará o Step4Container1 usando o comando:

Verifique as alterações usando o comando:

Você deve ver uma saída semelhante à captura de tela abaixo:

Copied Container Data

Depois de verificar que ambos os contêineres podem ler e gravar dados no mesmo volume, você pode sair do contêiner. Como mencionado, o Docker não lida com o bloqueio de arquivos, é o trabalho da lógica da sua aplicação em execução dentro dos contêineres que deve lidar com o acesso de leitura e gravação a armazenamentos de dados compartilhados. O Docker permite montar volumes como somente leitura para evitar a corrupção acidental de dados por contêineres que requerem apenas acesso de somente leitura, adicionando :ro como mostrado no próximo exemplo.

  • Montando um volume em um contêiner Docker como somente leitura

Para este exemplo, criaremos um contêiner chamado Step4Container3. No comando de criação, montamos volumes de Step4Container1 e adicionamos :ro para especificar que este contêiner tem acesso de somente leitura, mas não pode gravar no volume. Execute the following command in your terminal:

Uma vez dentro do contêiner, você pode ler o arquivo de texto no volume inserindo o seguinte comando:

Read Only Mount

No entanto, se você tentar remover o arquivo usando o comando:

Você receberá uma mensagem de erro no seu terminal como:

Read Only Error

Depois de verificar as permissões de leitura e escrita, você pode sair do contêiner. Se desejar limpar os contêineres e o volume criados neste tutorial, execute os seguintes comandos:

Nesta etapa, você aprendeu como compartilhar dados entre múltiplos contêineres usando volumes Docker, bem como montar volumes de dados em contêineres como somente leitura.

Conclusão

Neste tutorial, você criou alguns volumes Docker e aprendeu como compartilhar dados entre contêineres Docker. Ao lidar com o compartilhamento de dados entre contêineres, observamos que a lógica de aplicação individual dentro do contêiner deve lidar com o bloqueio de arquivos para evitar a corrupção de dados ao gravar em armazenamentos de dados compartilhados, já que o Docker não possui implementação para lidar com o bloqueio de arquivos.

Para mais recursos sobre a utilização do Docker, você pode querer conferir mais tutoriais em nosso blog:

Boa computação!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev é um designer criativo na CloudSigma, focado na construção de uma identidade empresarial consistente por meio de canais de marketing tradicionais e inovadores. Ele é hábil em combinar a visão artística com o marketing estratégico para criar narrativas de marca impactantes.

Comentários

Nenhum comentário ainda. Seja o primeiro.