Docker: Configuración, Seguridad y Uso en Producción

Alejandro

Guía completa sobre Docker: desde la configuración básica hasta las mejores prácticas de seguridad y su uso en entornos de producción.

¿Qué es Docker?

Docker es una plataforma de contenedorización que permite empaquetar aplicaciones y sus dependencias en contenedores ligeros y portables. Esto facilita el despliegue y la gestión de aplicaciones en diferentes entornos.

Configuración básica de Docker

Instalación

Para instalar Docker en Linux:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER

Dockerfile básico

Un Dockerfile típico para una aplicación Python/Django:

FROM python:3.12-slim

WORKDIR /app

# Instalar dependencias del sistema
RUN apt-get update && apt-get install -y \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/*

# Copiar requirements
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Copiar código de la aplicación
COPY . .

# Exponer puerto
EXPOSE 8000

# Comando por defecto
CMD ["gunicorn", "xestor.wsgi:application", "--bind", "0.0.0.0:8000"]

Seguridad en Docker

Mejores prácticas de seguridad

  • Usar imágenes oficiales y actualizadas: Siempre usa imágenes base oficiales y mantenlas actualizadas.
  • Ejecutar como usuario no root: Crea un usuario sin privilegios en el contenedor.
  • Minimizar la superficie de ataque: Usa imágenes minimalistas (Alpine, Slim) y solo instala lo necesario.
  • Gestionar secretos de forma segura: Usa Docker Secrets o variables de entorno, nunca hardcodees credenciales.
  • Escanear imágenes: Usa herramientas como Trivy o Snyk para detectar vulnerabilidades.
  • Limitar recursos: Configura límites de CPU y memoria para prevenir ataques DoS.

Ejemplo de Dockerfile seguro

FROM python:3.12-slim

# Crear usuario no root
RUN groupadd -r appuser && useradd -r -g appuser appuser

WORKDIR /app

# Instalar solo dependencias necesarias
RUN apt-get update && apt-get install -y --no-install-recommends \
    postgresql-client \
    && rm -rf /var/lib/apt/lists/*

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# Cambiar a usuario no root
USER appuser

EXPOSE 8000

CMD ["gunicorn", "xestor.wsgi:application", "--bind", "0.0.0.0:8000"]

Docker Compose para producción

Un docker-compose.yml seguro para producción:

version: '3.8'

services:
  web:
    build: .
    restart: unless-stopped
    ports:
      - "8000:8000"
    environment:
      - DEBUG=False
      - SECRET_KEY=${SECRET_KEY}
    volumes:
      - static_volume:/app/static
      - media_volume:/app/media
    depends_on:
      - db
    networks:
      - app_network
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 1G

  db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      - POSTGRES_DB=xestor
      - POSTGRES_USER=xestor_user
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - app_network

volumes:
  static_volume:
  media_volume:
  postgres_data:

networks:
  app_network:
    driver: bridge

¿Es Docker una buena opción para producción?

Ventajas

  • Consistencia: El mismo entorno en desarrollo, staging y producción.
  • Aislamiento: Cada aplicación corre en su propio contenedor.
  • Escalabilidad: Fácil escalado horizontal con Docker Swarm o Kubernetes.
  • Portabilidad: Funciona en cualquier sistema que soporte Docker.
  • Versionado: Puedes versionar tus imágenes y hacer rollbacks fácilmente.

Consideraciones

  • Curva de aprendizaje: Requiere conocimiento de Docker y orquestación.
  • Overhead: Aunque mínimo, existe un pequeño overhead de recursos.
  • Gestión de datos: Necesitas estrategia para volúmenes y backups.
  • Monitoreo: Requiere herramientas adicionales para monitoreo y logging.

Conclusión

Sí, Docker es una excelente opción para producción, especialmente si:

  • Tienes múltiples servicios o microservicios
  • Necesitas escalabilidad y alta disponibilidad
  • Quieres consistencia entre entornos
  • Tienes un equipo que conoce Docker

Para proyectos pequeños o simples, puede ser excesivo, pero para la mayoría de aplicaciones modernas, Docker ofrece ventajas significativas que justifican su uso en producción.

Compartir

Sobre el autor

Alejandro

Desarrollador

Desarrollador web especializado en Django y Python, con pasión por la tecnología y la innovación.