Docker funciona mediante una arquitectura cliente-servidor. La CLI traduce una intención humana en una solicitud a la API del Engine; el daemon coordina imágenes, redes, volúmenes y contenedores; componentes especializados construyen la image y crean el proceso aislado.
Texto
docker CLI
→ Docker API
→ dockerd
├── BuildKit / builder
├── image store y registry
├── network y volume drivers
└── containerd
→ runc
→ proceso del container
Entender esta cadena evita la idea equivocada de que el comando docker “es” Docker completo. También permite localizar fallos: una orden puede fallar antes del daemon, durante el pull, en la creación del runtime o dentro de la aplicación.
Un sistema de contenedores debe coordinar tareas diferentes:
recibir comandos locales o remotos;
autenticar y descargar imágenes;
construir artefactos;
almacenar capas y metadata;
crear namespaces y cgroups;
conectar redes;
montar almacenamiento;
iniciar, detener y observar procesos;
conservar estado administrativo después de que la CLI termine.
Separar cliente y servidor permite que la CLI sea una interfaz ligera y que el daemon mantenga el estado del host. También permite administrar un Engine remoto mediante un contexto, aunque esa capacidad exige proteger el canal y las credenciales.
El daemon administra el estado de Docker Engine. Entre otras tareas:
expone la API;
valida solicitudes;
coordina creación y eliminación de recursos;
administra redes y volúmenes;
se comunica con registries;
delega lifecycle de containers;
registra eventos.
Cuando dockerd se detiene, la capacidad de administrar recursos se pierde. El comportamiento de containers ya iniciados depende de la configuración y componentes del runtime, pero no debes asumir continuidad sin probar la versión y política del entorno.
En Linux, la CLI suele conectarse a un socket Unix:
Texto
/var/run/docker.sock
Quien puede usar ese socket puede pedir al daemon crear containers privilegiados, montar el filesystem del host o acceder a secretos. Por eso montar el socket dentro de un container suele equivaler a entregar control administrativo del host.
Bash
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
No es “solo acceso para listar containers”. La API permite operaciones de alto impacto.
containerd administra el lifecycle de containers, contenido y snapshots mediante APIs de runtime. Docker Engine lo utiliza como componente interno.
Su responsabilidad está más cerca de:
preparar bundles OCI;
gestionar snapshots y contenido;
crear y supervisar tareas;
conservar control del proceso mediante shims.
No conviene administrar directamente con ctr recursos creados por Docker salvo diagnóstico experto: ctr es una herramienta de bajo nivel y no representa todas las abstracciones de Docker.
docker run es una operación conveniente que combina creación y arranque. La CLI envía configuración de image, command, environment, mounts, network, recursos y políticas.
Si no existe localmente, consulta el registry y descarga contenido faltante. Un tag puede apuntar a contenido diferente con el tiempo; un digest fija el resultado.
Docker Engine es el daemon y componentes para ejecutar containers. Docker Desktop añade una experiencia administrada para macOS, Windows y Linux, normalmente con:
VM Linux cuando se necesita;
CLI y Compose;
gestión de recursos;
integración de filesystem y red;
UI y extensiones.
En macOS y Windows, el daemon de containers Linux vive dentro de la VM. Por eso paths, rendimiento y networking pueden diferir de un host Linux nativo.
docker logs api
docker inspect api --format'{{json .State}}'
Exit code 1 suele venir de la aplicación; 137 puede relacionarse con SIGKILL u OOM; 126/127 suelen indicar permisos o comando inexistente, aunque el contexto importa.
Supón un servicio de CI que recibe el socket para construir imágenes. Si la aplicación es comprometida, puede pedir:
Bash
docker run --rm-v /:/host alpine chroot /host sh
El proceso obtiene acceso al filesystem del host mediante el daemon. Ejecutar el servicio como usuario no root dentro de su container no neutraliza este acceso porque el daemon realiza la operación privilegiada.
Versiones modernas de Docker pueden usar el image store de containerd. Conceptos como capas y digests permanecen, pero paths internos, snapshots y herramientas de diagnóstico pueden cambiar. No dependas de manipular directamente el data root.