Docker llegó para revolucionar la ejecución, la administación y aprovisionamiento del software para siempre.
Si algunas vez escuchaste la expresión «No funciona en mi maquina» mientras observabas el mismo software funcionando perfecto en tu maquina, entonces Docker es la herramientas que necesitas.
Creo que docker no soluciona todos los males, si traes contigo malos habitos y vicios en el ciclo de vida de desarrollo, docker solo agregará una nueva capa de complejidad a los mismos. Usar con cuidado 🙂
Resumiendo lo que es y que hace: Docker es una herramienta que permite la ejecución de software proveyendo TODO el ambiente (librerías) para el mismo, si necesidad de instalarlo en la maquina ejecutora del mismo o la necesidad de una aislamiento de hardware como lo hace la virtualización. Wow, eso lo hizo mas confuso!. Bueno, ejemplo.
No más hyperviosores
Mi maquina es fedora, para ejecutar un software que requiere Debian, debo instalar Debian (directo a la maquina, o en maquina virtual), ejecutar el software. Docker permiter que puedas descargar todo el sistema de archivos de la distribución debian, y ejecutar el software en ese entorno descargado. Les parecerá muy similar a la virtualización, pero no es así, porque la virtualización presenta un sistema operativo completo y aislado ejecutado en memoria por medio de un hypervisor, en el caso de docker es solo UN SOLO proceso ejecutado en memoria no asi TODO el sistema operativo.
Manos a la obra!
Para fedora:
dnf install docker
para Debian/Ubuntu
apt-get install docker
para CentOS/Red Hat
rpm install docker
Bajo la misma premisa expuesta, ahora quiero ejecutar un software en Debian. Para esto como el usuario root del sistema, descargo la imagen del sistema operativo, y lo preparo para la ejecución de un software
[root@laptop ~]# apt-get --version <- Esto es Fedora
bash: apt-get: command not found
[root@laptop ~]# docker pull debian
.. Aca muestra varios mensajes..
[root@laptop ~]# docker run --name=test -t -i debian:latest /bin/bash
root@a1b2c3d4e5:/# cat /etc/issue <- Esto es debian
Debian GNU/Linux 8 \n \l
root@a1b2c3d4e5:/# apt-get --version
apt 1.0.9.8.1 for amd64 compiled..
Para explicar un poco mejor lo sucedido. En mi maquina Fedora ejecuto, apt-get, un comando muy conocido de las distribuciones de Debian. Me dice el interprete que estoy mal de la cabeza, eso no existe, lo cual es cierto. Luego descargo la imagen del sistema operativo de debian. Inicio un contenedor con esa imagen (explicaré mejor eso en unos parrafos más) y ya estoy dentro de la distribución debian. Ejecuto el mismo comando y ahí si existe. Puedo realizar las tareas con el mismo.
Un poco de contexto, que es muy importante. Todas las tareas y cambios que realice suceden dentro del contexto del contenedor. NO afecta la maquina host, en este caso, todo pasa en Debian, nada en Fedora.
El contenedor crea un sistema de archivo virtual para ejecución, con lo cual todas las modificaciones se mantienen durante la vida del contenedor. Hacemos todo lo que tenemos que hacer, salimos.
En la consola de Debian, ejecutamos «exit» y con eso salimos del contenedor, pero el sistema de archivo del contenedor sigue almacenado (aunque ya no «en vivo»). Entonces para entender la ejecución terminación y limpieza de las imagenes y contenedores vamos a un par de comandos más de ejemplo.
Lo primero que necesitamos es imagenes, estan son la base para los contenedores y nos dan un sistema de archivo desde el cual iniciar las tareas. Vemos cuales imagenes tenemos disponibles con «docker images»
[root@laptop ~]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
docker.io/debian latest 2b90562fac36 2 weeks ago 125.5 MB
docker.io/centos latest 60e65a8e4030 4 weeks ago 196.6 MB
Tengo imagenes de Debian y CentOS, a partir de estas imagenes se crean los contenedores, que son la ejecucion de los mismos. Creamos un contenedor del mismo ejemplo anterior. Para descargar imagenes de sistema operativo, el comando es «docker pull [nombre][:etiqueta]«.. la etiqueta es algo opcional, para versiones
[root@laptop ~]# docker pull debian
.. Aca muestra varios mensajes..
[root@laptop ~]# docker pull debian:7
.. Aca muestra varios mensajes..
Descargamos la imagen de debian, la ultima version, «latest«, que es la opcion por defecto si no es especifica la etiqueta, y la versión 7 que sería la anterior ya espeficicando la etiqueta.
Luego iniciamos el contenedor, pasando como parametros un nombre legible con «–name=«, ya verán eso porque es mejor así, «-t -i» son opciones para abrir (o mostrar) la consola , luego la imagen de base, en este caso «debian:latest» y luego el comando a ejecutar, en este caso el interprete de comandos «/bin/bash«, pero en otras entregas veremos como esto puede ser otro ejecutable. Ejemplo actual:
[root@laptop ~]# docker run --name=prueba -t -i debian:latest /bin/bash
root@a1b2c3d4e5:/#
Notesé el interprete bash entrega un conjunto de numero y letras luego del usuario «root@a1b2c3d4e5«, esto es un ID unico del contenedor.
Se pueden observar los contenedores en ejecución con «docker ps«, de la siguiente forma, abrimos otra consola en la maquina host y hacemos lo siguiente:
[root@laptop ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5 debian "/bin/bash" 34 seconds ago Up 32 seconds prueba
En el momento en que cerramos el interprete bash en el contenedor, el proceso muere y desaparece, pero el sistema de archivos aun sigue almacenado, de esta forma todos los contenedores de alguna forma se mantienen en el tiempo. Y la forma de iniciarlos nuevamente es por su ID. Y luego uno debe «conectarse» nuevamente.
[root@laptop ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@laptop ~]# docker start a1b2c3d4e5 <-Con esto iniciamos el contenedor ya conocido
a1b2c3d4e5
[root@laptop ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5 debian "/bin/bash" 1 hour ago Up 60 seconds prueba
[root@laptop ~]# docker attach a1b2c3d4e5 <-Con esto nos "conectamos" al contenedor nuevamente
root@a1b2c3d4e5:/#
Con lo anterior estamos iniciando nuevamente el contenedor original de Debian, usando su ID. Nos conectamos a nuevamente al contenedor usando «docker attach [ID]«. Para detenerlo, salimos de la consola o desde cualquier otra consola hacemos «docker stop [ID/Nombre]«.
[root@laptop ~]# docker stop a1b2c3d4e5
Luego de detener el contenedor, el mismo puede ser iniciado nuevamente, pero en caso de haber realizado todas las actividades y ya no lo necesitamos mas, lo borramos para que no ocupe espacio de almacenamiento, un poco de limpieza con «docker rm [ID]«. Si lo que queremos borrar es una imagen descargada usamos «docker rmi [nombre][:etiqueta]»
[root@laptop ~]# docker rm a1b2c3d4e5
[root@laptop ~]# docker rmi debian:latest
Con esto cerramos los primero pasos con docker y en las proximas entregas estaré comentando mis experiencias creando imagenes y un poco mas de administración de contenedores.