Trabalhando com Volumes do Docker

DockerBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como gerenciar dados em contêineres Docker usando volumes. Os volumes do Docker são o mecanismo preferido para persistir dados gerados e utilizados por contêineres Docker. Este laboratório guiará você por vários aspectos dos volumes do Docker, incluindo criação, gerenciamento, compartilhamento de dados, backup e restauração. Ao final deste laboratório, você terá uma compreensão sólida de como gerenciar dados de forma eficaz em ambientes Docker.

Este é um Laboratório Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para concluir cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 97%. Ele recebeu uma taxa de avaliação positiva de 99% dos alunos.

Entendendo as Opções de Armazenamento do Docker

Antes de mergulharmos nos volumes do Docker, é importante entender as diferentes opções de armazenamento disponíveis no Docker. O Docker oferece três opções principais para armazenar dados:

  1. Volumes: O mecanismo preferido para persistir dados no Docker.
  2. Bind mounts: Conectam um caminho específico da máquina host a um contêiner.
  3. tmpfs mounts: Armazenam dados temporariamente na memória da máquina host.

Neste laboratório, focaremos principalmente nos volumes, pois eles são a opção mais flexível e recomendada para gerenciar dados no Docker.

Vamos começar listando os volumes atuais no seu sistema:

docker volume ls

Você verá uma saída semelhante a esta:

DRIVER    VOLUME NAME
local     jenkins-data

Este comando lista todos os volumes do Docker no seu sistema. A saída mostra o driver do volume (geralmente "local") e o nome do volume. Você pode ver alguns volumes existentes ou a lista pode estar vazia se você ainda não criou nenhum volume.

Não se preocupe se vir nomes de volumes diferentes ou nenhum volume. Isso é normal e depende do que você fez anteriormente com o Docker no seu sistema.

Criando e Gerenciando Volumes Nomeados

Agora, vamos criar um novo volume nomeado. Um volume nomeado é um volume que você cria explicitamente e ao qual atribui um nome específico. Isso facilita a referência e o gerenciamento posterior.

Execute este comando para criar um novo volume:

docker volume create my_data

Este comando cria um novo volume chamado my_data. O Docker cuidará de todos os detalhes de onde e como este volume será armazenado no seu sistema host.

Vamos verificar se o volume foi criado:

docker volume ls

Agora você deve ver my_data na lista de volumes, junto com quaisquer volumes que já estivessem lá.

Para obter informações mais detalhadas sobre o volume, podemos usar o comando inspect:

docker volume inspect my_data

Isso produzirá algo como:

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

Esta saída nos informa várias coisas sobre o nosso volume:

  • Quando foi criado
  • O driver que está usando (local, neste caso)
  • O ponto de montagem (onde os dados estão realmente armazenados no seu sistema host)
  • O nome que demos a ele

Não se preocupe se não entender todos esses detalhes agora. As partes mais importantes para nós são o Name (Nome) e o Mountpoint (Ponto de Montagem).

Usando Volumes com Contêineres

Agora que temos um volume, vamos usá-lo com um contêiner. Iniciaremos um novo contêiner e montaremos nosso volume nele.

Execute este comando:

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

Vamos detalhar este comando:

  • docker run: Instruiu o Docker a executar um novo contêiner
  • -d: Executa o contêiner em modo desanexado (em segundo plano)
  • --name my_container: Dá um nome ao nosso contêiner, facilitando a referência posterior
  • -v my_data:/app/data: Monta nosso volume my_data no diretório /app/data dentro do contêiner
  • ubuntu:latest: Esta é a imagem que estamos usando para o nosso contêiner
  • sleep infinity: Este é o comando que o contêiner executará. Ele apenas mantém o contêiner rodando indefinidamente

Agora nosso contêiner está rodando com o volume montado. Vamos criar alguns dados no volume:

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

Este comando faz algumas coisas:

  • docker exec: Permite executar um comando em um contêiner em execução
  • my_container: É o nome do nosso contêiner
  • sh -c "...": Executa um comando de shell dentro do contêiner
  • O comando real cria um arquivo chamado test.txt em nosso volume com o conteúdo "Hello from Docker volume"

Para verificar se os dados foram gravados, podemos ler o arquivo:

docker exec my_container cat /app/data/test.txt

Você deve ver a mensagem "Hello from Docker volume" impressa no console.

Compartilhando Dados Entre Contêineres

Um dos grandes benefícios dos volumes do Docker é a capacidade de compartilhar dados entre contêineres. Vamos criar outro contêiner que use o mesmo volume:

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

Este comando é muito semelhante ao que usamos antes, mas estamos dando ao contêiner um nome diferente e montando o volume em um caminho diferente dentro do contêiner.

Agora, vamos verificar se este novo contêiner pode acessar os dados que criamos anteriormente:

docker exec another_container cat /app/shared_data/test.txt

Você deve ver a mesma mensagem "Hello from Docker volume" que escrevemos anteriormente. Isso mostra que ambos os contêineres estão acessando os mesmos dados.

Vamos adicionar mais alguns dados a partir deste novo contêiner:

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

Este comando anexa uma nova linha ao nosso arquivo test.txt.

Agora, se verificarmos o conteúdo do arquivo de qualquer um dos contêineres, deveremos ver ambas as linhas:

docker exec my_container cat /app/data/test.txt

Você deve ver tanto "Hello from Docker volume" quanto "Data from another container" na saída.

Isso demonstra como os volumes do Docker podem ser usados para compartilhar dados entre contêineres, o que é incrivelmente útil para muitas aplicações.

Backup e Restauração de Volume

Fazer backup e restaurar volumes do Docker é crucial para a preservação dos dados. Vamos percorrer o processo:

Primeiro, precisamos parar e remover os contêineres que estavam usando o volume. Isso ocorre porque não podemos remover um volume enquanto ele estiver em uso:

docker stop my_container another_container
docker rm my_container another_container

Agora, vamos criar um backup do nosso volume:

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source .

Este comando pode parecer complexo, então vamos detalhá-lo:

  • docker run --rm: Executa um contêiner temporário e o remove quando terminar
  • -v my_data:/source:ro: Monta nosso volume como somente leitura no contêiner
  • -v $(pwd):/backup: Monta o diretório atual como /backup no contêiner
  • ubuntu: Usa a imagem do Ubuntu
  • tar cvf /backup/my_data_backup.tar -C /source .: Cria um arquivo tar dos dados do volume

Agora, vamos remover nosso volume original:

docker volume rm my_data

Para restaurar os dados, criaremos un novo volume e extrairemos o backup nele:

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

Isso cria um novo volume e extrai nosso backup para dentro dele.

Vamos verificar se os dados foram restaurados:

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

Você deve ver o conteúdo do arquivo que criamos anteriormente.

Resumo

Neste laboratório, você aprendeu a trabalhar com volumes do Docker. Você criou e gerenciou volumes nomeados, usou volumes com contêineres, compartilhou dados entre contêineres e realizou operações de backup e restauração. Essas habilidades são essenciais para o gerenciamento eficaz de dados em ambientes Docker.

Principais aprendizados:

  • Os volumes do Docker fornecem uma maneira flexível e eficiente de gerenciar dados persistentes em contêineres.
  • Os volumes podem ser facilmente criados, inspecionados e removidos usando comandos da CLI do Docker.
  • Os dados em volumes podem ser compartilhados entre vários contêineres.
  • Fazer backup e restaurar volumes é crucial para a preservação de dados e pode ser feito usando comandos padrão do Linux.

À medida que você continua trabalhando com o Docker, lembre-se de considerar a persistência e o gerenciamento de dados como um aspecto crucial de suas aplicações conteinerizadas. Sempre planeje o backup e a recuperação de dados, especialmente em ambientes de produção.