Los 12 factores para aplicaciones en Docker Swarm

Clase 5 de 24Curso de Swarm

Resumen

Desplegar en Docker Swarm exige rigor: si tu aplicación no cumple los 12 factores de la aplicación, administrar y escalar se vuelve frágil. Aquí encontrarás una guía clara y accionable, basada en los puntos clave explicados, para validar si tu código, dependencias y operaciones están realmente listas para producción en contenedores.

¿Qué exige Docker Swarm para que tu app esté lista?

Para evitar sorpresas al ejecutar en Docker Swarm, conviene alinear el diseño con el consenso de la industria: los 12 factores. Así reduces fricción operativa, facilitas despliegues y aprovechas la escalabilidad horizontal sin ataduras al servidor.

¿Cómo debe ser tu code base y tus dependencias?

  • Code base: una relación 1:1 entre repositorio y aplicación. Si hay muchos repositorios, son muchas aplicaciones colaborando. Si un repositorio genera varias apps con flags de build, debes separar repositorios y compartir dependencias comunes.
  • Repositorio versionado: preferentemente Git, aunque podría ser SDN u otra solución, siempre con control de versiones.
  • Dependencias declaradas: listas en un archivo versionable (por ejemplo, un manifest) e incluidas con la app al publicarla. No dependas de librerías “ya instaladas” en la máquina destino.
  • Aislamiento: las dependencias de una app no deben interferir con otras. Empaqueta lo necesario y define ambientes aislados.

¿Cómo gestionar configuración y backing services?

  • Configuración por ambiente: mismo código para desarrollo, pruebas y producción; cambia solo la configuración. Inclúyela en la imagen o pásala como variables de entorno al correr el contenedor.
  • Nada en el servidor: evita “configurados a mano” en el host. Todo debe viajar con el entregable o inyectarse al correr.
  • Backing services externos: trata la base de datos, caché o almacenamiento de archivos como servicios externos. Tu app es, por ejemplo, la REST API; MySQL es un servicio aparte, configurable por conexión.

¿Qué separan build, release y run?

  • Build → Release → Run: fases independientes. El run jamás debe compilar ni construir artefactos; solo inyectar configuración.
  • Ejemplo práctico: si usas TypeScript sobre Node.js, compila antes del despliegue. No ejecutes “npm build” en producción.
  • Entregable listo: publica imágenes con el código ya construido. Luego, solo ejecútalas.

¿Cómo asegurar procesos stateless, exposición y escalado?

Diseñar procesos simples, desechables y sin estado local vuelve predecible el escalado en Swarm. Esto habilita reemplazos rápidos y tolerancia a fallos.

¿Por qué tu proceso debe ser stateless?

  • Stateless: que no dependa de archivos locales ni memoria del contenedor para funcionar correctamente.
  • Estado fuera: si necesitas estado compartido (p. ej., sockets en tiempo real), usa un Redis con Socket.IO adapter como servicio externo.
  • Unidad atómica: cada instancia debe poder atender cualquier trabajo sin acoplamientos al nodo.

¿Cómo exponer la app con port binding?

  • Port binding directo: la aplicación debe exponerse a través de un puerto propio en el host.
  • Sin intermediarios: evita contenedores servlet como Tomcat o servidores como HTTPD/Apache. La app se sirve a sí misma.
  • Red clara: propicia enrutamiento y balanceo nativos de la plataforma de orquestación.

¿Cómo escalar con concurrencia y disposability?

  • Concurrencia: soporta múltiples instancias en paralelo. Escalado horizontal sin restricciones de proceso único.
  • Disposability: arranca y se apaga rápido ante una señal de terminación. Facilita reemplazos y reubicación.
  • Sin “warm up” pesado: a diferencia de una base de datos con grandes índices en disco, tu servicio debe iniciar ágilmente.

¿Qué prácticas operativas mejoran paridad, observabilidad y administración?

Al alinear desarrollo y producción, observar por streams y administrar con procesos puntuales, proteges la estabilidad del sistema y simplificas el soporte.

¿Cómo lograr dev/prod parity con contenedores?

  • Paridad de entornos: busca que desarrollo y producción sean lo más similares posible.
  • Imágenes consistentes: las imágenes ayudan a reproducir condiciones y reducir sorpresas.
  • Hardware ideal, pero opcional: replicarlo sería perfecto; cuando no se puede, las imágenes ya marcan una gran diferencia.

¿Cómo tratar los logs como flujos?

  • Logs como stream: la app escribe a stdout. No gestiones archivos de log dentro de la app.
  • Colector externo: un proceso aparte recolecta y procesa los eventos sin bloquear.
  • Foco en la app: la aplicación procesa datos; el pipeline de logging se ocupa del resto.

¿Cómo ejecutar admin processes y usar REPL?

  • Procesos administrativos: ejecútalos como procesos independientes, no como “modo administración” de la app.
  • Contexto del servidor: para reindexar o depurar, corre tareas que accedan al estado en memoria del servicio activo.
  • REPL: usa bucles Read–Eval–Print Loop en Node o Ruby para inspeccionar y actuar con el estado actual.

¿Listo para evaluar tus servicios con estos 12 factores? Comparte dudas, casos reales o retos que estés encontrando al llevar tus apps a Docker Swarm.