
¿Qué es Docker y cómo funciona?
docker envía comandos a través de una API REST al demonio dockerd, que
construye imágenes y ejecuta contenedores a partir de ellas.Por qué existe. Docker le permite empaquetar una aplicación con todas sus dependencias (bibliotecas, configuración, tiempo de ejecución) en un único artefacto (una imagen) y ejecutarla de manera idéntica en una computadora portátil de desarrollador, en CI y en producción. Esto resuelve el clásico problema de "funciona en mi máquina".
Contenedores versus máquinas virtuales. Una VM virtualiza el hardware y envía un sistema operativo huésped completo con su propio kernel. Un contenedor es un proceso aislado que utiliza el núcleo del host. Como resultado, los contenedores son más livianos, comienzan en fracciones de segundo y utilizan menos recursos. Pero un contenedor no es una VM liviana: está vinculado al kernel del host y su límite de aislamiento es más débil que el de una VM. Una máquina virtual tiene un aislamiento impuesto por hardware, mientras que una vulnerabilidad en el kernel compartido puede potencialmente escaparse de un contenedor; esa es la compensación por la velocidad y la densidad. El host debe coincidir con el tipo de contenedor: los contenedores de Linux necesitan un kernel de Linux, los contenedores de Windows necesitan un kernel de Windows. En macOS y Windows, Docker Desktop ejecuta de forma transparente una pequeña máquina virtual Linux (por ejemplo, a través de WSL2), por lo que los contenedores de Linux comparten el kernel de esa máquina virtual, no el kernel de su sistema operativo.
Arquitectura (cliente-servidor). Según la documentación de Docker:
- El cliente
dockeres la forma principal en que los usuarios interactúan con Docker; comandos comodocker runse envían al demonio. - El demonio
dockerd"hace el trabajo pesado" de crear, ejecutar y distribuir contenedores y gestiona objetos como imágenes, contenedores, redes y volúmenes. - El cliente habla con el demonio a través de una API REST a través de un socket UNIX o una interfaz de red, para que puedan ejecutarse en diferentes máquinas.
- Un registro almacena imágenes; el público predeterminado es Docker Hub.
Imágenes y contenedores. Una analogía útil: una imagen es como una clase (o un programa en el disco), y un contenedor es una instancia de ella (un proceso en ejecución); Puedes iniciar muchos contenedores a partir de una imagen.
- Una imagen es una plantilla de solo lectura con instrucciones para crear un contenedor, construido a partir de capas. Está definido por un Dockerfile; cuando lo cambia, solo se reconstruyen las capas modificadas.
- Un contenedor es una instancia ejecutable de una imagen. Encima de las capas de solo lectura de la imagen, agrega una fina capa grabable (copia en escritura); todo lo escrito allí se pierde cuando se elimina el contenedor, que es exactamente la razón por la que los datos persistentes necesitan volúmenes.
Cómo funciona el aislamiento (bajo el capó). Dockerd no llama al kernel directamente: delega la administración del ciclo de vida del contenedor a containerd, que invoca un tiempo de ejecución OCI; en Docker el valor predeterminado es runc, pero el tiempo de ejecución se puede conectar (crun, gVisor, Kata, etc.). El aislamiento real proviene de las características del kernel de Linux:
- espacios de nombres aíslan recursos (según la página man7 hay 8 tipos: PID, red, montaje, UTS, IPC, usuario, cgroup, tiempo). Un proceso sólo "ve" sus propios PID, su propia pila de red, etc.
- cgroups (grupos de control) límite y cuenta para el uso de recursos (CPU, memoria, E/S).
Seguimientos comunes. Las capas de imágenes se almacenan en caché; docker compose ejecuta aplicaciones de múltiples contenedores; los datos persisten a través de volúmenes (un contenedor es efímero por defecto); y OCI estandariza el formato de imagen (image-spec), el tiempo de ejecución (runtime-spec) y el protocolo de distribución del registro (distribution-spec); estas tres especificaciones mantienen el ecosistema interoperable.
