Capítulo 2: Dockerizar una App FastAPI

Por: Artiko
dockerfastapidockerfileregistrykubernetes

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:

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:

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.