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
- Configure um servidor executando o Ubuntu 20.04 e Crie um usuário não-root com privilégios sudo. Faça login com o usuário não-root para prosseguir com as etapas a seguir.
- Instale o Docker - temos um tutorial sobre Como instalar e operar o Docker no Ubuntu, você precisa seguir as etapas 1, 2, 3 e 4. Isso deve funcionar para qualquer distribuição Ubuntu.
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 :
|
1 |
docker volume create --name Step1DataVolume |
Você deve ver a seguinte saída indicando que a criação do volume foi bem-sucedida:
![]()
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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
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:
|
1 |
echo "Texto de Exemplo do Passo Um" > /Step1DataVolume/StepOne.txt |
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:
|
1 |
docker volume inspect Step1DataVolume |
Você deve ver a seguinte saída:

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:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Dentro do container, execute o seguinte comando para verificar se o StepOne.txt arquivo existe:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Você deve ver uma saída semelhante:

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:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Enquanto estiver dentro do container, insira o seguinte comando para gravar dados no volume e verificar se os dados estão lá:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Abaixo está a saída dos três comandos:

Em seguida, saia do container. Quando você reiniciar o container usando o seguinte comando, o volume será anexado automaticamente:
|
1 |
docker start -ai Step2Container1 |
Dentro do container, verifique se o volume está montado checando a existência do arquivo StepTwo.txt usando o comando:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Aqui está a saída:

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:
|
1 |
docker volume rm Step2DataVolume |
Você deve ver a mensagem de erro na saída:
![]()
Vamos remover o container usando o id do container mostrado na saída com o comando docker rm:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
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:
|
1 |
docker volume ls |
Aqui está a saída:

Para remover o container criado na Etapa 2, insira o seguinte comando:
|
1 |
docker volume rm Step2DataVolume |
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:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
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:

Insira o seguinte comando para criar o container, anexar o volume e listar o conteúdo do volume usando o comando ls:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
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:

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:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Dentro do contêiner, execute o seguinte comando para criar um arquivo de texto e adicionar algum texto:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Dentro do contêiner, use o cat comando para verificar a persistência de dados:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Você deve ver a seguinte saída:

Podemos anexar mais algum texto ao arquivo a partir do Step4Container2 inserindo o seguinte comando:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
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:
|
1 |
docker start -ai Step4Container1 |
Verifique as alterações usando o comando:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Você deve ver uma saída semelhante à captura de tela abaixo:

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:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Uma vez dentro do contêiner, você pode ler o arquivo de texto no volume inserindo o seguinte comando:
|
1 |
cat /Step4DataVolume/StepFour.txt |

No entanto, se você tentar remover o arquivo usando o comando:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Você receberá uma mensagem de erro no seu terminal como:
![]()
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:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
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:
- Como compartilhar dados entre um contêiner Docker e um host
- Limpar recursos do Docker – Imagens, contêineres e volumes
- Implantando Laravel, Nginx e MySQL com Docker Compose
- Instalando e configurando o Docker no CentOS 7
Boa computação!
Comentários
Nenhum comentário ainda. Seja o primeiro.