Vale, ya tenemos instalado Docker en Windows (aunque lo que veremos en esta entrada sirve para cualquier entorno) y estamos deseosos de utilizarlo por primera vez, así que ahí van nuestros primeros pasos en Docker.
Si hemos dejado que nos instalase los iconos en el escritorio, veremos que tenemos dos enlaces directos diferentes, uno denominado Docker Quickstart Terminal y otro Kitematic. Vamos a empezar a hacer nuestros pinitos así que arrancando el terminal (sobre el Kitematic ya hablaremos en otra entrada).
Docker Quickstart Terminal
La primera vez que lo arranquemos en Windows tendrá que descargarse la imagen de la distribución Linux base en la que se ejecutará (si no os acordáis, podéis echar un vistazo a la entrada anterior, en donde os comentaba que en Linux esto se hace en nativo, pero que en Windows se tiene que virtualizar utilizando un gestor externo, VirtualBox, y una distribución Linux básica con solo lo necesario, Boot2Docker. Como curiosidad, esta distribución se descargará de Github, y es que
Una vez que la hayamos descargado, esta imagen se empezará a instalar en VirtualBox. Así que tenéis que tener un poco de paciencia y estar atentos, porque puede ser que os pida permisos de administrador para realizar ciertas operaciones (crear un adaptador de red, etc). Cuando haya terminado de instalar todas la cosas, pasaréis a ver por fin la imagen de la terminal de Docker, en donde podremos empezar a hacer maldades con los contenedores.
Como curiosidad, si ahora abrís VirtualBox, veréis que tenéis una imagen instalada, ahí es dónde se ejecutarán los contenedores de Docker.
Ahora sí, primeros pasos en Docker
Manos a la obra, porque si no empezamos no vamos a dar nuestros primeros pasos en Docker. Vamos a instalar un contenedor y para ello que mejor que el típico Ubuntu que todos conocemos.
La forma de ejecutar este contenedor es muy sencilla, solo tenemos que teclear lo siguiente en la terminal:
$ docker run ubuntu
Y empezaremos a ver que, como no la tenemos instalada localmente, se conectará a remoto para bajarse este contenedor y poder ejecutarlo.
Para ver que lo tenemos correctamente funcionando, podemos ejecutar un ps como en cualquier otro Linux de la siguiente manera:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Curioso, no vemos nuestro contenedor de Ubuntu que hemos creado. Eso es porque no está ejecutando nada y, por lo tanto, está parado. Si queremos ver lo que se ha ejecutado, podemos hacerlo así.
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9a25df5581c ubuntu "/bin/bash" 4 seconds ago Exited (0) 4 seconds ago pedantic_babbage
Aquí podemos ver que se ha ejecutado el contendor de Ubuntu, con un comando de bash y que ha terminado correctamente. Ah, sí, y también el curioso nombre que se le pone.
Bueno, ¿y qué podemos hacer con esto? Podemos entrar dentro de la máquina y hacer cosas en ella:
$ docker run -t -i ubuntu /bin/bash root@b32bad70d260:/#
Como vemos, ahora tenemos el terminal de una consola dentro de este contenedor. Los parámetros que le hemos pasado son -t para un terminal tty y -i para que este sea interactivo.
En este punto podemos trastear un poco y cuando terminemos, podemos salir con el típico exit para volver a la consola de Docker.
Por cierto, anteriormente os he comentado que las imágenes se guardan en repositorios y esas cosas. Entonces, ¿hay un registro de cambios? Pues sí, si queremos que Docker nos enseñe los cambios que hemos hecho, solo tenemos que hacer algo así:
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b32bad70d260 ubuntu "/bin/bash" 4 minutes ago Exited (0) 58 seconds ago gigantic_boyd $ docker diff b32bad70d260 C /root A /root/.bash_history
Aquí vemos que si le pasamos el identificador al diff, nos dice lo que se ha cambiado respecto a la imagen original. Curioso, ¿verdad? En otra entrada podremos investigar como guardar los cambios en repositorios y demás.
Pero antes de terminar, vamos a hacer que nuestro contenedor haga algo.
$ docker run -d ubuntu /bin/sh -c "while true; do echo hola mundo; sleep 1; done" 6f5a5e6f23558f354fe211c130a3595ae90902210cb9c773147e7de7af829d4c $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f5a5e6f2355 ubuntu "/bin/sh -c 'while tr" Less than a second ago Up 10 seconds distracted_davinci $ docker logs distracted_davinci hola mundo hola mundo hola mundo hola mundo hola mundo hola mundo hola mundo hola mundo
¿Qué hemos hecho aquí? Veamos, primero ejecutamos el contenedor ubuntu que, cómo ya lo tenemos instalado en nuestro entorno, utilizará ese. Le ponemos la opción -d para decirle que lo queremos ejecutar como un demonio, así que estará funcionando de fondo y le decimos entonces que ejecute en un shell (/bin/sh) un mini script que lo único que hace es repetir cada segundo “hola mundo”.
Le damos y… no vemos nada, y es porque el contenedor está “contenido” en si mismo (redundancia total de términos), así que lo siguiente es ejecutar un ps para ver que pasa. Si os fijáis, aquí está ya sin el -a, no es necesario ir al histórico porque lo tenemos ejecutándose permanentemente.
Pero, ¿y cómo podemos ver la salida? Veamos, la salida estaría dentro del propio shell del entorno, es decir, si estuviéramos dentro del contenedor estaríamos viendo permanentemente “hola mundo”, así que lo que ejecutamos es un comando para ver que está pasando por el contenedor. El comando tiene el nombre de “logs” y hay que indicarle el nombre gracioso del contenedor.
Y ahí está, un montón de “hola mundo”.
Antes de terminar el artículo un detalle, es bueno que paremos esta máquina porque de tanto saludar se va a aburrir, así que para parar un contenedor solo tenemos que hacer esto:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6f5a5e6f2355 ubuntu "/bin/sh -c 'while tr" 9 minutes ago Up 9 minutes distracted_davinci $ docker stop 6f5a5e6f2355 6f5a5e6f2355 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
Básicamente tenemos que ejecutar un “stop” con el identificador (también podríamos usar el nombre). Viendo el ejemplo, primero con un ps lo vemos en ejecución, luego lo paramos y luego con el ps ya vemos que no está, así que el contenedor se ha parado correctamente.
Y hasta aquí han llegado estos primeros pasos en Docker. Iré entrando en más detalles en próximos artículos, porque realmente parece muy interesante, ¿no os parece?