En esta entrada vamos a ver qué es Docker, una tecnología que en los últimos tiempos ha alcanzado importante popularidad. Lo completaremos con unas pinceladas sobre su uso, un listado de comandos básicos, y algunos ejemplos.
¿Qué es Docker?
Docker se define como un proyecto de código abierto que proporciona una capa de abstracción y virtualización a nivel de sistema operativo, a través de la instalación de contenedores de software.
Seguramente os habréis quedado como estabais. Tranquilos, es normal. Lo mejor forma de explicar qué es Docker y para qué es útil es ilustrarlo con una situación que, seguramente, os habrá pasado unas cuantas veces. A ver si os suena.
Imagina que quieres instalar en tu ordenador/servidor una nueva tecnología como, por ejemplo, una nueva aplicación Web self-hosted que acabas de descubrir y quieres probar, o un servicio como un broker MQQT que quieres instalar en tu servidor.
Para instalarla tienes que instalar y configurar un montón de “otras cosas”. Por ejemplo, instalar un servidor Web, NodeJs con 20 módulos, una base de datos MariaDb, crear usuarios y password para cada cosa, añadir variables de sistema, tocar tropecientos ficheros de configuración, y trasquilar una cabra virgen sobre un pentateuco durante luna creciente.
¿Os suena? La cosa es mucho peor aun cuando tienes que instalar múltiples tecnologías en el mismo ordenador. Una base de datos se pega con la otra, este servicio con aquel y el servidor web con el de más allá. A medida que tenemos más cosas instaladas en la misma máquina todo empieza a complicarse cada vez más.
¡Pero aún podría empeorar! Cuando quieres desinstalar algo tienes que jugar a no pasar la delgada línea roja de, o bien quitar de menos e ir llenando progresivamente nuestro ordenador de basura, o quitar de más y que te deje de funcionar cosas que no querías que dejarán de funcionar.
Muy divertido ¿verdad? Sobre todo si lo único que querías era probar una nueva tecnología para ver cómo es.
Docker viene al rescate
Esta es la situación que intenta resolver Docker. Docker trabaja con imágenes y contenedores. De forma resumida, una imagen es un paquete que incluye “todo lo que necesita” una determinada tecnología para funcionar.
Las imágenes se inicializan en una o varias instancias que se denominan contenedores. De esta forma solo tienes que crear el contenedor y a funcionar. Por supuesto, podemos incluso tener varios contenedores de una misma imagen ejecutándose simultáneamente.
Muchos desarrolladores ofrecen sus aplicaciones como un contenedor. Algunas de ellas están en https://hub.docker.com/, el repositorio de Docker. En otras ocasiones los desarrolladores alojan sus docker en su propia página web, o en github, entre otros.
Bajo el capó de Docker
A efectos técnicos, Docker es una tecnología de virtualización “ligera” (habría que hacer una desambiguación del término virtualización, pero eso da para otra entrada) en el sentido de que, en lugar de replicar una máquina virtual completa, únicamente se virtualizan los servicios del contenedor.
Por otro lado, Docker no supone una virtualización del hardware, si no que el contenedor dispone de acceso directo al hardware del Host (lo cual puede ser una gran ventaja, por ejemplo, en la tarjeta gráfica).
En cuanto al rendimiento, existen diferencias respecto a una virtualización de máquina completa. Así, los tiempos de arranque son menores. Además, el nivel de aislamiento es menor y ciertas partes de la memoria del contenedor está duplicados, lo que permite ejecutar múltiples instancias del mismo contenedor sin que ello suponga una gran merma de la memoria.
En general, el rendimiento de una aplicación ejecutada en Docker es similar a una aplicación nativa, y levemente superior a la virtualización completa. Aunque hay que decir que las aplicaciones de virtualización actuales consiguen rendimientos muy buenos.
Cómo instalar Docker
Instalar Docker es bastante sencillo. En primer lugar, nos dirigimos a su página web https://www.docker.com/community-edition y descargamos la versión para nuestro sistema operativo.
Ejecutamos el instalador, y seguimos las instrucciones proporcionadas en la página Web para nuestro SO. En la mayoría de los casos no se requiere ninguna acción más que aceptar las opciones del instalador.
En el caso de emplear Windows 10 podemos elegir si queremos ejecutar containers de Windows o de Linux. Es posible cambiar esta opción más adelante a través del menú contextual del icono de Docker.
Comandos básicos de Docker
Aquí unas pinceladas sobre los comandos básicos. Obviamente existen muchos más comandos, y la mayoría tienen muchas opciones. Consultar la documentación de Docker para más información.
Comandos con imágenes
Descargar una imagen ‘nombreImagen’ en su versión ‘version’
docker pull nombreImagen:version
Ej. docker pull ubuntu:14.04
docker pull ubuntu:latest
Listar imágenes disponibles
docker images -a
Eliminar imagen (si no tiene un contenedor asociado)
docker rmi nombreImagen
Ejecutar una imagen ‘nombreImagen’ en un contenedor ‘nombreContenedor’
docker run -d --name nombreContenedor -p puertoHost:puertoGuest nombreImagen
Comandos con contenedores
Listar todos los contenedores (corriendo o no)
docker ps -a
Listar contenedores ejecutándose
docker ps
Reiniciar el contenedor ‘containerName’ (o containerID)
docker restart containerName
Detener el contenedor ‘containerName’ (o containerID)
docker stop containerName
Eliminar el contenedor ‘containerName’ (o containerID)
docker rm containerName
Ejemplos de Docker
Vamos a ver el funcionamiento de Docker con unos cuantos ejemplos
Hola Mundo
En primer lugar, vamos a probar que la instalación de Docker se ha realizado con éxito con el ejemplo más básico, ‘Hola Mundo’.
Abrimos una consola de comandos y escribimos
docker run hello-world
Docker nos informa de que no tiene la imagen ‘hello-world’, así que procede a bajarla del respositorio. Una vez finalizada la descarga, inicia un contenedor para ‘hello-world’
Podemos comprobar que tenemos instalada la imagen ‘hello-world’
docker images -a
También podemos comprobar que existe un contenedor de la imagen ‘hello-world’ ejecutándose con (en este ejemplo, se ha ejecutado y se ha cerrado)
docker ps -a
Ahora, para eliminar la imagen, primero eliminamos el contenedor asociado
docker rm containerID
O bien eliminamos la imagen directamente con la opción ‘forzar’
docker rmi -f containerName
Instalar Ubuntu-Bash
Vamos a probar un caso más útil, y ejecutar el Bash de Ubuntu en Docker. Para ello, hacemos
docker run -it ubuntu bash
Nuevamente Docker descarga busca la imagen y, al no encontrarla, la descarga del repositorio. A continuación, inicia un contendor para Ubuntu Bash
Vemos que podemos ejecutar comandos de Bash, dentro del entorno creado por Docker.
Instalar Ngix en Docker
En muchas ocasiones querremos que nuestro contenedor aloje una aplicación Web. Vamos a probar con instanciando un contenedor para el servidor de páginas Web Nginx.
Para ello, ejecutamos
docker run -d -p 82:82 --name webserver nginx
Donde hemos redirigido el puerto 82 de la máquina Host al puerto 82 del contenedor de Nginx
Efectivamente, si ahora desde el host ejecutamos un explorador y ponemos como ruta localhost:82, veremos una página web servida por nuestro contenedor de Nginx
Probar plataforma Crossbar.IO
El último ejemplo, crossbar es una plataforma web que implementa notificaciones push entre distintos dispositivos. Instalar Crossbar en un servidor podría ser un proceso relativamente complejo, pero empleando Docker es tan sencillo como hacer.
docker runn crossbario/crossbar
Y en cuestión de segundos tendremos un broker pusher funcionando en nuestro ordenador.
Conclusiones
Hemos visto qué es Docker, por qué es útil, y visto como descargar una imagen e iniciar un contendor. Como hemos comentado al principio, apenas hemos arañado la superficie, y por supuesto el tema daría para mucho más.
Por ejemplo, se nos queda en el tintero cómo crear nuestras propias imágenes (que no es excesivamente difícil) y cuestiones relativas a despliegue en entornos de producción, seguridad, y escalabilidad. Puede que lo veamos en futuras entradas.
Sin embargo, ya hemos visto la enorme utilidad y facilidad que nos permite Docker para desplegar (o incluso sólo probar) de forma cómoda y sencilla. Este es uno de los motivos de su éxito, que como decimos ha sido creciente.
Muchos desarrolladores ofrecen sus aplicaciones en formato Docker. Incluso servidores de hosting facilitan herramientas para el despliegue de contenedores. No sabemos si es una tendencia que aumentará en el futuro, ya que se empieza a observar una cierta desaceleración.
En cualquier caso, una tecnología interesante que conviene conocer y probar, y que puede facilitaros mucho el despliegue de aplicaciones complejas.