Docker es una tecnología que permite empaquetar una aplicación junto con todo lo que necesita para funcionar (librerías, dependencias, configuración) dentro de un “contenedor”, de forma que se ejecute igual en cualquier máquina. El término engloba tres cosas a la vez: un proyecto de código abierto, un conjunto de herramientas para contenedorización, y la empresa que lo desarrolla (Docker Inc.).

El problema que resuelve Docker

Seguro que has oído la frase “en mi ordenador funcionaba”. Ocurre cuando una aplicación funciona en un equipo pero falla en otro porque las versiones de las librerías o la configuración son distintas. Docker elimina ese problema: empaqueta la aplicación con sus dependencias, así que se ejecuta igual en tu portátil, en el servidor de tu empresa o en la nube.

Contenedores frente a máquinas virtuales

Aquí está la clave para entender Docker, y es la confusión más común.

Una máquina virtual emula un ordenador completo, con su propio sistema operativo entero encima del tuyo. Eso consume mucha memoria y tarda en arrancar.

Un contenedor de Docker no emula un ordenador completo: comparte el kernel del sistema operativo del equipo anfitrión (el host) y solo aísla la aplicación y sus dependencias. El resultado es que un contenedor es mucho más ligero y arranca en cuestión de segundos, no de minutos.

Máquina virtualContenedor Docker
Qué incluyeSistema operativo completoSolo la app y sus dependencias
Consumo de recursosAltoBajo
Tiempo de arranqueMinutosSegundos
AislamientoTotal (SO propio)A nivel de proceso (kernel compartido)

Cómo consigue Docker aislar los procesos

Docker se apoya en dos funcionalidades del kernel de Linux para aislar los contenedores entre sí:

  • Espacios de nombres (namespaces): aíslan lo que cada contenedor puede ver (procesos, red, sistema de archivos), de modo que un contenedor no percibe a los demás.
  • Grupos de control (cgroups): limitan y controlan cuántos recursos (CPU, memoria) puede usar cada contenedor.

Ambas técnicas juntas son las que permiten que varios contenedores convivan en la misma máquina sin pisarse.

El modelo de imágenes por capas

Una imagen de Docker (la plantilla desde la que se crea un contenedor) no es un bloque único: está formada por varias capas reutilizables. Esto tiene una ventaja práctica importante: si dos aplicaciones comparten una misma capa base (por ejemplo, la misma versión de Ubuntu), esa capa se guarda una sola vez, lo que ahorra espacio y acelera las descargas.

Gracias a este modelo, empaquetar una aplicación con todas sus dependencias es sencillo, y desplegarla se hace en segundos.

Ventajas y también límites

Entre los beneficios está la modularidad: puedes actualizar o reparar una parte de la aplicación sin tener que detener el sistema completo. Pero conviene ser honesto con los límites:

  • Seguridad: como los contenedores comparten el kernel del host, ese aislamiento no es tan hermético como el de una máquina virtual. Además, el daemon de Docker requiere privilegios de superusuario, lo que hay que tener en cuenta al asegurarlo.
  • Escalado: gestionar unos pocos contenedores es fácil, pero cuando el número crece mucho, la cosa se complica sin herramientas de orquestación.

Y cuando hay muchos contenedores: Kubernetes

Para orquestar contenedores a gran escala (desplegarlos, escalarlos y recuperarlos automáticamente si fallan) se usa Kubernetes, la herramienta estándar del sector para esa tarea. Docker crea y ejecuta los contenedores; Kubernetes los coordina cuando son muchos.

Resumen rápido

Docker empaqueta aplicaciones en contenedores ligeros que comparten el kernel del host, arrancan en segundos y se ejecutan igual en cualquier máquina. Es más eficiente que una máquina virtual, se apoya en namespaces y cgroups del kernel de Linux para aislar procesos, y cuando los contenedores se multiplican, Kubernetes se encarga de orquestarlos.