O problema
Você já sabe subir um container. Mas aplicação real raramente é um container só. Um app web típico tem:
- Aplicação (Python/Node/Go)
- Banco de dados (PostgreSQL, Redis)
- Talvez um worker, um proxy reverso, um message broker
Subir cada um na mão com docker run --network --volume --link é possível, mas depois de 3 containers vira bagunça. O Docker Compose resolve isso: você descreve todos os containers num arquivo YAML e sobe tudo com docker compose up.
Exemplo: Flask + Redis
Vamos criar um contador de visitas: Flask serve a página, Redis armazena o contador.
Estrutura do projeto
compose-demo/
├── docker-compose.yml
├── app/
│ ├── Dockerfile
│ ├── requirements.txt
│ └── app.pyapp.py
from flask import Flask
import redis
import os
app = Flask(__name__)
r = redis.Redis(host=os.environ.get('REDIS_HOST', 'redis'), port=6379)
@app.route('/')
def home():
visits = r.incr('visits')
return f'Visitas: {visits}'requirements.txt
flask
redisDockerfile
FROM python:3.13-alpine
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]docker-compose.yml
services:
web:
build: ./app
ports:
- "5000:5000"
environment:
- REDIS_HOST=redis
depends_on:
- redis
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
volumes:
redis-data:Subir
Antes, verifique que o plugin do Docker Compose está instalado:
No Ubuntu/Debian:
sudo apt install docker-compose-v2
No Fedora/RHEL:
sudo dnf install docker-compose
docker compose up --build -d
Container compose-demo-web-1 Recreate
Container compose-demo-web-1 Recreated
Container compose-demo-redis-1 Starting
Container compose-demo-redis-1 Started
Container compose-demo-web-1 Starting
Container compose-demo-web-1 Startedcurl http://localhost:5000
Visitas: 1curl http://localhost:5000
Visitas: 2Dois comandos e tudo está executando: Flask na porta 5000, Redis isolado, volume persistente pra não perder dados, rede interna entre os containers.
Parte 1 concluída. Você entendeu o que é um container da syscall até o Docker Compose. Na Parte 2: o problema de escala e como o Kubernetes resolve.