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