Capítulo 2: Dockerizar una App FastAPI
Dockerfile optimizado
Crear Dockerfile en la raíz del proyecto:
FROM python:3.12-slim AS base
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY main.py .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Puntos clave:
python:3.12-slim— imagen base ligera (~150MB vs ~1GB de la completa)--no-cache-dir— no guardar cache de pip, reduce tamaño--host 0.0.0.0— escuchar en todas las interfaces (necesario en containers)
Construir y probar la imagen
# Construir
docker build -t fastapi-k8s:v1 .
# Probar localmente
docker run -p 8000:8000 fastapi-k8s:v1
# Verificar
curl http://localhost:8000/
curl http://localhost:8000/health
Subir al registry
Opción A: Registry local con k3s
k3s soporta imágenes importadas directamente:
# Exportar imagen
docker save fastapi-k8s:v1 -o fastapi-k8s.tar
# Importar en k3s
sudo k3s ctr images import fastapi-k8s.tar
# Verificar
sudo k3s crictl images | grep fastapi
Opción B: Registry local con minikube
# Usar el Docker daemon de minikube
eval $(minikube docker-env)
# Construir directamente en minikube
docker build -t fastapi-k8s:v1 .
# Ya está disponible en el cluster
Opción C: Docker Hub
# Tag para Docker Hub
docker tag fastapi-k8s:v1 tu-usuario/fastapi-k8s:v1
# Push
docker push tu-usuario/fastapi-k8s:v1
.dockerignore
Crear .dockerignore para reducir el contexto de build:
.venv/
__pycache__/
*.pyc
.git/
.env
k8s/
*.tar
Multi-stage para producción
Para apps más complejas con dependencias compiladas:
FROM python:3.12-slim AS builder
WORKDIR /build
COPY requirements.txt .
RUN pip install --no-cache-dir --prefix=/install -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /install /usr/local
COPY main.py .
RUN useradd -r appuser && chown -R appuser /app
USER appuser
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Mejoras:
- Multi-stage — separa build de runtime, imagen final más pequeña
- Usuario no-root — mejor seguridad
- COPY selectivo — solo copia lo necesario
Verificar tamaño de imagen
docker images fastapi-k8s
# REPOSITORY TAG IMAGE ID SIZE
# fastapi-k8s v1 abc123 ~180MB
Con la imagen lista, en el siguiente capítulo la desplegamos en Kubernetes con Deployments y Pods.