Aula 14: Conteinerização
chroot
Adicionar usuário ao grupo docker:
sudo usermod -aG docker $USER
Será necessário fazer logout e login novamente.
docker --version docker run hello-world
Listar containers em execução:
docker ps
Listar todos os containers:
docker ps -a
Listar todas as imagens:
docker images
Dockerfile
FROM
RUN
COPY
ADD
WORKDIR
ENV
EXPOSE
CMD
ENTRYPOINT
# Imagem base FROM python:3.11-slim # Define diretório de trabalho WORKDIR /app # Copia arquivo de dependências COPY requirements.txt . # Instala dependências RUN pip install --no-cache-dir -r requirements.txt # Copia código da aplicação COPY . . # Expõe porta EXPOSE 8000 # Comando para executar a aplicação CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
docker build -t nome-da-imagem:tag .
Exemplo:
docker build -t meu-app:1.0 .
O . indica o diretório atual como contexto de build.
.
docker run [opções] imagem [comando]
Opções comuns:
-d
-p
-v
--name
-e
--rm
docker run -d \ --name meu-app \ -p 8000:8000 \ -v $(pwd)/data:/app/data \ -e DEBUG=False \ meu-app:1.0
# Listar containers em execução docker ps # Listar todos os containers docker ps -a # Ver logs de um container docker logs nome-container # Executar comando em container docker exec -it nome-container bash # Parar container docker stop nome-container # Remover container docker rm nome-container
python
nginx
postgres
node
Baixar uma imagem:
docker pull python:3.11
# Login docker login # Tag da imagem docker tag meu-app:1.0 usuario/meu-app:1.0 # Push docker push usuario/meu-app:1.0
docker-compose.yml
services: nome-do-servico: image: imagem:tag # imagem do Docker Hub build: ./diretorio # ou build local container_name: nome # nome fixo do container ports: - "8080:80" # host:container volumes: - ./local:/container # bind mount - dados:/app/data # volume nomeado environment: - VARIAVEL=valor depends_on: - outro-servico restart: unless-stopped
build
services: web: # Build simples build: . # Build com opções build: context: ./app dockerfile: Dockerfile.prod args: - ENV=production
ports
services: web: ports: # porta_host:porta_container - "8080:80" # apenas porta do container (host aleatória) - "80" # especificando IP do host - "127.0.0.1:8080:80" # protocolo UDP - "53:53/udp"
environment
services: web: # Lista de variáveis environment: - DEBUG=false - SECRET_KEY=chave123 # Ou formato de mapa environment: DEBUG: "false" SECRET_KEY: chave123 # Arquivo externo env_file: - .env - .env.local
depends_on
services: web: depends_on: - db - redis db: image: postgres:15 redis: image: redis:alpine
Atenção: depends_on garante ordem de início, mas não que o serviço esteja pronto para receber conexões.
restart
services: web: restart: unless-stopped
Opções:
no
always
on-failure
unless-stopped
Bind Mounts (./codigo:/app)
./codigo:/app
./
/
Volumes Nomeados (dados:/app/data)
dados:/app/data
/var/lib/docker/volumes/
services: web: volumes: - ./codigo:/app # bind mount - dados:/var/lib/dados # volume nomeado db: volumes: - postgres_data:/var/lib/postgresql/data volumes: dados: postgres_data: dados_externos: external: true # volume já existente
services: web: networks: - frontend - backend db: networks: - backend networks: frontend: backend: internal: true # sem acesso externo
Containers na mesma rede se comunicam pelo nome do serviço.
# Iniciar serviços (em foreground / em background) docker compose up docker compose up -d # Reconstruir e iniciar docker compose up -d --build # Parar serviços / parar e remover volumes docker compose down docker compose down -v # Ver serviços e logs docker compose ps docker compose logs -f web
# Executar comando em container rodando docker compose exec web python manage.py migrate docker compose exec web bash # Executar em container único (sem serviço rodando) docker compose run web python manage.py createsuperuser # Parar/iniciar/reiniciar serviços docker compose stop docker compose start docker compose restart web # Escalar serviços docker compose up -d --scale web=3
# docker-compose.yml services: db: environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
# .env POSTGRES_DB=meu_banco POSTGRES_USER=usuario POSTGRES_PASSWORD=senha_segura
services: web: healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s
Permite verificar se o serviço está realmente pronto.
.env
.gitignore
restart: unless-stopped
*.pyc __pycache__ *.pyo *.pyd .Python env/ venv/ .venv/ .git .gitignore .dockerignore *.md .env db.sqlite3 *.log
Reduz o contexto de build e evita enviar arquivos sensíveis.