Docker es una herramienta que nos permite trabajar con contenedores de forma muy ágil, fácil y eficiente. Está muy extendida entre desarrolladores y es casi un deber saberlo a día de hoy. Sin embargo, ¿Siempre es necesario usarlo? ¿Merce la pena? Una herramienta por ser buena no siempre tiene que serlo. "No usamos un martillo para instalar cristales"
Personalmente, llevo trabajando varios años con Docker, he tenido experiencia en implantar Docker desde cero en algunas empresas, estar trabajando con contenedores e imágenes a diario. Cuando estaba trabajando todos los días con Docker, cualquier aplicación que pasaba por mis manos pensaba que tenía que trasladarse a un contenedor, sin importar el tiempo que llevase ejecutándose, el entorno o cualquier factor. Sin embargo, en una de las últimas charlas que di en la Universidad de Córdoba, concretamente en la asignatura de Programación y administración de sistemas surgió la pregunta que me hizo reflexionar y por la que surge el post.
Entiendo Docker pero, ¿Qué ventaja me supone para un Wordpress multisitio que manejamos la migración a Docker?
La respuesta es sencilla: Ninguna
Analicemos el entorno
Se plantea un escenario similar al siguiente: Existe un VPS donde se tiene un Wordpress totalmente configurado donde no se realizan modificaciones de plugins, solo se encargan de configurar parámetros y subir algún plugin que ya ha sido testado, además no dará problema alguno.
Mover eso a docker implica tener que migrar toda la base de datos, plugins (con las tediosas versiones de PHP), configurar Apache, sus plugins y todo el jaleo que supone instalar Wordpress. Todo ese tiempo invertido para simplemente dejarlo funcionando en el mismo sitio, con las mismas prestaciones.
Aquí Docker aporta más bien poco, aparte de una aventura interesante y mucho aprendizaje en el camino. Pero dado que no es el objetivo en estos casos no consideraría el implementar Docker.
¿Pero si me lanzo a la aventura que aportamos?
Si nos lanzamos a la aventura y conseguimos que funcione tenemos una gran ventaja. Un entorno homogéneo donde probar absolutamente lo que queremos y más importante nos aseguramos que al subirlo a producción funcionará.
Tendremos un entorno fiable donde podremos eliminar todo el código (puesto que lo almacenaremos en contenedores) cambiarlo, reconstruirlo sin ningún tipo de temor, puesto que tenemos una infraestructura que nos permitirá esa posibilidad.
¿Cuándo si lo utilizaríamos?
Podemos tener un abanico amplio de ejemplos donde utilizar Docker, desde aplicaciones sencillas, como trataremos en este post, hasta estructuras de microservicios como existen en Netflix o servicios similares.
Manteniendo el ejemplo sencillo seguimos con el anterior escenario. Si tuviésemos un proyecto de Wordpress donde estuviésemos de forma constante probando plugins o creando plugins personalizados, sería un escenario donde Docker sería muy beneficioso. La razón es sencilla, cuando estamos realizando nuevos desarrollos o actualizaciones van acompañados de librerías de terceros o cambios de versiones, elementos que siempre tienden a causar errores garrafales.
Docker para entornos de desarrollo
Quizás este sea uno de los usos más comunes. ¿Cómo podemos probar que nuestro código funciona igual en nuestro entorno local que en producción? Precisamente con un entorno homogéneo como el que nos da un contenedor.
Cuando estamos desarrollando código es necesario poder tener exactamente el mismo entorno en local, pre-producción y producción para evitar un desastre garrafal en una actualización. ¿Cómo encaja Docker en este sentido? Lo podemos ver con dos situaciones comunes:
1. Configurando entornos locales
El entorno ideal sería que cualquier desarrollador tuviese una réplica de los contenedores de producción en local (con esto cualquier persona del equipo tiene el mismo entorno), sobre estos contenedores podrán desarrollar y comprobar de forma certera si las librerías son compatibles, así como el mismo código que desarrollan.
2. Pre - Producción - CI/CD
Cuando los desarrolladores tengan una versión (alpha, Beta, final o como queramos llamarla) podrá ser testeada dentro de un entorno seguro, exactamente igual al de producción sin riesgo alguno.
La clave: Siempre mantenemos la seguridad de que todos los entornos son homogéneos.
Local
Comprobación de conflictos con diferentes versiones
Testing
Los nuevos desarrollos podrán ser comprobados frente al entorno de producción de corma exacta
Producción
No existirán problemas en el momento de la actualización
Docker soluciona el gran problema de tener el mismo entorno independientemente de donde ejecutemos.
¿Cómo sería un flujo ideal de trabajo con Docker?
En el desarrollo de cualquier aplicación, la mejor opción siempre sería crear imágenes propias para las sucesivas versiones. De esta forma podemos distribuir el software de forma personalizada.
Una vez creada la imagen por primera vez, asegurando que cumplimos con las características de una buena imagen como pueden ser:
- Poco tamaño utilizando imágenes base reducidas
- Incluir el menor número de capas
- Instalar solo lo necesario
- Compilar dependencias en etapas intermedias e importando el resultado
Tendríamos que montar un registro para poder almacenar las imágenes de las versiones y para poder distribuirlo con facilidad. Esto se requiere para evitar reconstruir la misma imagen en diferentes entornos y reducir el tiempo de despliegue.
A partir del registro, cualquier desarrollador podrá montar su contenedor y comenzar a realizar todas las pruebas, actualizaciones y/o romper el código como desee sin riesgo alguno y nos aseguramos de que todos los cambios válidos podrán ser desplegados a producción sin problema (tema muy interesante que veremos en otros art´iculos :P).
A modo de conclusión, podemos llegar decir que Docker es muy útil cuando tenemos un entorno cambiante, bien en librerías o código y es necesario poder trabajar sobre el mismo entorno para asegurar que todo funcionará de forma correcta. ¿Es el único motivo? NO. Existen otros casos como sería para despliegues y mundo Devops y como nos facilita la vida, pero eso es tema para otro día.
Docker ¿Cuándo usarlo y por qué?