Conceitos Fundamentais
Container vs VM
- Containers partilham o kernel
- Mais leves e rápidos
- Isolamento ao nível do SO
- VMs virtualizam hardware
- Inicialização em segundos
Imagens
- Templates só de leitura
- Camadas (layers)
- Registry (Docker Hub)
- Tags para versões
- Multi-stage builds
Containers
- Instância de uma imagem
- Estado efémero por defeito
- Volumes para persistência
- Redes virtuais
- Port forwarding
Dockerfile Exemplo
# Imagem base
FROM python:3.11-slim
# Metadados
LABEL maintainer="francisco@email.com"
LABEL version="1.0.0"
# Diretório de trabalho
WORKDIR /app
# Copia ficheiros
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copia código
COPY . .
# Expõe porta
EXPOSE 5000
# Comando inicial
CMD ["python", "app.py"]
Docker Compose
services:
web:
image: nginx:alpine
container_name: my-web
ports:
- "8080:80"
volumes:
- "./html:/usr/share/nginx/html:ro"
restart: unless-stopped
networks:
- app-network
db:
image: postgres:15
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
postgres_data:
Comandos Essenciais
Imagens
- docker pull nginx - descarregar
- docker images - listar
- docker rmi nome - remover
- docker build -t nome . - construir
- docker tag img novo:tag - etiquetar
Containers
- docker run -d - detached
- docker ps - listar ativos
- docker ps -a - todos
- docker stop/start nome
- docker rmnome - remover
Debug & Logs
- docker exec -it nome bash
- docker logs nome
- docker inspect nome
- docker stats nome
- docker top nome
Exemplos Práticos
francisco@docker:~$ docker run -d -p 8080:80 --name site nginx:alpine
# Cria container nginx na porta 8080
francisco@docker:~$ docker-compose up -d --build
# Constrói e inicia serviços
francisco@docker:~$ docker exec -it db psql -U postgres
# Entra no PostgreSQL
francisco@docker:~$ docker network ls && docker network inspect app_default
# Ver redes e containers conectados
francisco@docker:~$ docker system df && docker system prune -a
# Espaço em disco e limpeza