Guia Passo a Passo para Clonar uma Imagem de Contêiner Docker

DockerBeginner
Pratique Agora

Introdução

Este tutorial irá guiá-lo através do processo de clonagem de uma imagem de contêiner Docker. As imagens Docker são templates empacotados contendo tudo o que é necessário para executar uma aplicação, e a clonagem permite que você faça cópias que podem ser personalizadas. Ao final deste guia, você entenderá como clonar uma imagem Docker, modificá-la e compartilhá-la para implantação.

Entendendo o Docker e Verificando Seu Ambiente

Antes de começarmos a clonar imagens Docker, é importante entender o que é Docker e verificar se nosso ambiente está configurado corretamente.

O que é Docker?

Docker é uma plataforma que usa contêineres para desenvolver, implantar e executar aplicações. Os contêineres empacotam uma aplicação com todas as suas dependências, garantindo que ela funcione consistentemente em diferentes ambientes. Isso torna o Docker particularmente útil para fluxos de trabalho de desenvolvimento e implantação.

Verificando a Instalação do Docker

Primeiro, vamos garantir que o Docker esteja corretamente instalado em nosso sistema. Abra uma janela de terminal e execute:

docker --version

Você deve ver uma saída semelhante a:

Docker version 20.10.21, build baeda1f

Em seguida, verifique se o serviço Docker está em execução:

sudo systemctl status docker

A saída deve indicar que o Docker está ativo (em execução). Se não estiver em execução, você pode iniciá-lo com:

sudo systemctl start docker

Testando a Funcionalidade do Docker

Vamos executar um comando de teste simples para verificar se o Docker está funcionando corretamente:

docker run hello-world

Este comando baixa e executa a imagem hello-world, que imprime uma mensagem de confirmação e sai. Você deve ver uma saída semelhante a:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Listando Imagens Docker

Para ver quais imagens Docker estão atualmente disponíveis em seu sistema, execute:

docker images

Este comando lista todas as imagens Docker que estão atualmente armazenadas localmente. A saída mostra o repositório da imagem, a tag, o ID da imagem, a data de criação e o tamanho.

Agora que confirmamos que o Docker está funcionando corretamente, estamos prontos para começar a trabalhar com imagens Docker no próximo passo.

Obtendo e Executando uma Imagem Docker

Nesta etapa, obteremos uma imagem Docker do Docker Hub e a executaremos em nosso sistema local. Este é o primeiro passo no processo de clonagem de uma imagem Docker.

O que é Docker Hub?

Docker Hub é um serviço de registro baseado em nuvem onde os usuários podem encontrar e compartilhar imagens de contêineres. Ele contém muitas imagens oficiais mantidas por fornecedores de software, bem como imagens contribuídas pela comunidade.

Obtendo uma Imagem do Docker Hub

Vamos obter a imagem oficial do servidor web Nginx do Docker Hub. Nginx é um servidor web popular que usaremos como nosso exemplo ao longo deste tutorial.

Execute o seguinte comando para baixar a imagem Nginx:

docker pull nginx:latest

Este comando baixa a versão mais recente da imagem Nginx. Você deve ver uma saída mostrando o progresso do download:

latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Verificando a Imagem Baixada

Para confirmar que a imagem foi baixada com sucesso, liste suas imagens Docker novamente:

docker images

Você deve agora ver a imagem Nginx na lista:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   2 weeks ago    142MB

Executando o Contêiner Docker Nginx

Agora, vamos executar um contêiner baseado na imagem Nginx que acabamos de obter:

docker run --name my-nginx -d -p 8080:80 nginx

Este comando faz o seguinte:

  • --name my-nginx: Nomeia nosso contêiner como "my-nginx"
  • -d: Executa o contêiner em modo detached (em segundo plano)
  • -p 8080:80: Mapeia a porta 8080 em nosso host para a porta 80 no contêiner
  • nginx: Usa a imagem Nginx que obtivemos anteriormente

Você deve ver uma longa sequência de caracteres na saída, que é o ID do contêiner.

Verificando o Contêiner em Execução

Para verificar se o contêiner está em execução:

docker ps

Você deve ver uma saída semelhante a:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f8d3e9c5b9a7   nginx     "/docker-entrypoint.…"   30 seconds ago   Up 29 seconds   0.0.0.0:8080->80/tcp   my-nginx

Agora você pode acessar a página padrão do Nginx abrindo um navegador web e navegando para http://localhost:8080 ou usando curl:

curl http://localhost:8080

Você deve ver o conteúdo HTML da página de boas-vindas do Nginx.

Agora que obtivemos e executamos com sucesso uma imagem Docker, estamos prontos para criar nossa própria imagem personalizada com base nela na próxima etapa.

Criando uma Imagem Docker Personalizada

Agora que temos um contêiner Nginx em execução, criaremos uma imagem personalizada modificando-o. Este é o núcleo do processo de clonagem. Faremos o seguinte:

  1. Fazer alterações no contêiner em execução
  2. Criar uma nova imagem a partir dessas alterações
  3. Executar um contêiner com base em nossa nova imagem

Entendendo a Criação de Imagens Docker

As imagens Docker podem ser criadas de duas maneiras:

  1. Usando um Dockerfile (a abordagem recomendada para produção)
  2. Confirmando as alterações feitas em um contêiner em execução (útil para exploração e experimentação)

Usaremos a segunda abordagem neste tutorial, pois é mais direta para entender o processo de clonagem.

Modificando o Contêiner em Execução

Primeiro, vamos criar um arquivo HTML personalizado para substituir a página de boas-vindas padrão do Nginx. Precisamos entrar no contêiner em execução e modificar seus arquivos.

Use o seguinte comando para executar um shell dentro do contêiner em execução:

docker exec -it my-nginx bash

Isso abre um shell bash interativo dentro do contêiner. Agora, vamos criar um arquivo HTML personalizado:

echo "<html><body><h1>My Custom Docker Image</h1><p>This is a custom Nginx image created in the LabEx tutorial.</p></body></html>" > /usr/share/nginx/html/index.html

Você pode verificar a alteração verificando o conteúdo do arquivo:

cat /usr/share/nginx/html/index.html

Agora saia do shell do contêiner:

exit

Testando as Alterações

Vamos testar se nossas alterações foram aplicadas acessando o servidor Nginx novamente:

curl http://localhost:8080

Você deve agora ver nosso conteúdo HTML personalizado em vez da página de boas-vindas padrão do Nginx.

Criando uma Nova Imagem a partir do Contêiner Modificado

Agora que modificamos o contêiner, criaremos uma nova imagem que inclui essas alterações. Isso é feito usando o comando docker commit:

docker commit my-nginx my-custom-nginx:v1

Este comando cria uma nova imagem chamada my-custom-nginx com a tag v1 com base no estado atual do contêiner my-nginx.

Verificando a Nova Imagem

Vamos verificar se nossa nova imagem foi criada:

docker images

Você deve ver sua nova imagem na lista:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-custom-nginx   v1        a1b2c3d4e5f6   10 seconds ago   142MB
nginx             latest    605c77e624dd   2 weeks ago      142MB

Executando um Contêiner a partir da Nova Imagem

Agora, vamos parar e remover o contêiner original e, em seguida, executar um novo contêiner com base em nossa imagem personalizada:

docker stop my-nginx
docker rm my-nginx
docker run --name my-custom-container -d -p 8081:80 my-custom-nginx:v1

Esses comandos:

  1. Param o contêiner original
  2. Removem o contêiner original
  3. Criam um novo contêiner com base em nossa imagem personalizada, mapeado para a porta 8081

Testando o Novo Contêiner

Vamos verificar se nosso novo contêiner está sendo executado corretamente:

docker ps

Você deve ver seu novo contêiner na lista:

CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                  NAMES
g9h8i7j6k5l4   my-custom-nginx:v1   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8081->80/tcp   my-custom-container

Agora, acesse o servidor Nginx na nova porta:

curl http://localhost:8081

Você deve ver o mesmo conteúdo HTML personalizado, confirmando que nossa nova imagem contém as alterações que fizemos.

Parabéns! Você clonou com sucesso uma imagem Docker e a personalizou. Na próxima etapa, aprenderemos como compartilhar essa imagem personalizada.

Marcação e Compartilhamento da Sua Imagem Docker

Agora que criamos uma imagem Docker personalizada, aprenderemos como marcá-la corretamente e prepará-la para compartilhamento. Em um cenário real, você enviaria a imagem para um registro como o Docker Hub, mas neste tutorial, nos concentraremos nas etapas de preparação.

Entendendo as Tags de Imagem Docker

As imagens Docker são identificadas por seu nome de repositório e tag. As tags ajudam no versionamento e na organização das imagens. A tag padrão é latest, mas é uma boa prática usar tags de versão significativas.

Adicionando Mais Tags à Sua Imagem

Vamos adicionar mais algumas tags à nossa imagem personalizada:

docker tag my-custom-nginx:v1 my-custom-nginx:latest
docker tag my-custom-nginx:v1 my-custom-nginx:stable

Esses comandos criam duas tags adicionais para nossa imagem: latest e stable. Os dados reais da imagem são compartilhados entre todas as três tags, então essa operação é muito eficiente.

Verificando as Tags

Vamos verificar nossas imagens novamente:

docker images

Você deve agora ver várias entradas para my-custom-nginx:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-custom-nginx   v1        a1b2c3d4e5f6   10 minutes ago   142MB
my-custom-nginx   latest    a1b2c3d4e5f6   10 minutes ago   142MB
my-custom-nginx   stable    a1b2c3d4e5f6   10 minutes ago   142MB
nginx             latest    605c77e624dd   2 weeks ago      142MB

Observe que todas as imagens my-custom-nginx têm o mesmo ID da imagem, indicando que são a mesma imagem com tags diferentes.

Preparando para a Distribuição da Imagem

Em um cenário real, você enviaria sua imagem para um registro como o Docker Hub. Para fazer isso, você precisaria:

  1. Criar uma conta no Docker Hub
  2. Fazer login no Docker Hub a partir do seu terminal
  3. Marcar sua imagem com seu nome de usuário do Docker Hub
  4. Enviar a imagem

Para fins de demonstração, vamos supor que seu nome de usuário do Docker Hub seja seuusuário. Veja como você prepararia sua imagem para envio:

docker tag my-custom-nginx:v1 yourusername/my-custom-nginx:v1

Para enviar a imagem (em um cenário real), você usaria:

## Isso é apenas para demonstração - não enviaremos de fato
## docker push yourusername/my-custom-nginx:v1

Salvando uma Imagem Docker em um Arquivo

Em vez de enviar para um registro, você também pode salvar uma imagem Docker em um arquivo para transferência manual:

docker save -o my-custom-nginx.tar my-custom-nginx:v1

Este comando salva a imagem em um tarball chamado my-custom-nginx.tar. Você pode verificar se o arquivo foi criado:

ls -lh my-custom-nginx.tar

Você deve ver uma saída semelhante a:

-rw------- 1 labex labex 142M Nov 10 12:34 my-custom-nginx.tar

Carregando uma Imagem de um Arquivo

Para carregar uma imagem de um tarball em outra máquina (ou na mesma máquina após remover a imagem), você usaria:

## Não executaremos realmente este comando como parte do tutorial
## docker load -i my-custom-nginx.tar

Exportando a Documentação do Contêiner

Para ajudar outras pessoas a entender sua imagem personalizada, é uma boa prática documentar as alterações que você fez. Vamos criar um arquivo de documentação simples:

cat > my-custom-nginx-doc.txt << EOF
## My Custom Nginx Image

This is a custom Nginx image created by cloning the official Nginx image.

### Changes Made
- Replaced the default welcome page with a custom HTML page

### How to Run
docker run --name my-custom-container -d -p 8080:80 my-custom-nginx:v1

### Version History
- v1: Initial custom version with modified welcome page
EOF

Agora você tem um arquivo de documentação para sua imagem personalizada.

Parabéns! Você aprendeu como marcar sua imagem Docker e prepará-la para compartilhamento. Na próxima etapa, analisaremos algumas práticas recomendadas e limparemos nosso ambiente.

Melhores Práticas e Limpeza

Nesta etapa final, abordaremos algumas melhores práticas para trabalhar com imagens Docker e limparemos nosso ambiente.

Melhores Práticas para Imagens Docker

1. Use Tags Específicas

Sempre use tags de versão específicas em vez de confiar na tag latest. Isso garante consistência em suas implantações.

## Abordagem melhor
docker pull nginx:1.23.2

## Menos previsível
docker pull nginx:latest

2. Mantenha as Imagens Pequenas

Imagens menores são mais rápidas para baixar e usam menos armazenamento. Considere usar imagens baseadas em alpine sempre que possível:

## Vamos ver a diferença de tamanho
docker pull nginx:alpine
docker images | grep nginx

Você pode ver uma saída como:

nginx         alpine    2bc7edbc3cf2   2 weeks ago    40.7MB
nginx         latest    605c77e624dd   2 weeks ago    142MB

A versão alpine é significativamente menor!

3. Use Builds de Várias Fases

Ao criar imagens com um Dockerfile, use builds de várias fases para manter a imagem final pequena. Aqui está um exemplo simples (você não precisa executar isso):

## Build stage
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o app

## Final stage
FROM alpine:3.15
COPY --from=builder /app/app /app
CMD ["/app"]

4. Documente Suas Imagens

Sempre mantenha a documentação para suas imagens personalizadas, incluindo:

  • Para que a imagem serve
  • Como usá-la
  • Quais alterações você fez
  • Quaisquer opções de configuração

Criamos um arquivo de documentação simples na etapa anterior.

5. Verifique se há Vulnerabilidades

Verifique regularmente suas imagens em busca de vulnerabilidades:

## Exemplo de verificação (o Docker Desktop tem isso embutido)
## docker scan my-custom-nginx:v1

Inspecionando Imagens Docker

Vamos explorar um comando útil para inspecionar imagens Docker:

docker inspect my-custom-nginx:v1

Este comando exibe informações detalhadas sobre a imagem, incluindo suas camadas, configuração e variáveis de ambiente.

Visualizando o Histórico da Imagem

Você pode ver o histórico de como uma imagem foi construída:

docker history my-custom-nginx:v1

Isso mostra cada camada da imagem e os comandos que as criaram.

Limpeza

Agora, vamos limpar nosso ambiente removendo os contêineres e imagens que criamos:

  1. Primeiro, pare e remova nosso contêiner personalizado:
docker stop my-custom-container
docker rm my-custom-container
  1. Remova as imagens que criamos:
docker rmi my-custom-nginx:v1 my-custom-nginx:latest my-custom-nginx:stable
  1. Opcionalmente, remova a imagem Nginx:
docker rmi nginx:latest nginx:alpine
  1. Verifique se todos os contêineres e imagens foram removidos:
docker ps -a
docker images

Usando Docker System Prune

O Docker fornece um comando conveniente para limpar recursos não utilizados:

docker system prune

Isso remove todos os contêineres parados, redes não utilizadas, imagens pendentes e cache de build. Você será solicitado a confirmar antes de prosseguir.

Para uma limpeza mais agressiva, você pode usar:

docker system prune -a

Isso remove adicionalmente todas as imagens não utilizadas, não apenas as pendentes.

Conclusão

Você agora aprendeu como:

  1. Fazer pull e executar imagens Docker
  2. Modificar contêineres em execução
  3. Commitar alterações para criar novas imagens personalizadas
  4. Marcar imagens para organização e distribuição
  5. Salvar imagens em arquivos para transferência manual
  6. Documentar suas imagens personalizadas
  7. Limpar seu ambiente Docker

Essas habilidades formam a base do trabalho com imagens Docker e serão valiosas à medida que você continuar sua jornada com a containerização.

Resumo

Neste tutorial prático, você aprendeu o processo completo de clonagem de uma imagem de contêiner Docker. Você começou entendendo os conceitos básicos do Docker e verificando seu ambiente. Em seguida, você fez o pull de uma imagem oficial do Nginx e a executou como um contêiner. Depois, você personalizou este contêiner modificando seu conteúdo e comitou essas alterações para criar sua própria imagem personalizada.

Você também aprendeu como marcar suas imagens corretamente para versionamento e distribuição, como salvar imagens em arquivos para transferência manual e como documentar suas alterações. Finalmente, você explorou as melhores práticas para trabalhar com imagens Docker e limpou seu ambiente.

Essas habilidades fornecem uma base sólida para trabalhar com Docker em ambientes de desenvolvimento e produção. Agora você pode criar e personalizar com confiança imagens Docker para atender às suas necessidades específicas, tornando suas aplicações mais portáteis e consistentes em diferentes ambientes.