¿Qué es Docker?

¿Cuántas veces habéis comprado un libro y no lo habéis leído hasta que han pasado unos meses, aún sabiendo que os va gustar o que os va a ser útil desde el primer momento que os pongáis a leerlo? Pues esto es lo que me ha pasado con docker, compré un curso el año pasado y hasta hace un mes no me puse a mirarlo, mal. Después de terminarlo tengo muy claro que todos los proyectos que haga mínimamente serios van a estar dockerized.

 

¿Qué es exactamente Docker?

Una de las razones por las que me costó tanto ponerme a aprender docker era por que no terminaba de entender que era cuando buscaba por google, encontraba frases muy marketinianas que no me decían nada o frases demasiado largas y altamente técnicas que un sysadmin sí entendería.

A mí me gusta explicarlo como que docker es una herramienta para crear contenedores (casi como si fuera una máquina virtual) con un sistema operativo que puedo crear a través de un fichero de texto y donde puedo instalar aplicaciones y comandos sin que interfieran (aislado) con mi máquina anfitriona. También puedo usar este fichero de texto para desplegar mi contenedor en Amazon Web Services o Google Cloud. Por tanto docker es una herramienta que me sirve tanto en la fase de desarrollo como en la de despliegue a producción.

Un punto fuerte de docker es la flexibilidad a la hora de usarlo o no en las diferentes fases del desarrollo y entornos. A continuación os explicaré para que puede servir docker en las mismas.

 

Docker en local.

En cuanto al entorno que usan los desarrolladores en su día a día, docker se suele usar para homogeneizar el entorno entre los diferentes usuarios en el que van a trabajar los diferentes integrantes del equipo. Por ejemplo, si tenemos dos personas trabajando en Windows y un freelance que dispone de un Mac, podemos usar el contenedor docker para arrancar la aplicación dentro de un ubuntu 16. De esta manera conseguimos que no haya problemas sobre como se comporta la aplicación en un sistema operativo u otro, quitándonos problemas del tipo rutas case sensitive o similares, aunque sobretodo, con este enfoque el entorno de desarrollo va ser exactamente el mismo que se usará en producción, evitando sorpresas y mejorando la comprensión por parte de todo el equipo de como está funcionando la aplicación en el servidor final ya que, funciona igual que en sus ordenadores.

El contenedor docker se crea a través de una imagen de docker, que a su vez se crea a partir de un fichero llamado Dockerfile, al ser un fichero la base de nuestros contenedores podemos incluirlo en el sistema de control de versiones y mantenerlo como otro fichero cualquiera, al hacer esto, lo que que realmente estamos haciendo es versionar el sistema operativo en el que va a operar nuestra aplicación.

La Dockerfile también permite a los desarrolladores subir versiones del software o dependencias de la aplicación con modificar una sola línea: ¿Qué han sacado el nuevo ubuntu server? Vamos a la Dockerfile y cambiamos el 16.04 por el 18.04. ¿Qúe hay una nueva versón de NodeJS? Pues cambiamos también la versión que se descarga en las instrucciones de la Dockerfile.

Finalmente, una característica importante que me ha gustado mucho de docker en desarrollo es el hecho de necesitar ocasionalmente herramientas que sólo voy a usar una vez que terminan "contaminando" mi máquina y tengo que estar cuidándome de eliminarlas luego. Si por ejemplo normalmente desarrollas en nodejs y justamente tienes que hacer un arreglo en un proyecto en Java, puedes buscar una Dockerfile hecha por la comunidad que tiene todo lo que necesitas para compilar con Maven, ejecutarla y eliminar el contenedor una vez terminada la compilación, ni siquiera tienes que preocuparte de si has instalado las versiones correctas de las diferentes dependencias que necesita Maven para compilar un WAR.

Docker en producción.

Cómo hemos avanzado antes, el contenedor docker en producción va a ser el mismo que se ha usado en desarrollo, simplemente vamos a cambiar las variables de entorno para que apunte por ejemplo a la API de Stripe real y no la de test o para que en lugar de que apunte al puerto 3000 apunte al puerto 3001.

Entonces, ¿cómo despliego una aplicación hecha en docker por ejemplo en Amazon Web Services? 

Bien, la verdad es que es bastante fácil, primero tienes que tener instalado el comando docker en tu servidor para poder crear una imagen basada en la Dockerfile y luego para hacer un deploy simplemente tienes que arrancar el contenedor con un comando, igual que en local. De esta manera, cada vez que queramos lanzar la aplicación, la única dependencia que vamos a tener que instalar es el comando docker. Imagínate, montar un entorno de preproducción y producción en cuestión de minutos. O montar un entorno de demo para un cliente en concreto dos meses después de hacer los entornos anteriores.

¿Así de fácil? Sí, bueno, al menos si es un deploy con un sólo servidor.

Si quieres hacer un balanceador de carga es un poco más complicado aunque sea otro de los puntos fuertes de docker, poder crear y eliminar contenedores en cuestión de segundos sin importar en cuántos servidores vas a lanzar el contenedor al mismo tiempo. En este caso ya tienes que tener varios contenedores docker para diferentes partes de la aplicación para poder replicar únicamente algunas de esas partes, por ejemplo si tienes una API REST separada del frontend seguramente te interese únicamente replicar la parte del backend cuando tienes una gran carga.

 

Conclusiones

Para terminar, me gustaría comentar algo que he dejado expresamente para el final y es que: la dificultad con docker está en aprenderlo a usar, si eres un desarrollador y no un sysadmin te va a costar entenderlo a fondo ya que los contenedores no terminan comportándose exactamente igual que un sistema operativo y tiene sus trucos, de ahí que algunas empresas no usen docker en desarrollo, simplemente tienen un proceso de integración continua que empaqueta la aplicación lista para encapsular dentro de la imagen docker, totalmente transparente para los programadores.

A notar también es que docker es un mundo totalmente diferente y a parte de la programación, aunque pueda ahorrar mucho tiempo a los desarrolladores sigue siendo gestión de sistemas y redes. Por mi parte, tuve que invertir dinero en cursos y tiempo para hacer pruebas para que me llegara a compensar el usarlo en desarrollo y producción en mi día a día, algo de lo que por ahora estoy muy contento de haber hecho.

 

¡Saludos!

¿Te ha gustado el artículo? ¿Quieres que te avise de mis próximas publicaciones?

¿Quieres seguir aprendiendo?