Docker Container listo para producción
¿Qué características debe tener una imagen Docker para ser considerada production ready?
Esta fue la primera pregunta que me hice cuando comencé Mi aventura con Docker. Googleando encontré muchos artículos sobre production ready Docker images, pero en todos ellos siempre había algún aspecto con el que no estaba del todo de acuerdo.
Comparando toda la información, y agregando algunos requerimientos propios, construí la siguiente lista que, a mi entender, describe un Docker Container Production Ready:
La imagen debe tener el menor tamaño posible y en ningún caso superar los 200MB.
No debe usar servidores web de debugging
Un mismo código para crear una sola imagen que funcione en todos los ambientes (desarrollo, testing, producción, etc.)
El desarrollador sólo debe conocer las credenciales del ambiente de desarrollo
El código fuente debe contener la menor cantidad de archivos extra posible
Veamos estas características con un poco más en detalle.
Tamaño menor a 200MB
La primer regla de las mejores prácticas de Docker es mantener las imágenes pequeñas. La idea es que las imágenes sean lo más pequeñas posible, lo que genera la pregunta ¿cuál es el tamaño máximo recomendable? Consultando con mis colegas determinamos que 200MB debería ser el límite máximo.
No usar servidores web de debugging
En varios artículos se muestra cómo crear imágenes con aplicaciones Python pero utilizando el servidor web de debugging que viene con los frameworks Flask o Django. Estos servidores están preparados para depurar nuestro código y no para gestionar cientos de peticiones simultáneas.
Una imagen, todos los ambientes
El desarrollador escribe código que publica en un servidor GIT y este código se utilizará para crear una imagen Docker. En base a esta única imagen se deben crear los contenedores en Testing, Homologación, Producción y cualquier otro ambiente necesario.
El desarrollador sólo conoce desarrollo
Hay muchas estrategias para manejar configuraciones de múltiples ambientes en nuestro código. Pero, ¿por qué el desarrollador debería conocer las credenciales de producción? ¿No supone esto un problema de seguridad?
El desarrollador debe conocer sólo las credenciales del entorno de Desarrollo y la imagen de Docker debe estar preparada para adaptarse a los diferentes entornos.
El código fuente es para la aplicación, no para servicios
He visto varios artículos que sugieren agregar, en nuestro código fuente, archivos de configuración de servidores como Apache, Nginx, uWSGI, e incluso Supervisord. En mi opinión, el código fuente debe referirse sólo a la aplicación. La única excepción es el archivo Dockerfile en base al cual se crearán las imágenes Docker.
De esta manera intenté resumir los 5 requisitos básicos que entiendo debe tener una Imagen Docker para ser considerada production ready. ¿Te parece que un contenedor productivo debería tener otra característica?
Como paso siguiente te voy a mostrar una imagen Docker para aplicaciones Python/Flask. ¡Hasta la próxima!