02 Criando e Gerenciando Containers - KleberVales/Dominando-Docker GitHub Wiki

1. Creating your first container

2. Working with images: docker build, docker pull, docker push

3. Data persistence with Volumes

4. Communication between containers: Docker Networks

5. Managing containers in real time: logs, stats, exec

6. Registry and image versioning (Docker Hub, GitHub, AWS ECR)


||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


Criando seu primeiro container

1. Pré-requisitos

  • Instalar o Docker: disponível para Windows, macOS e Linux.

  • Verificar instalação:


docker --version

2. Baixando uma imagem

Um container é baseado em uma imagem. Vamos usar a imagem oficial do nginx como exemplo:


docker pull nginx

Isso baixa a imagem do servidor web Nginx do Docker Hub.

3. Criando e executando o container

  • -d → executa em segundo plano (detached mode).

  • -p 8080:80 → mapeia a porta 80 do container para a porta 8080 do host.

  • --name → dá um nome ao container.

  • nginx → imagem usada.

4. Testando o container

Abra o navegador e acesse:


http://localhost:8080

Você verá a página inicial do Nginx, confirmando que o container está rodando.

5. Gerenciando containers

  • Listar containers ativos:
docker ps
  • Parar o container:
docker stop meu-primeiro-container
  • Remover o container:
docker rm meu-primeiro-container

Trabalhando com imagens: docker build, docker pull, docker push

As imagens Docker são a base dos containers. Elas contêm tudo o que é necessário para executar uma aplicação: código, dependências, bibliotecas e configurações. Vamos entender como criar, baixar e enviar imagens.

1. Criando imagens com docker build

O comando docker build é usado para construir uma imagem personalizada a partir de um arquivo Dockerfile.

Exemplo de Dockerfile simples:


# Usando imagem base oficial do Python
FROM python:3.10-slim

# Definindo diretório de trabalho
WORKDIR /app

# Copiando arquivos da aplicação
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

# Comando padrão ao iniciar o container
CMD ["python", "app.py"]

Construindo a imagem:


docker build -t minha-imagem:1.0 .

  • -t → define nome e tag da imagem.

  • . → indica que o Dockerfile está no diretório atual.

2. Baixando imagens com docker pull

Se você quiser usar uma imagem já existente no Docker Hub ou em outro registro:


docker pull nginx:latest

  • nginx → nome da imagem.

  • latest → tag (se não especificar, o padrão é latest).

Isso baixa a imagem para o seu ambiente local.

3. Enviando imagens com docker push

Depois de criar sua própria imagem, você pode publicá-la em um registro (como Docker Hub) para compartilhar com outros.

Passos:

a. Login no Docker Hub:

docker login

b. Marcar a imagem com seu repositório:

docker tag minha-imagem:1.0 usuario/meu-repo:1.0

c. Enviar a imagem:

docker push usuario/meu-repo:1.0

Agora sua imagem está disponível para qualquer pessoa que fizer:

docker pull usuario/meu-repo:1.0

Persistência de dados com Volumes

Containers são efêmeros por natureza: quando são removidos, todos os dados internos desaparecem. Para manter informações mesmo após reiniciar ou recriar containers, usamos Volumes.

O que são Volumes?

  • Volumes são mecanismos do Docker para armazenar dados fora do ciclo de vida do container.

  • Eles permitem que informações persistam mesmo que o container seja parado ou removido.

  • Podem ser compartilhados entre múltiplos containers.

Tipos de Volumes

  • Volumes nomeados: criados e gerenciados pelo Docker.

  • Bind mounts: vinculam um diretório do host diretamente ao container.

  • Tmpfs mounts: armazenam dados apenas em memória (não persistem após reinício).

Criando e usando Volumes

1. Criar um volume nomeado:

docker volume create meu-volume

2. Usar o volume em um container:

docker run -d \
  -p 8080:80 \
  --name web-com-volume \
  -v meu-volume:/usr/share/nginx/html \
  nginx

-v meu-volume:/usr/share/nginx/html → monta o volume no diretório do container.

Os arquivos salvos nesse diretório ficam armazenados no volume, mesmo que o container seja removido.

Bind Mounts (diretório do host)

Se quiser usar uma pasta local do computador:

docker run -d \
  -p 8080:80 \
  --name web-com-bind \
  -v $(pwd)/site:/usr/share/nginx/html \
  nginx

$(pwd)/site → pasta local.

/usr/share/nginx/html → pasta dentro do container.

Assim, qualquer alteração feita na pasta local reflete imediatamente no container.

Gerenciando Volumes

Listar volumes:

docker volume ls

Inspecionar volume:

docker volume inspect meu-volume

Remover volume:

docker volume rm meu-volume

Comunicação entre containers: Redes Docker

Para que containers possam se comunicar entre si, o Docker oferece um sistema de redes virtuais. Isso permite que aplicações distribuídas sejam organizadas de forma segura e eficiente.

O que são redes Docker?

Redes Docker são ambientes virtuais que permitem que containers troquem informações.

Cada rede funciona como um "switch" interno, isolando ou conectando containers conforme necessário.

Containers em uma mesma rede podem se comunicar usando nomes de serviço em vez de IPs.

Tipos de redes Docker

  • Bridge (padrão)

    • Criada automaticamente quando você inicia um container sem especificar rede.

    • Útil para comunicação entre containers no mesmo host.

  • Host

    • O container compartilha a rede do host.

    • Remove o isolamento de rede, permitindo acesso direto às portas do host.

  • Overlay

    • Usada em clusters (Docker Swarm).

    • Permite comunicação entre containers em diferentes hosts.

  • Macvlan

    • Dá ao container um endereço IP próprio na rede física.

    • Útil quando containers precisam ser tratados como dispositivos reais na rede.

Criando e usando redes

Criar uma rede bridge personalizada:

docker network create minha-rede

Executar containers na mesma rede:

docker run -d --name app1 --network minha-rede nginx
docker run -d --name app2 --network minha-rede alpine sleep 3600

Agora, o container app2 pode se comunicar com app1 usando o nome app1 como hostname.

Testando comunicação entre containers

Dentro do app2:

docker exec -it app2 sh
ping app1

Se a rede estiver configurada corretamente, o ping funcionará.

Gerenciamento de redes

Listar redes:

docker network ls

Inspecionar rede:

docker network inspect minha-rede

Remover rede:

docker network rm minha-rede

Casos de uso comuns

Aplicações multicontainer: por exemplo, um container de aplicação web comunicando-se com um container de banco de dados.

Ambientes isolados: separar redes para diferentes projetos.

Clusters distribuídos: usar overlay networks para comunicação entre múltiplos hosts.


Gerenciando containers em tempo real: logs, stats, exec

Uma vez que seus containers estão rodando, é essencial monitorar e interagir com eles em tempo real. O Docker oferece comandos poderosos para isso:

Visualizando logs (docker logs)

Os logs mostram a saída padrão (stdout/stderr) do processo dentro do container.

docker logs meu-container

Opções úteis:

  • -f → segue os logs em tempo real (como tail -f).

  • --tail 100 → mostra apenas as últimas 100 linhas.

Exemplo:

docker logs -f --tail 50 meu-container

Isso acompanha os últimos 50 registros continuamente.

Monitorando métricas (docker stats)

O comando docker stats exibe estatísticas de uso de recursos em tempo real:

docker stats

Informações exibidas:

  • CPU %

  • Memória usada / limite

  • Uso de rede (I/O)

  • Leitura/escrita em disco

  • Número de processos ativos

Exemplo filtrando apenas um container:

docker stats meu-container

Executando comandos dentro do container (docker exec)

Permite abrir uma sessão ou rodar comandos diretamente dentro de um container ativo.

Executar um comando simples:

docker exec meu-container ls /app

Abrir um shell interativo:

docker exec -it meu-container bash
  • -it → modo interativo com terminal.

  • bash → abre o shell dentro do container (se disponível).

  • Alternativa: sh em containers mais leves (como Alpine).

Casos de uso práticos

  • Logs: acompanhar erros e mensagens da aplicação.

  • Stats: monitorar consumo de recursos em produção.

  • Exec: depurar problemas ou inspecionar arquivos dentro do container.

Dicas avançadas

Combine docker logs com ferramentas como grep para filtrar mensagens:

docker logs meu-container | grep "ERROR"

Use docker exec para instalar pacotes temporários em containers de teste.

Automatize monitoramento com docker stats --no-stream para capturar apenas uma leitura instantânea.

Registries e versionamento de imagens (Docker Hub, GitHub, AWS ECR)

Os registries são repositórios centralizados onde imagens Docker podem ser armazenadas, versionadas e compartilhadas. Eles permitem que equipes distribuam aplicações de forma padronizada e segura.

O que são registries?

  • Registries são serviços que armazenam imagens Docker.

  • Funcionam como um "hub" para publicar e baixar imagens.

  • Podem ser públicos (qualquer pessoa acessa) ou privados (restritos a uma organização).

Principais registries

Registry Características principais
Docker Hub Registry oficial do Docker. Oferece repositórios públicos e privados. É o mais usado para compartilhar imagens open-source.
GitHub Container Registry (GHCR) Integrado ao GitHub. Permite versionar imagens junto ao código-fonte e controlar acesso via GitHub Actions.
AWS Elastic Container Registry (ECR) Serviço da AWS para armazenar imagens de forma segura e integrada ao ecossistema AWS (ECS, EKS, Lambda). Suporta autenticação via IAM.

Versionamento de imagens

  • Cada imagem pode ter tags que funcionam como versões.

  • Exemplo:

docker build -t usuario/app:1.0 .
docker build -t usuario/app:2.0 .
  • A tag latest é atribuída por padrão, mas não é recomendada em produção (pode gerar inconsistências).

  • Boas práticas:

    • Usar semântica de versão (1.0.0, 2.1.3).

    • Criar tags específicas para ambientes (dev, staging, prod).

Fluxo de trabalho com registries

Docker Hub

docker login
docker tag minha-imagem:1.0 usuario/minha-imagem:1.0
docker push usuario/minha-imagem:1.0

GitHub Container Registry

docker login ghcr.io -u usuario
docker tag minha-imagem:1.0 ghcr.io/usuario/minha-imagem:1.0
docker push ghcr.io/usuario/minha-imagem:1.0

AWS ECR

1. Criar repositório no ECR:

aws ecr create-repository --repository-name minha-imagem

2. Autenticar no ECR:

aws ecr get-login-password --region us-east-1 | \
docker login --username AWS --password-stdin <ID>.dkr.ecr.us-east-1.amazonaws.com

3. Enviar imagem:

docker tag minha-imagem:1.0 <ID>.dkr.ecr.us-east-1.amazonaws.com/minha-imagem:1.0
docker push <ID>.dkr.ecr.us-east-1.amazonaws.com/minha-imagem:1.0