services

www.docker.io

Docker. Contenedores ligeros para levantar aplicaciones en segundos.

Hola chicas, hoy os voy a hablar de Docker. Aunque todavía no lo conozco mucho ya lo he usado para algún servicio pequeño. Pero para entender bien de que va, echadle un vistazo a estas diapositivas tan majas que se han currado los desarrolladores. (En general el sitio web de Docker es bastante bueno, tiene tutoriales interactivos y el tutorial normal, de toda la vida, tiene un auto test al final para comprobar que has entendido bien el concepto. Tiene un aire educativo muy, muy currado.)

Bien, ahora que habéis entendido un poco de que va os cuento un poco la idea que yo he cogido de todo esto.

Para un administrador de sistemas, en ocasiones, se presenta la necesidad de tener muchos servicios pequeños distintos, o el mismo pero repetido muchas veces. Por ejemplo en un entorno de pruebas, donde los developers necesitan cada uno su chiringuito y quieren ir probando cositas. Lo normal era levantarle una máquina virtual a cada uno con sus necesidades, o varias máquinas virtuales con diferentes versiones del mismo servicio, etc. El gasto de recursos de una máquina virtual, para según que cosas, era desmesurado. Te podías meter perfectamente en decenas de Gigas de disco y ocupar un entorno virtual casi al completo. Para este tipo de situaciones Docker puede resultar útil.

Por ejemplo, levantar un contenedor en Docker que simule un servicio de mysql en un Ubuntu server puede pasar de ocupar varios Gigas en una máquina virtual completa (que no vas a usar entera) a solamente 400 MEGAS en un contenedor de Docker. Porque Docker solamente te va a levantar lo estrictamente necesario (para que os hagáis una idea de lo que significa “lo necesario”, Docker no os va a instalar ni tan si quiera top, ni vim, ni vi ni leches… ¿para qué?). Además, si lo hacéis bien, tampoco vais a saber ni cómo se llama ese host, ni dónde está, ni nada de nada. De nuevo, ¿para qué?. Solo vais a saber que tenéis un contenedor con mysql dentro, con vuestra configuración personal, y punto pelota. Eso sí, vais a necesitar tener una forma de llegar a ella, puesto que Docker (si os leéis la documentación) dice claramente que los contenedores son para usar dentro de Docker. Que es mentira, pero verdad al mismo tiempo. Os montáis un proxy en Docker, por ejemplo Nginx. Y ya en el proxy le decís que cuando alguien venga a Docker preguntando por un puerto, vaya al localhost a ese puerto y engancháis ahí el contenedor para que sea visible desde fuera. Ya os pondré ejemplos de esto.

La gracia es que, cuando tengáis la recetita hecha (Dockerfile) y vuestros ficheros de configuración customizados, podréis lanzar un contenedor o setecientos en cuestión de segundos. Por ejemplo, levantar un contenedor de mysql sobre Debian tarda exactamente 30 segundos. Si vuestra conexión de internet es más lenta, tardará algo más (porque tardará más en bajarse los paquetes de mysql, básicamente). Pero la cuestión es que no tardará más de unas cuantas decenas de segundos. Y tendréis un contenedor que parecerá una Debian a todos los efectos, con vuestro mysql customizado (o vuestro cluster de mysql, que también se puede, amigos). De repente tenéis un racimo de mysql’s en lo que tardáis en ir a por un café y volver, y configurados como queréis.

¿Qué pasa si cambiais algo en el Dockerfile?, ¿volverá a descargarse todo de cero y montarlo limpio?

No, o no necesariamente. Dependerá de vosotros.

El Dockerfile es lineal, se ejecuta desde arriba hacia abajo por ese orden estricto (por eso tenéis que pensar bien los pasos al confeccionarlo, pero no pasa nada, es la forma natural humana de hacer las cosas. Una lista de pasos a seguir, básicamente, ordenados del primero al último). De repente, en el paso 5 se os ha olvidado añadir una instrucción. La añadís y volvéis a lanzar el contenedor. Él mirará qué pasos antes del 5 están hechos ya y en el orden correcto y no los repetirá. Empezará a partir del nuevo paso que, y aquí viene lo bonito de Docker, se comporta como Git. Sí, amigos. Se registran los cambios como los “commits” de Git y podéis resetear al gusto, volver atrás, etc. Como veis, Docker mantiene una filosofía de ahorrar tiempo en los procesos. ¿Que de repente has metido la pata?, no pasa nada, vuelves al punto previo antes de meterla y continúas. No tienes que empezar de cero. Y además se puede considerar esto auditoría (aunque anónima), y ver qué cambios se han hecho en un contenedor cuando las cosas no funcionan como deben.

Otra cosa que no os he contado sobre Docker que está muy bien es que Docker dispone de un repositorio de contenedores genéricos. Por ejemplo, si quieres una Ubuntu limpia, solo tienes que ejecutar:

docker pull ubuntu

Se descargará una lista de contenedores de Ubuntu por versiones, para que dispongáis de la versión que necesitéis en cada momento. Si ejecutáis el comando “docker images” podréis ver los contenedores disponibles:

root@docker:~$ docker images
REPOSITORY        TAG        IMAGE ID              CREATED       VIRTUAL SIZE
ubuntu                       13.10      9f676bd305a4     3 weeks ago     178 MB
ubuntu                       saucy      9f676bd305a4     3 weeks ago     178 MB
ubuntu                       13.04      eb601b8965b8    3 weeks ago     166.5 MB
ubuntu                       raring     eb601b8965b8    3 weeks ago     166.5 MB
ubuntu                       12.10       5ac751e8d623      3 weeks ago     161 MB
ubuntu                       quantal  5ac751e8d623      3 weeks ago     161 MB
ubuntu                       10.04      9cc9ea5ea540      3 weeks ago     180.8 MB
ubuntu                       lucid        9cc9ea5ea540      3 weeks ago     180.8 MB
ubuntu                       12.04      9cd978db300e    3 weeks ago     204.4 MB
ubuntu                       latest      9cd978db300e    3 weeks ago     204.4 MB
ubuntu                       precise   9cd978db300e    3 weeks ago     204.4 MB

Pero no solamente existe el repositorio oficial. En esta web tenéis un índice de contenedores Docker de todo tipo, hechos por usuarios o bien desde cero o bien usando los oficiales, etc.

Podéis jugar con el tutorial de la propia web, que está muy bien. En el próximo post hablaré de cómo configurar Nginx para acceder a los contenedores desde fuera.

Recursos: