Docker ¿Cuándo usarlo y por qué?

¿Si tengo mi entorno montado lo migro a Docker? ¿Cómo sería el entorno que tendría que tener?
20 de marzo de 2024 por
Héctor Romero López
| Sin comentarios aún

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.


Ejemplo de microservicios en Netflix en W3Schools

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:

  1. Poco tamaño utilizando imágenes base reducidas
  2. Incluir el menor número de capas
  3. Instalar solo lo necesario
  4. 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.

Héctor Romero López 20 de marzo de 2024
Compartir
Categorías
Nuestros blogs
Archivar
Identificarse dejar un comentario