Docker: Configuración, Seguridad y Uso en Producción
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 $USERDockerfile 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.
Sobre el autor
Alejandro
Desarrollador
Desarrollador web especializado en Django y Python, con pasión por la tecnología y la innovación.
