Gerenciamento de Volumes Docker

DockerBeginner
Pratique Agora

Introdução

Esta seção abordará o uso de repositórios de dados persistentes em um ambiente Docker, conhecidos como volumes. Você aprenderá as características do armazenamento persistente, como a distinção entre volumes internos e externos, e entenderá as melhores práticas de aplicação.

Gerenciamento de Volumes de Dados

Os volumes de dados são a operação padrão para persistência de dados no Docker. Nesta seção, guiaremos você pelas operações fundamentais com volumes na prática.

Objetivo

Sua meta é criar um volume de dados chamado my-vol utilizando o comando docker e adicionar um arquivo chamado test.txt dentro deste volume.

Exemplo de Resultado

Aqui está um exemplo do que você deve ser capaz de realizar ao final deste desafio:

  1. Criar um volume de dados chamado my-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
  1. Obter o Mountpoint através dos detalhes do volume.
[
  {
    "CreatedAt": "2024-01-20T17:37:33+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
    "Name": "my-vol",
    "Options": {},
    "Scope": "local"
  }
]
  1. Acessar o Mountpoint e criar o arquivo test.txt.
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## pwd
/var/lib/docker/volumes/my-vol/_data
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## ls
test.txt

Requisitos

Para concluir este desafio, você precisará:

  • Saber como criar um volume de dados usando o comando docker.
  • Criar um arquivo utilizando o usuário root.
  • Alternar para o usuário root usando sudo su e definir a senha do root com sudo passwd root.

Criando Containers com Volumes de Dados

Nesta seção, criaremos containers utilizando volumes de dados do Docker e realizaremos a cópia de arquivos.

Objetivo

Seu objetivo é criar um volume Docker chamado nginx-vol, iniciar um container chamado nginx montando este volume e, por fim, copiar o arquivo /home/labex/project/index.html para dentro do container nginx.

Exemplo de Resultado

Aqui está um exemplo do que você deve alcançar:

  1. Criar um volume de dados chamado nginx-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
local     nginx-vol
  1. Criar um container chamado nginx baseado na imagem nginx que montará seu diretório /usr/share/nginx/html no volume nginx-vol.
labex:~/ $ docker ps | grep nginx
c39296aaf39e   nginx     "/docker-entrypoint.…"   35 seconds ago   Up 31 seconds   80/tcp    nginx
  1. Verificar o arquivo /home/labex/project/index.html localmente.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
  1. Copiar o arquivo /home/labex/project/index.html para o container nginx e verificar o conteúdo.
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world

Requisitos

Para concluir este desafio, você precisará:

  • Saber criar um volume de dados via linha de comando Docker.
  • Saber como iniciar um container.
  • Saber como copiar arquivos locais para dentro de containers.

Criando Containers com Host Path

Em muitos cenários, em vez de volumes gerenciados, preferimos utilizar diretórios nativos do sistema hospedeiro para persistência de dados. Nesta seção, utilizaremos um diretório local para criar containers.

Objetivo

Sua meta é criar um container que utilize um Host Path (caminho do hospedeiro), copiar o arquivo /home/labex/project/nginx.txt para dentro do container e verificar se os arquivos no container correspondem aos do Host Path.

Exemplo de Resultado

Aqui está o que se espera ao final deste desafio:

  1. Criar um diretório nginx dentro do diretório /tmp.
labex:/tmp/ $ ls | grep nginx
nginx
  1. Iniciar o container nginx-host baseado na imagem nginx, montando o diretório /tmp/nginx no caminho /usr/share/nginx/html do container.
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df   nginx     "/docker-entrypoint.…"   44 seconds ago   Up 43 seconds   80/tcp    nginx-host
  1. Verificar os detalhes específicos da montagem com o comando docker inspect.
"Mounts": [
   {
         "Type": "bind",
         "Source": "/tmp/nginx",
         "Destination": "/usr/share/nginx/html",
         "Mode": "",
         "RW": true,
         "Propagation": "rprivate"
   }
],
  1. Verificar o conteúdo do arquivo /home/labex/project/nginx.txt localmente.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
  1. Copiar o arquivo para o diretório montado e verificar via container.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
  1. Validar se o arquivo nginx.txt aparece no diretório /tmp/nginx da máquina local.
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx

Requisitos

Para concluir este desafio, você precisará:

  • Identificar o Host Path que deseja utilizar.
  • Saber usar comandos internos do container para verificar o acesso a arquivos do hospedeiro.
  • Saber iniciar containers utilizando montagens do tipo Host Path.
  • Estar familiarizado com comandos básicos de Linux como cd, mkdir, touch, etc.

Compartilhamento de Dados entre Containers

Em ambientes conteinerizados, frequentemente é necessário compartilhar dados entre diferentes containers. Existem várias técnicas para isso, e este desafio explorará como realizar esse compartilhamento de forma eficiente.

Objetivo

Sua meta é implementar o compartilhamento de dados entre dois containers. Especificamente, você usará um Host Path para iniciar o container A, depois iniciará um container B montando os volumes do container A, permitindo a troca de informações entre ambos.

Exemplo de Resultado

Aqui está o fluxo esperado para este desafio:

  1. Criar um diretório /tmp/share no host local.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
  1. Criar um container chamado nginx-share montando o diretório local /tmp/share em /usr/share/nginx/html.
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39   nginx     "/docker-entrypoint.…"   55 seconds ago   Up 55 seconds   80/tcp    nginx-share
  1. Criar um container chamado busybox-share baseado na imagem busybox e montar os volumes a partir do container nginx-share.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681   busybox   "sh"                     43 seconds ago   Up 42 seconds             busybox-share
  1. Verificar o arquivo /home/labex/project/share.txt localmente.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
  1. Validar o acesso ao arquivo através do container nginx-share.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
  1. Acessar o container busybox-share para confirmar se o arquivo share.txt está visível lá também.
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share

Requisitos

Para concluir este desafio, você precisará:

  • Estar familiarizado com operações básicas e conceitos de containers Docker.
  • Utilizar ferramentas de linha de comando Docker para criar, executar e parar containers.
  • Compreender o conceito e a utilidade dos volumes de dados.
  • Entender como montar volumes de um container em outro.
  • Conhecer comandos básicos de Linux como cd, mkdir, touch, etc.

Resumo

Parabéns por concluir este desafio! Agora que você domina o uso de volumes de armazenamento em containers, está pronto para gerenciar dados de forma profissional em seus projetos. Continue assim!

✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar✨ Verificar Solução e Praticar