En este post veremos los últimos acordes antes de ponernos a tocar la sinfonía. Lo dividiré en dos partes. En la primera, describiremos dos conceptos que nos serán útiles a la hora de trabajar con Docker. En la segunda, haremos un pequeño tutorial de cómo instalar Docker en sistemas sin soporte nativo.

Vamos allá!

Últimos conceptos… por ahora

Veremos dos de ellos: el Docker Hub y la Docker machine.

Docker Hub

En el anterior post vimos el concepto de imágenes como un conjunto de capas que forman los binarios de nuestros entornos (por ejemplo, CentOS 7 + NodeJS 6.9). Pues bien, estas imágenes pueden ser subidas a un repositorio gestionado por los chicos de Docker. Esto es el Docker Hub.

Allí encontrarás una gigantesca cantidad de imágenes ya creadas por otras personas alrededor del mundo. Algunas de ellas tienen la etiqueta de oficial: han sido creadas y son mantenidas por los chicos que están detrás del desarrollo de dichos binarios. Por ejemplo, puedes encontrar imágenes oficiales para entornos con NodeJS.

Al Docker Hub se puede acceder a través de la siguiente URL: https://hub.docker.com/. Hace falta registrarse, pero es gratuíto y no tardarás más de un minuto.

Una vez lo hayas hecho, en el cuadro de búsqueda puedes probar a introducir “node”. El primer resultado está catalogado como oficial. Si lo inspeccionamos, veremos que esta imagen está disponible con varios tags: para la versión 7.4, 6.9, 4.7…

Fijaos en aquellos tags que terminan con alpine y buscad dicha imagen. Alpine es una distribución de Linux que viene con lo básico y que ocupa la friolera de 2 MB (comprimido) y 4 MB (sin comprimir). Comparadlo con el peso de la imagen de CentOS (70MB): si montamos nuestros entornos a partir de Alpine (siempre y cuando una decisión de diseño no nos impida hacerlo), montando sobre él todo lo que necesitemos (un Apache, una JVM etc.) nos libraremos de 68MB de overhead y nuestras imágenes serán muy livianas.

Fijaos ahora, entrando en cualquier imagen, en el recuadro de la derecha, titulado Docker Pull Command: exacto, el Docker Hub está implementado como un SaaS y podremos descargar imágenes a través de su API. Concretamente, el comando docker pull nos permitirá hacer esto sobre línea de comandos.

Docker Hub, como hemos dicho, es gratuíto y su modelo de negocio es muy parecido a Github: con tu cuenta gratuíta, todas tus imágenes serán públicas. Si deseas que sean privadas, tienes que pasar por caja.

Docker machine

Como hemos dicho anteriormente, Docker necesita que el sistema operativo de la máquina anfitrión tenga la capacidad de utilizar chroot, cgroups y namespaces. Esto lo cumple cualquier sistema operativo basado en Unix (Linux o MacOS), Windows Server y Windows 10 Professional.

Pero para versiones anteriores hay que instalar el paquete conocido como Docker Toolbox (lo veremos en la siguiente sección).

Dentro de este paquete se encuentra la Docker machine: es una máquina virtual ligera (~20MB) basada en Linux. Una vez arrancada, dentro de ella tendremos soporte nativo para Docker y podremos ejecutar nuestros comandos para descargar imágenes, lanzar contenedores etc.

Id pensando en una cuestión. Si estamos en Windows 10 Home y hemos instalado la Docker machine, para Docker ¿quién es el host? ¿La máquina física con Windows 10? ¿O la VM que nos proporciona Docker machine? La respuesta, al final del post :)

Instalación de Docker en sistemas sin soporte nativo

Un consejo: a partir de aquí os recomiendo que leais esto desde un PC y que intentéis seguir los pasos a medida que vayáis leyendo.

En primer lugar, necesitamos descargarnos el paquete Docker Toolbox. Con él, entre otras herramientas, nos vendrá la Docker machine y Virtualbox, que es el motor de virtualización que utilizaremos para crear nuestra pequeña máquina virtual Linux que tenga soporte nativo para Docker.

Ahora, tenemos dos caminos.

El más fácil es hacer doble click en el acceso directo que tendremos en el escritorio (si así lo hemos marcado durante la instalación) y se iniciará el proceso de creación de la máquina virtual de la que hablamos.

Pero como sé que os gusta picar comandos, lo haremos de esta manera.

Abrid un terminal, cmd o como queráis llamarle. Y por favor, no uséis el nativo de Windows. Descargaros algo como ConEmu o cmder.

Si picamos

docker-machine create -d virtualbox default

crearemos una máquina virtual de nombre default utilizando el driver para Virtualbox.

Una vez finalizada la ejecución de este comando, si picamos

docker-machine ls

veremos un listado de nuestras máquinas virtuales creadas:

Resultados de docker-machine ls

Resultados de docker-machine ls

Por el momento, sólo fijaos en la columna STATE, que nos indica que la máquina está ejecutándose.

Si ahora hacemos:

docker-machine ssh default

estableceremos una conexión SSH con nuestra máquina. Ahora ya estamos dentro de una máquina con soporte nativo para Docker. Concretamente, una distribución Linux (llamada Boot2Docker) superligera para que el impacto en nuestro equipo sea mínimo.

Antes de terminar, vamos a ejecutar un par de comandos más:

docker login

Esta es la primera vez que vamos a ejecutar el programa docker. Tened siempre presente que lo que hace este ejecutable es conectarse a través de HTTPS al docker-agent e invocar los métodos de su API REST.

Con este comando podemos hacer login en el Docker hub para poder descargar nuevas imágenes. Nos pedirá nuestro nombre de usuario y contraseña, y ya los tendremos porque ya hemos creado la cuenta al comienzo de este post, ¿verdad? ¿VERDAD? ;)

Ahora vamos a buscar imágenes a través del SaaS que proporciona Docker hub:

docker search alpine

Nos devolverá el listado de imágenes cuyo nombre, descripción… contenga la cadena alpine. Podéis comprobar que son los mismos resultados que obtuvimos en la primera parte de este post, cuando lo buscamos manualmente a través de la interfaz web del Docker hub.

Muy bien, pues vamos a descargarnos la imagen oficial para alpine:

docker pull alpine:latest

Con :latest, le estamos indicando que se descargue la imagen cuya etiqueta sea latest. Este es el comportamiento por defecto si no especificamos ninguna etiqueta.

Tardará como cosa de dos pestañeos (ocupa 4MB, ¿recordáis?), así que tendréis que estar atentos para daros cuenta de que en algún momento la salida por pantalla nos pone algo como Pulling layer. ¡Exacto! Al descargar la imagen, nos estamos descargando todas las capas que la componen. En este caso, la imagen de alpine sólo cuenta con una capa, la que contiene los binarios de este sistema operativo.

Para listar las imágenes que tenemos descargadas en nuestro sistema:

docker images

Veremos aquí nuestra imagen alpine recién descargada. Fijaos en la columna SIZE. 3.984MB. Veis que no os mentía: todo un Linux funcional en menos de 4MB.

Salida del comando docker images, con nuestra imagen alpine de apenas 4MB :)

Salida del comando docker images, con nuestra imagen alpine de apenas 4MB :)

Conclusiones

En este pequeño post hemos visto los conceptos de Docker hub y Docker machine. Hemos instalado Docker en un sistema no nativo (Windows 10 Home, por ejemplo) y ¡ole! hemos picado nuestros primeros comandos para loguearnos en el Docker hub, buscar imágenes, descargarlas y listar las que tengamos descargadas en nuestra máquina.

En el siguiente post nos pondremos serios: empezamos a lanzar contenedores.

¡Nos vemos en nada!

P.S. La respuesta a la pregunta que os hacía más arriba: el host en ese caso es la máquina virtual que proporciona Docker machine, que es la que tiene las herramientas necesarias para que Docker funcione (chroot, cgroups y namespaces)