Lab 1: Exercícios Práticos 🏋️♀️
Preparação do Ambiente 🔧
Requisitos
Docker instalado e funcionando
Acesso à internet
Terminal ou PowerShell
Editor de texto de sua preferência
Verificação Inicial
Exercício 1: Primeiro Container 🎯
Objetivo
Criar e executar um container web básico usando nginx.
Passos
Pull da Imagem
# Baixe a imagem oficial do nginx docker pull nginx:alpine # Verifique a imagem docker imagesExecutar Container
# Rode o container docker run -d -p 8080:80 --name meu-nginx nginx:alpine # Verifique se está rodando docker psTeste o Acesso
Abra o navegador: http://localhost:8080
Ou use curl:
curl http://localhost:8080Exploração Básica
# Veja informações do container docker inspect meu-nginx # Verifique os logs docker logs meu-nginx # Veja estatísticas em tempo real docker stats meu-nginx
Exercício 2: Customização 🎨
Objetivo
Personalizar o container nginx com conteúdo próprio.
Passos
Estrutura do Projeto
mkdir -p meu-site/{html,conf,logs} cd meu-siteConfiguração do Nginx
# conf/nginx.conf events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; sendfile on; keepalive_timeout 65; server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; try_files $uri $uri/ =404; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } }Conteúdo HTML Avançado
<!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Docker Lab - Nginx Custom</title> <style> :root { --primary-color: #2496ed; --secondary-color: #403f4c; --accent-color: #e84855; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; margin: 0; padding: 0; background: #f5f5f5; color: var(--secondary-color); } .container { max-width: 800px; margin: 40px auto; padding: 20px; } .card { background: white; border-radius: 8px; padding: 20px; margin-bottom: 20px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); } .header { background: var(--primary-color); color: white; padding: 20px; text-align: center; } .status { display: inline-block; padding: 8px 16px; background: #4CAF50; color: white; border-radius: 20px; font-size: 14px; } .docker-info { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 20px; margin-top: 20px; } .info-item { background: #f8f9fa; padding: 15px; border-radius: 6px; text-align: center; } .footer { text-align: center; margin-top: 40px; padding: 20px; color: var(--secondary-color); } </style> </head> <body> <div class="header"> <h1>🐳 Docker Lab - Nginx Custom</h1> <span class="status">Container Ativo</span> </div> <div class="container"> <div class="card"> <h2>Informações do Container</h2> <div class="docker-info"> <div class="info-item"> <h3>Container ID</h3> <p>CONTAINER_ID</p> </div> <div class="info-item"> <h3>Image</h3> <p>nginx:alpine</p> </div> <div class="info-item"> <h3>Port</h3> <p>80:8080</p> </div> </div> </div> <div class="card"> <h2>Status do Servidor</h2> <ul> <li>Nginx Version: <strong>Latest Alpine</strong></li> <li>Server Status: <strong>Running</strong></li> <li>Configuration: <strong>Custom</strong></li> </ul> </div> </div> <footer class="footer"> <p>Docker Lab Exercise - Created with 💙 by Exercise-chan</p> </footer> </body> </html>Dockerfile Avançado
# Estágio de build FROM nginx:alpine as builder # Instalação de ferramentas de debug RUN apk add --no-cache curl nano htop # Configuração do nginx COPY conf/nginx.conf /etc/nginx/nginx.conf # Configuração do conteúdo COPY html/ /usr/share/nginx/html/ # Criação de diretórios necessários RUN mkdir -p /var/log/nginx \ && mkdir -p /var/cache/nginx # Configuração de permissões RUN chown -R nginx:nginx /var/log/nginx \ && chown -R nginx:nginx /var/cache/nginx \ && chown -R nginx:nginx /usr/share/nginx/html # Healthcheck HEALTHCHECK --interval=30s --timeout=3s \ CMD curl -f http://localhost/ || exit 1 # Exposição da porta EXPOSE 80 # Comando de inicialização CMD ["nginx", "-g", "daemon off;"]Build e Deploy
# Build da imagem docker build -t meu-site:v1 . # Execute com volumes docker run -d \ --name site-custom \ -p 8081:80 \ -v $(pwd)/logs:/var/log/nginx \ -v $(pwd)/html:/usr/share/nginx/html \ meu-site:v1
Exercício 3: Gerenciamento Avançado 🛠️
Objetivo
Explorar recursos avançados de gerenciamento de containers.
Monitoramento Avançado
Backup e Restore
Limitação de Recursos
Exercício 4: Networking Avançado 🌐
Objetivo
Explorar configurações avançadas de rede.
Redes Customizadas
DNS e Service Discovery
Exercise-chan Tips 💡
Desafios Avançados 🌟
Desafio 1: Alta Disponibilidade
[ ] Configure múltiplas réplicas
[ ] Implemente health checks
[ ] Configure restart policies
[ ] Teste failover scenarios
Desafio 2: Segurança
[ ] Configure TLS/SSL
[ ] Implemente rate limiting
[ ] Configure access control
[ ] Faça scanning de vulnerabilidades
Desafio 3: CI/CD
[ ] Crie pipeline de build
[ ] Implemente testes automatizados
[ ] Configure deploy automático
[ ] Implemente versionamento
Troubleshooting Avançado 🔍
Debug Tools
Common Issues Matrix
Problema | Diagnóstico | Solução | Prevenção |
---|---|---|---|
502 Bad Gateway |
| Verificar nginx.conf | Health checks |
Memory Issues |
| Aumentar limites | Monitoramento |
Network Timeout |
| Verificar DNS | Configurar timeouts |
Permission Denied |
| Ajustar chmod/chown | Usar volumes |
Checklist de Conclusão ✅
Básico
[ ] Container nginx rodando
[ ] Página customizada acessível
[ ] Logs funcionando
[ ] Volumes configurados
Intermediário
[ ] Configuração nginx personalizada
[ ] Limites de recursos definidos
[ ] Backup configurado
[ ] Monitoramento ativo
Avançado
[ ] Rede customizada configurada
[ ] Health checks implementados
[ ] Security hardening aplicado
[ ] CI/CD configurado