Últimamente he estado jugado bastante con Docker, es más, este blog en el que estáis corre en el mismo, pero, ¿Que es Docker?
Docker es un software que nos permite correr contenedores (pensad en ellos como VM’s por el momento) de una manera muy sencilla, ligera y rápida.
En la anterior frase os digo que penséis en un contenedor como en una VM, realmente no es exactamente así. Una VM contiene un OS entero con todo lo que este requiere para arrancar como si fuese una máquina física, esto suele provocar que el uso de disco de las VM se dispare desde el comienzo (si, ya sé que puedes hacer una instalación super light que no llegue al Gb). En el caso de docker los contenedores solamente contienen los archivos (binarios, librerías, etc, etc) necesarios para funcionar ya que el kernel es compartido con el Host.
Además Docker elimina el hipervisor lo que lo hace mucho más ligero, y algo que a mi me ha encantado, se puede utilizar dentro de una VM (solo Linux, Windows tiene una limitación que explicare más adelante).
Y ¿que significa todo esto?, pues para poneros un ejemplo real, esto es lo que ocupa este blog actualmente en mi Docker:
# docker ps -s CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE 553c6bf413f1 wordpress "/entrypoint.sh apach" 39 hours ago Up 15 hours 0.0.0.0:8080->80/tcp wordpress_wordpress_1 71.75 MB (virtual 592.3 MB) c828665d7494 mariadb "/docker-entrypoint.s" 39 hours ago Up 39 hours 3306/tcp wordpress_db_1 2 B (virtual 387.5 MB)
Como podéis ver utilizo dos containers, uno para el wordpress (apache, php, etc) y otro para mariadb, y creo que la columna SIZE habla por si sola.
Aprovechando la oportunidad os voy a explicar las distintas columnas para que podais entender un poco mejor los componentes de Docker.
CONTAINER ID
Este es el ID que Docker le asigna al contenedor y que podemos utilizar para referirnos a el de forma única.
IMAGE
Imagen base que se utilizó para crear el contenedor. Una imagen se podría considerar la template del contenedor, esta contiene los elementos básicos ya instalados para funcionar. Una vez creado el contenedor podremos modificar lo que gustemos, tener en cuenta que la imagen en si no se modifica, los cambios realizados solo se aplican al contenedor unicamente. En este caso la imagen de wordpress contiene una instalación de worpress lista para usar e incluye un servidor apache, si quisiera levantar un wordpress distintio a este simplemente utilizaría la misma imagen para crear un nuevo contenedor y empezaría desde 0.
COMMAND
Este es el comando que se ejecuta al iniciar el contenedor, en este caso un script que se encarga de arrancar los servicios necesarios.
CREATED & STATUS
Hace cuanto se creó y lleva corriendo el contenedor.
PORTS
Por defecto Docker genera una red virtual, muy parecida a la host-only de VBox, con la cual solo se puede acceder a los puertos del contenedor de forma local o desde otros contenedores. En el caso del contenedor de wordpress existe un mapeo al puerto 80 del contenedor desde el 8080 del Host lo que significa que si nos conectamos al 8080 del Host nos contestara el puerto 80 del contenedor pero, en el contenedor de mariadb, el puerto 3306 no esta mapeado así que solo podrá ser accesible desde local o, en este caso, por el contenedor de wordpress.
NAMES
Además del ID los contenedores también pueden ser referenciados por un nombre, si este no se especifica al crear el contenedor Docker le asignara uno aleatorio formado por dos palabras, algunos pueden ser muy divertidos.
Otra de las cosas que ha hecho que me enamore de docker es la rapidez de despliegue, levantar un contenedor apenas si lleva unos segundos, solamente la primera vez puede tardar más si no tenéis la imagen ya descargada.
Un ejemplo de uso de docker puede una imagen de metasploit y otra de openvas que he creado y que me permiten correr dichas aplicaciones sin necesidad de instalar nada más que Docker en el Host ya que todas las dependencias están en dichas imagenes. De esta manera si en un momento dado necesito metasploit simplemente levanto un contenedor con dicha imagen y ya podría utilizarlo directamente.
Otra opción que tiene Docker es la de crear un Swarm, una especie de cluster, utilizando distintas máquinas y manejar lo desde una misma máquina. De esta manera los contenedores se ejecutaran en las distintas máquinas sea la que nosotros le especificamos, sea la que Docker decida. El único inconveniente del Swarm es que los puertos se mapean a la máquina en la que se ejecuta con lo cual si corremos un contenedor en una máquina remota tendremos que conectar al puerto en dicha maquina. Sobre Swarm hablaré en futuros post y os explicaré como montar uno simple.
Espero os haya gustado esta «pequeña» introducción a Docker, si queréis leer más os podéis dirigir a su web (en inglés): https://www.docker.com
Muy buen post, gracias por la explicación a detalle pero simple.