Docker

¿Qué es docker?

A poco que empieces a leer algo de virtualización y portabilidad de aplicaciones, enseguida saldrá la tecnología Docker. En esta entrada vamos a ver qué es un docker, para qué lo podemos utilizar y las ventajas que nos ofrece respecto a la instalación tradicional de una aplicación.

Docker vs máquina virtual

Docker vs Máquina virtual
Docker vs Máquina virtual

Durante estos años ha habido una evolución progresiva en el modo en el que se ejecutan las aplicaciones y servicios, en busca de un mayor aprovechamiento del hardware disponible.

En un comienzo, cada vez que se compraba un servidor nuevo, se decidía qué sistema operativo era necesario y los servicios que iba a prestar. Una vez realizada esa instalación inicial, rara vez se volvía a dar otro uso a la inversión realizada.

Tecnologías de virtualización

Eso cambió y nacieron las tecnologías de virtualización. Éstas consisten en instalar un sistema operativo llamado hipervisor y sobre éste se crean máquinas virtuales. Cada una de ellas puede tener el sistema operativo que se desee y pueden correr las aplicaciones que se precise.

Esta orientación nos dio mucha mayor versatilidad y se consiguió dar un mayor aprovechamiento al hardware comprado.

Los hipervisores más conocidos son ESXi de VMware y HyperV de Microsoft. Si tienes un pc con suficientes recursos, puedes crearte máquinas virtuales utilizando VirtualBox.

La principal desventaja de tener máquinas virtuales es que son muy costosas. Hay que asignarles disco, cpu y memoria como si de una máquina real se tratara y el consumo de los recursos es bastante alto.

Nacimiento de Docker

Más adelante nació la tecnología Docker y su filosofía de funcionamiento es diferente. Ya no tenemos un hipervisor que crea máquinas virtuales y que presenta hardware virtual a una máquina. En su lugar, tendremos un sistema operativo en el que instalaremos la herramienta Docker. Este sistema operativo puede ser Debian, Ubuntu, etc.

Es Docker quien crea contenedores. ¿Y qué son los contenedores? Son paquetes software que se ejecutan de manera totalmente aislada del sistema operativo base.

Facilidad de uso

Pondré un ejemplo para que se entienda mejor: imagínate que queremos instalar un servidor Apache en nuestro sistema Ubuntu. La forma tradicional de hacerlo es instalar todos los paquetes necesarios para Apache y finalmente instalar el paquete de Apache. Utilizando el contenedor de Apache, no es necesaria la instalación de ningún software en el sistema operativo. Basta con descargarse la imagen del contenedor y desplegarla. Listo.

Independencia entre aplicaciones

¿Cuántas veces no te ha pasado que no has podido instalar una versión de una aplicación porque tu sistema operativo no tenía la dependencias necesarias? ¿O qué una librería de una aplicación chocaba o interfería con la librería de otra aplicación? Con la utilización de Docker, este tipo de problemas desaparecen. Cada aplicación corre en su propio contenedor y con sus librerías y dependencias necesarias. Cada uno de esos contenedores no tienen asignado una memoria, cpu y disco de forma predeterminada.

Imagen y contenedor

Contenedor vs Imagen
Contenedor vs Imagen

Uno de los primeros conceptos más confusos cuando se comienza a trabajar con Docker es el de imagen y su semejanza con contenedor.

Una imagen es el patrón, el molde según el cual se va a construir un contenedor. Por su parte, un contenedor es una instanciación de una imagen y está listo para ser ejecutado.

Así, el número de imágenes de contenedores no tiene por qué ser el mismo que el número de contenedores que están corriendo en un sistema.

Repositorio de contenedores

El principal repositorio de imágenes es dockerhub. En él vas a poder encontrar contenedores para todo tipo de funciones y además sobre diferentes arquitecturas. A este respecto hay que prestar atención porque en cada una de las imágenes se indica, para qué arquitectura ha sido creada: x86, x64, ARM, etc.

Jugando con contenedores

Te animo a que te pongas manos a la obra e instales docker en una máquina linux. ¿No tienes linux en tu pc? No importa, si tienes Windows 10 puedes instalarte WSL2 de Microsoft y create una máquina virtual en pocos minutos.

Comandos docker

En este enlace te dejo el contenedor oficial de Apache de la página dockerhub.

De primeras puede ser un poco farragosa su lectura pero intentaré aclararte un poco las cosas.

Tienes 2 formas de bajarte una imagen, crear un contenedor y ejecutarlo.

Utilización de comando

Esta forma de trabajar es la menos recomendable. Se basa en ejecutar el comando que crea el contenedor y acaba ejecutándolo. Cada vez que necesites ejecutar el contenedor, vas a tener que lanzar el comando entero. Por ejemplo:

docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4

Utilización de docker-compose

Docker compose
Docker compose

Se basa en la creación de un fichero en donde se especifican cada uno de los contenedores que se necesitan crear. En este ejemplo, te muestro cómo crear un contenedor para Home Assistant. En este artículo te explico qué es Home Assistant.

Antes de pasar a explicarte qué significan cada uno de los campos debes saber dos cosas:

  • Cuando se ejecuta un contenedor en un servidor, debes especificar qué puertos serán publicados y cómo. Esto quiere decir que, si tu contenedor es un servidor web y necesita publicar el puerto 80, necesitas configurar en el fichero de docker compose cómo quieres que sea accesible ese puerto desde fuera. Bien utilizando el propio puerto 80 u otro diferentes. Así, puedes decir que el puerto 8080 en el servidor se redirija al puerto 80 de contenedor.
Puertos en Docker
Puertos en Docker
  • Imagínate que instalas un servidor de base de datos en un docker. Si borras ese docker pierdes los datos que almacenas en la base de datos. Esto no tiene mucho sentido, ¿verdad? Para evitar esto, puedes indicar en el fichero de docker compose que determinadas carpetas se corresponden con carpetas del servidor docker. Siguiendo nuestro ejemplo, podemos decir que la base de datos se almacene en el directorio /var/lib/mysql dentro de nuestro docker y que esa carpeta se almacene en /var/docker/bbdd dentro del servidor docker. Así si nos cargamos o actualizamos el contenedor, no perderemos los datos.
Volúmenes en Docker
Volúmenes en docker

Te cuento brevemente qué significan cada uno de los campos:

  • container_name: nombre del contenedor y con el que aparecerá en nuestro listado de contenedores.
  • image: ruta o imagen del contenedor que se debe descargar desde DockerHub.
  • restart: si el contenedor se cae por algún motivo, el proceso docker deberá reiniciarlo.
  • network_mode: este parámetro es un poco más complicado de explicar, pero baste decir que, si lo configuras en modo host, significa que los puertos que publique el contenedor serán accesibles directamente desde la interfaz propia del servidor donde está instalado docker.
  • TZ: especificas la zona horaria
  • volumes: carpetas que serán compartidas entre el contenedor y el servidor docker.
Ejemplo fichero docker-compose

Una vez tengas creado el fichero docker-compose basta con ejecutar el siguiente comando para que se haga la magia y se creen los contenedores que has especifidado.

Ejecución de docker-compose

Como puedes ver en la imagen, en una raspberry pi puedes tener corriendo varios docker. Todos ellos están configurados en un fichero de docker-compose y basta con un simple comando para hacer que todos ellos se descarguen y se ejecuten.

Paso de comandos

Está bien, no quieres utilizar comandos para administrar tus contenedores y te gustaría tener una interfaz gráfica desde donde administrarlos. Ok, pues utiliza portainer.

Es más, puedes crearte un contenedor de portainer y que sea este contenedor con portainer el que administre los demás contenedores mediante una interfaz web.

Ventajas de docker

Poder encapsular aplicaciones en contenedores y hacerlas independientes del sistema operativo trae enormes ventajas tanto en el despliegue como en el mantenimiento de las propias aplicaciones.

Te animo que lo pruebes y descubras todo el potencial de esta tecnología que tan de moda está en la actualidad.