Docker

Containers
Imagen Container  por  Glyn Lowe Photoworks   (CC BY)

En el mundillo ‘techi’ una de las palabras que están más en boca de todos nosotros es Docker. Si me sigues, verás que es algo que aparece en muchos de mis artículos. Qué es, para qué sirve y por qué está tan de moda es lo que vamos a tratar de desentrañar. ¡Te interesa conocerlo, y lo sabes!. ¿Arrancamos?

Regreso al pasado

Hagamos un pequeño viaje en el tiempo, no muchos años atrás. Si eras un ‘tipo geek’ tenías no sé cuántas máquinas virtuales en tu Linux con VirtualBox.

Sin meternos en camisas de once varas, una máquina virtual emula a una de física, brindando la posibilidad de tener distintas instalaciones de un mismo o diferentes sistemas operativos, cada una de ellas corriendo su propio software sin perjudicar la usabilidad ni integridad del resto. Es decir, te permite aislar máquinas de forma que un fallo en una de ellas no afecta al resto.

Sin el uso de máquinas virtuales, era común instalar algo nuevo que actualizaba alguna dependencia y, después, te llevabas la sorpresa de que otras aplicaciones ya no funcionaban bien, o que algún software que querías probar tuviese una componente maliciosa que acababa metiéndote un virus o cualquier otra porquería.

Así pues, los usos más comunes que les daba en casa eran:

  • pruebas de nuevo software.
  • aislamiento y seguridad.
  • optimización de recursos de hardware.

Pero en las máquinas virtuales no todo eran flores; al ejecutar un sistema operativo completo, lleva su tiempo levantarlas y consumen una importante cantidad de recursos hardware, cosa que impide, para un ordenador convencional, tener más de una o dos funcionando al mismo tiempo sin que se vuelvan lentas como tortugas.

Benditos contenedores

A algún lumbreras se le ocurrió hacer lo mismo que al genial Malcolm McLean quien, en 1956, realizó su primer viaje comercial marítimo transportando mercancías en contenedores.

Al susodicho lumbreras se le pasó por la cabeza meter en un contenedor distintas mercancías (aplicaciones), aislando así el contenido de cada contenedor, y todos ellos usando el mismo barco (sistema operativo) para transportarlos.

De este modo, reuniendo en un solo embalaje todos y cada uno de los elementos necesarios para ejecutar una aplicación (y exclusivamente esa), pero usando un único y mismo sistema operativo, y sin la necesidad de un hipervisor, todo se hace más ligero, más rápido de levantar, consume menos recursos y, por ende, bajo el mismo paraguas de hardware, puedes tener muchas más cosas funcionando y sí, garantizando el aislamiento y la seguridad.

Espera, espera, que no te he dicho aún lo mejor… ¡todo ello es perfectamente portable! Te da igual que tu máquina host sea un Windows, un Linux, un macOS o lo que sea; ese contenedor lo puedes llevar donde sea, si usas Docker… o casi.

Llegamos a Docker

Ya sabemos qué son los contenedores. Bien, pues Docker no es más que la plataforma que posibilita la creación, despliegue y uso de contenedores. Que sí, que los Docker son unos pantalones para hombre, también, pero no me refiero a eso.

Hay otras plataformas que cumplen con la misma función (luego vemos algunas) pero, para ir por casa, Docker es lo que usamos el común de los mortales, y hoy día todos los servicios que monto en casa los tengo bajo Docker.

Docker utiliza el kernel de Linux y sus funciones para dividir los procesos y ejecutarlos de manera independiente; de este modo se ejecutan varios procesos y aplicaciones por separado para que se pueda exprimir mejor el hardware de tu PC y, al mismo tiempo, preservar la estancaneidad que se obtendría con los sistemas individuales.

Docker en Windows y macOS

Sí, Docker usa el kernel de Linux. Eso fuerza a que Windows y macOS necesiten una capa adicional: una máquina virtual ligera.

Windows requiere de la instalación previa de Windows Subsystem for Linux y de Docker Desktop; macOS de Docker Desktop. Sin embargo, macOS 26 Tahoe traerá embebida una micro máquina virtual ligera para no depender de nada, eso sí, sólo bajo Apple Silicon.

Qué tener bajo Docker

Casi lo que quieras. Es difícil no encontrar una aplicación que no pueda ser instalada bajo Docker.

En mi caso, en máquinas muy básicas (Mini PC Intel N5105 con 8GB RAM, NAS Synology DS224 Plus -al que le tuve que ampliar la RAM por ese motivo- y una Raspbery Pi 3 B) tengo unos 40 contenedores en funcionamiento. Por mencionar algunos:

  • Servicios de red: AdGuard Home, isc-dhcp-server, Duckdns, Wireguard, WG-Easy
  • Servicios de monitorización: Beszel, NetAlertX, Speedtest, iPerf3, Dozzle
  • Servicios de backup: Duplicati
  • Servicios de domótica: Home Assistant, Homebridge, Node-RED, Zigbee2MQTT
  • Servicios de automatización: N8N
  • Servicios de mensajería: ntfy, Gotify, Mosquitto
  • Servicios multimedia: Jellyfin, Immich, Jackett, Sonarr, Radarr
  • Servicios de datos: Metabase, MariaDB , InfluxDB
  • Otros: Dashy, Paperless-ngx, Watchtower, Portainer, FreshRSS, Frigate

¿Es fácil de usar?

No te voy a engañar. Docker, a pelo, tiene su enjundia, porque va por línea de comandos. Además, y debido a su orientación al asilamiento y la seguridad, manejarse con algunos conceptos, como redes y volúmenes, amilana.

Hay algunos «amiguetes de Docker» que nos hacen la tarea un poco más fácil. En mi caso uso docker compose, que permite realizar la configuración mediante un archivo en texto plano (en YAML) de los diferentes servicios que quieres desplegar sobre Docker, y Portainer, una interfaz gráfica para Docker, a la que se accede con el navegador.

Hay que echarle algún que otro fin de semana si quieres manejarte con cierta soltura y, sobre todo, saber qué estás haciendo y por qué. Encontrarás muchas recetas por ahí que con solo copiar y pegar te van a permitir usar contenedores sin tener ni pajolera idea; poco a poco y con práctica irás entendiendo esas recetas.

El secreto de su éxito

El secreto del éxito de Docker, en entornos domésticos, radica en su capacidad para resolver un problema fundamental de forma sencilla y accesible: la gestión de dependencias y la consistencia de los entornos.

Docker no fue el primero en crear contenedores, pero fue la primera herramienta en hacer que la contenedorización fuera práctica y atractiva para el desarrollador individual y el aficionado.

La Caja Mágica

Antes de Docker, si querías probar un software como un servidor de base de datos o una aplicación web, tenías que pasar por un proceso complicado:

  • Instalar el software en tu máquina principal (lo que podría generar conflictos con otras aplicaciones).
  • Configurar dependencias, librerías y versiones específicas.
  • Enfrentar el temido «funciona en mi máquina, pero no en la tuya».

Docker -bueno en realidad un precursor de Docker llamado LXC- resolvió esto con una metáfora simple y poderosa: la imagen de contenedor. La imagen es una «caja mágica» que contiene todo lo que la aplicación necesita para funcionar: código, librerías, dependencias, etc. Esta caja es portable y se ejecuta de la misma manera en cualquier sistema compatible con Docker.

Para ti y para mí esto es un cambio radical. Ya no tenemos que preocuparnos por las dependencias; simplemente descarga una imagen y ésta se ejecuta, sabiendo que funcionará sin interferir con el resto de tu sistema.

Ecosistema y Docker Hub

El «efecto de red» de Docker Hub fue un catalizador masivo. Docker Hub es un registro centralizado donde los desarrolladores y las empresas publican imágenes de sus aplicaciones.

Si un usuario, como tú y como yo, quiere configurar un servidor Plex, una instancia de Home Assistant o un NGINX, simplemente busca la imagen oficial en Docker Hub. Además, el sistema de imágenes verificadas y la popularidad de las imágenes comunitarias generan confianza, de manera que el usuario puede confiar en que una imagen con millones de descargas es estable y segura.

Docker Hub no es el único. Hay muchos otros «hubs» confiables como el de linux server

Interfaz de Usuario Intuitiva y la CLI

A diferencia de las tecnologías de bajo nivel como LXC o containerd (luego hablamos de ellas), la línea de comandos de Docker es intuitiva y fácil de recordar.

Para el usuario principiante, esta interfaz simple es una puerta de entrada accesible al mundo de los contenedores.

Composición de Aplicaciones (Docker Compose)

Cuando un usuario quiere desplegar una aplicación más compleja, como un blog de WordPress que requiere un servidor web, una base de datos y, quizás, un proxy in verso, Docker Compose lo simplifica enormemente.

Con un único archivo docker-compose.yml puedes definir y gestionar múltiples servicios y lanzarlos juntos con un simple chasquido de dedos.

Alternativas a Docker

Sí, existen alternativas a Docker. Si bien éste se ha convertido en un estándar de facto, han surgido otras herramientas que ofrecen diferentes enfoques, ventajas y funcionalidades.

Podman

Podman es una de las alternativas más destacadas y, lo mejor de todo, compatibles con Docker. Su principal diferencia es su arquitectura sin demonio (daemonless). Vale, no nos compliquemos, pero te explico: Docker usa un servicio en segundo plano (dockerd) que se ejecuta con privilegios de root, lo que puede ser un riesgo de seguridad. Podman, en cambio, ejecuta los contenedores directamente como procesos de usuario, lo que lo hace más seguro por naturaleza (no requiere privilegios de root para la mayoría de las operaciones).

Respecto de Docker, podríamos decir que:

  • Tiene como ventaja una mayor seguridad
  • La sintaxis de los comandos es casi idéntica a la de Docker, lo que facilita la migración.
  • Ideal para entornos con estrictos requisitos de seguridad y usuarios que prefieren una arquitectura más simple y distribuida.

containerd

Containerd es en realidad un componente de bajo nivel que Docker usa internamente. Es un runtime de contenedores que gestiona el ciclo de vida de un contenedor (creación, ejecución, detención, etc.). A diferencia de Docker, que es una plataforma completa con muchas herramientas adicionales, containerd es más ligero y se enfoca únicamente en el runtime.

Respecto de Docker, podríamos decir que:

  • Presenta ligereza, eficiencia y es un estándar de la industria. De hecho, es el runtime que utiliza Kubernetes por defecto.
  • Ideal para infraestructuras de orquestación a gran escala como Kubernetes, donde no se necesita la capa superior de herramientas de Docker.
  • No está pensado para ser usado por parte de un usuario final.

LXC (Linux Containers)

LXC es una tecnología más antigua que Docker y representa la forma original de contenerización en Linux. En lugar de empaquetar una aplicación individual, un contenedor LXC se parece más a una máquina virtual ligera. Proporciona un entorno completo de sistema operativo con su propio sistema de inicio.

Originalmente Docker se basó en LXC. Sin embargo, con el tiempo se fue distanciando de esa dependencia y hoy en día ya no lo usa.

Respecto de Docker, podríamos decir que:

  • Tiene un mayor nivel de aislamiento y flexibilidad, ya que puede ejecutar múltiples procesos dentro de un solo contenedor.
  • Ideal para casos de uso de virtualización ligera donde se necesita un entorno de sistema operativo completo, más que una simple aplicación.
  • Si tienes una máquina con Proxmox como hipevisor, quizás sea la opción más directa y lógica de usar contenedores, ya que Proxmox utiliza LXC como una pieza fundamental de su plataforma para ofrecer una virtualización ligera y de alto rendimiento.

Conclusión

Si llevas años pintando canas, te acordarás de un anuncio de un producto de limpieza cuyo anuncio acababa diciendo «yo no puedo estar sin él»: Scotch brite. Bueno pues yo no puedo estar sin Docker.

Docker es la pieza sobre la que se asientan los servicios que hay en mi casa. A la que compro un mini PC, una Raspberry o cualquier cacharro del estilo, le instalo Linux y luego Docker, con Docker Compose.

Si vas a montarte tu propio sistema domótico, tu propio servicio de «streaming» de películas o música, tu propio sistema de videovigilancia, su propio sistema de control financiero, etc, y quieres que cada uno de ellos sea su propia república independiente, como rezaba ese anuncio de los 80, «no puedes estar sin él».