{"id":1169,"date":"2026-03-11T15:20:16","date_gmt":"2026-03-11T18:20:16","guid":{"rendered":"https:\/\/maurobernal.com.ar\/blog\/?p=1169"},"modified":"2026-03-11T20:02:15","modified_gmt":"2026-03-11T23:02:15","slug":"arquitectura-interna-de-docker-engine-daemon-imagenes","status":"publish","type":"post","link":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/","title":{"rendered":"Por dentro del motor: entendiendo la arquitectura de Docker"},"content":{"rendered":"\n<p class=\"intro-destacado\">La primera vez que ejecut\u00e9 <code>docker run<\/code> funcion\u00f3. Pero cuando algo fall\u00f3, no ten\u00eda idea de d\u00f3nde buscar. No entend\u00eda qui\u00e9n hac\u00eda qu\u00e9, c\u00f3mo se comunicaban las piezas ni por qu\u00e9 a veces el daemon parec\u00eda tener vida propia. Este art\u00edculo es lo que me hubiera gustado leer antes de ese momento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Docker no es un solo programa: es un sistema de piezas<\/h2>\n\n\n\n<p>Uno de los errores conceptuales m\u00e1s comunes cuando arranc\u00e1s con Docker es pensarlo como \u00abel comando que corre contenedores\u00bb. En realidad, Docker es una arquitectura cliente-servidor compuesta por varios componentes que trabajan juntos. Entenderlos hace que todo lo dem\u00e1s tenga sentido.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">El flujo completo en un diagrama<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                        TU TERMINAL                          \u2502\n\u2502                                                             \u2502\n\u2502   $ docker run nginx        \u2190 Docker Client (CLI)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                   \u2502  REST API (Unix socket o TCP)\n                   \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502                    DOCKER DAEMON (dockerd)                   \u2502\n\u2502                                                             \u2502\n\u2502   \u2022 Escucha comandos del cliente                            \u2502\n\u2502   \u2022 Administra im\u00e1genes, contenedores, redes, vol\u00famenes     \u2502\n\u2502   \u2022 Delega la ejecuci\u00f3n a containerd                        \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n           \u2502                         \u2502\n           \u25bc                         \u25bc\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510      \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   containerd     \u2502      \u2502         Docker Registry           \u2502\n\u2502                  \u2502      \u2502   (Docker Hub \/ privado)          \u2502\n\u2502  \u2022 Gestiona      \u2502      \u2502                                   \u2502\n\u2502    ciclo de vida \u2502      \u2502  \u2022 Almacena im\u00e1genes              \u2502\n\u2502    del contenedor\u2502      \u2502  \u2022 docker pull baja de ac\u00e1        \u2502\n\u2502  \u2022 Usa runc para \u2502      \u2502  \u2022 docker push sube ac\u00e1           \u2502\n\u2502    crear procesos\u2502      \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Engine: el coraz\u00f3n del sistema<\/h2>\n\n\n\n<p>El <strong>Docker Engine<\/strong> es el conjunto completo: client + daemon + la API REST que los conecta. Cuando instal\u00e1s Docker en un servidor, lo que instal\u00e1s es el Engine. En mis nodos SUSE Linux, el daemon corre como servicio systemd y arranca autom\u00e1ticamente con el sistema.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ver estado del daemon\nsudo systemctl status docker\n\n# Ver logs del daemon en tiempo real\nsudo journalctl -u docker -f\n\n# Informaci\u00f3n completa del sistema Docker\ndocker info<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Client: lo que escrib\u00eds en la terminal<\/h2>\n\n\n\n<p>El cliente es simplemente la CLI: el binario <code>docker<\/code> que us\u00e1s en la terminal. Su \u00fanico trabajo es traducir tus comandos a llamadas a la API REST del daemon. Lo que importa saber: <strong>el cliente y el daemon pueden estar en m\u00e1quinas diferentes<\/strong>. Puedo controlar el daemon de un servidor remoto desde mi notebook sin ning\u00fan problema.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Conectar el cliente a un daemon remoto\nexport DOCKER_HOST=tcp:\/\/192.168.1.100:2376\ndocker ps  # Lista contenedores del servidor remoto\n\n# O con contextos (la forma moderna)\ndocker context create servidor-prod --docker \"host=ssh:\/\/mbernal@192.168.1.100\"\ndocker context use servidor-prod\ndocker ps  # Ahora habla con el servidor remoto<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Daemon (dockerd): quien realmente hace el trabajo<\/h2>\n\n\n\n<p>El daemon es el proceso que corre en background y gestiona todo: im\u00e1genes, contenedores, redes y vol\u00famenes. Cuando ejecut\u00e1s <code>docker run nginx<\/code>, es el daemon quien:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Recibe el comando del cliente<\/li>\n<li>Verifica si la imagen <code>nginx<\/code> existe localmente<\/li>\n<li>Si no existe, la descarga del registry<\/li>\n<li>Crea el contenedor usando <code>containerd<\/code> y <code>runc<\/code><\/li>\n<li>Configura la red y el sistema de archivos<\/li>\n<li>Arranca el proceso principal del contenedor<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Im\u00e1genes Docker: plantillas inmutables<\/h2>\n\n\n\n<p>Una imagen es una plantilla de solo lectura que define el sistema de archivos y la configuraci\u00f3n inicial de un contenedor. Est\u00e1 compuesta por <strong>capas<\/strong> (layers), donde cada instrucci\u00f3n del Dockerfile agrega una capa nueva. Esta arquitectura por capas es brillante: si dos im\u00e1genes comparten las mismas capas base, se almacenan una sola vez en disco.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Ver im\u00e1genes locales\ndocker images\n\n# Ver las capas de una imagen\ndocker history nginx:latest\n\n# Inspeccionar metadatos completos\ndocker inspect nginx:latest<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Contenedores: instancias en ejecuci\u00f3n de una imagen<\/h2>\n\n\n\n<p>Un contenedor es una imagen en ejecuci\u00f3n. La diferencia clave: la imagen es inmutable (solo lectura), mientras que el contenedor agrega una capa de escritura encima donde los procesos pueden crear y modificar archivos. Cuando el contenedor se destruye, esa capa desaparece. Por eso <strong>los datos importantes van en vol\u00famenes<\/strong> \u2014 pero eso lo vemos en otro art\u00edculo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Relaci\u00f3n imagen \u2192 contenedor\ndocker images ls          # ver im\u00e1genes (plantillas)\ndocker ps -a              # ver contenedores (instancias)\n\n# Crear contenedor sin arrancarlo\ndocker create --name mi-nginx nginx\n\n# Arrancarlo\ndocker start mi-nginx\n\n# O directamente: crear + arrancar\ndocker run -d --name mi-nginx -p 80:80 nginx<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Registry: el repositorio de im\u00e1genes<\/h2>\n\n\n\n<p>El registry es donde viven las im\u00e1genes. Docker Hub es el registry p\u00fablico por defecto, pero en producci\u00f3n muchas empresas usan registries privados. En mi entorno on-premise uso un registry privado para no depender de internet en los deploys.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Levantar un registry privado local\ndocker run -d -p 5000:5000 --name registry-privado   -v \/data\/registry:\/var\/lib\/registry   registry:2\n\n# Tagear imagen para el registry privado\ndocker tag mi-api:latest localhost:5000\/mi-api:latest\n\n# Subir al registry privado\ndocker push localhost:5000\/mi-api:latest\n\n# Bajar desde el registry privado\ndocker pull localhost:5000\/mi-api:latest<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Docker Compose: orquestaci\u00f3n local<\/h2>\n\n\n\n<p>Docker Compose es la herramienta para definir y ejecutar aplicaciones multi-contenedor. En lugar de ejecutar m\u00faltiples <code>docker run<\/code>, defin\u00eds todos los servicios en un archivo YAML y los gestion\u00e1s con un solo comando. Lo veremos en profundidad m\u00e1s adelante \u2014 te adelanto que cambia completamente la forma de trabajar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">El flujo completo: qu\u00e9 pasa cuando ejecut\u00e1s docker pull nginx<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Esto es lo que pasa internamente:\n$ docker pull nginx\n\n# 1. Docker Client env\u00eda petici\u00f3n al daemon via \/var\/run\/docker.sock\n# 2. Daemon consulta: \u00bftengo nginx:latest localmente?\n# 3. Si no \u2192 contacta Docker Hub (registry.hub.docker.com)\n# 4. Autentica (si la imagen es privada)\n# 5. Descarga cada capa (layer) que no tenga en cache\n# 6. Verifica integridad con el digest SHA256\n# 7. Almacena las capas en \/var\/lib\/docker\/overlay2\/\n\nUsing default tag: latest\nlatest: Pulling from library\/nginx\na803e7c4b030: Pull complete   \u2190 cada l\u00ednea es una capa\n8b625c47d697: Pull complete\n4d3239651a63: Pull complete\nDigest: sha256:bc5eac5eafc581aeda3008b4b1f07ebba230de2f27d47767129a6a905c84f470\nStatus: Downloaded newer image for nginx:latest<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Por qu\u00e9 me importa entender esto<\/h2>\n\n\n\n<p>El d\u00eda que tuve un contenedor que no arrancaba y no sab\u00eda por d\u00f3nde empezar a debuggear, entender la arquitectura me salv\u00f3. Saber que el daemon escribe en <code>\/var\/lib\/docker\/<\/code>, que los logs del daemon est\u00e1n en journalctl, que el socket Unix es <code>\/var\/run\/docker.sock<\/code> \u2014 esos detalles marcan la diferencia entre resolver el problema en 5 minutos o perder una hora.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Cuando algo falla, estos son mis primeros comandos:\nsudo journalctl -u docker --since \"1 hour ago\"\ndocker info\ndocker system df          # ver uso de disco\ndocker system events      # stream de eventos del daemon<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\"\/>\n\n\n\n<p><em>\u2190 <a href=\"https:\/\/maurobernal.com.ar\/blog\/blog\/kubernetes\/como-docker-cambio-la-forma-en-que-trabajo\/\">Art\u00edculo anterior: C\u00f3mo Docker cambi\u00f3 la forma en que trabajo<\/a> | <strong>Serie Docker Completo<\/strong> | Pr\u00f3ximo: Mi gu\u00eda para escribir Dockerfiles \u2192<\/em><\/p>\n\n\n<hr class=\"wp-block-separator\"\/>\n<p><em>\u2190 <a href=\"https:\/\/maurobernal.com.ar\/blog\/blog\/kubernetes\/como-docker-cambio-la-forma-en-que-trabajo\/\">Art\u00edculo anterior: C\u00f3mo Docker cambi\u00f3 la forma en que trabajo (y por qu\u00e9 tard\u00e9 en entenderlo)<\/a> | <strong>Serie Docker Completo<\/strong> | Pr\u00f3ximo: <a href=\"https:\/\/maurobernal.com.ar\/blog\/blog\/kubernetes\/como-escribir-dockerfiles-buenas-practicas-ejemplos\/\">Mi gu\u00eda para escribir Dockerfiles que no me den verg\u00fcenza \u2192<\/a><\/em><\/p>","protected":false},"excerpt":{"rendered":"<p>Entender la arquitectura de Docker \u2014 client, daemon, containerd, registry \u2014 es lo que separa a quien usa Docker de quien lo domina. Te lo explico con diagramas y ejemplos reales.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[233],"tags":[245,241,246,242,240,215,247],"class_list":["post-1169","post","type-post","status-publish","format-standard","hentry","category-kubernetes","tag-arquitectura","tag-contenedores","tag-daemon","tag-devops","tag-docker","tag-linux","tag-registry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Por dentro del motor: entendiendo la arquitectura de Docker &#183; devops Mauro Bernal<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Por dentro del motor: entendiendo la arquitectura de Docker &#183; devops Mauro Bernal\" \/>\n<meta property=\"og:description\" content=\"Entender la arquitectura de Docker \u2014 client, daemon, containerd, registry \u2014 es lo que separa a quien usa Docker de quien lo domina. Te lo explico con diagramas y ejemplos reales.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/\" \/>\n<meta property=\"og:site_name\" content=\"devops Mauro Bernal\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-11T18:20:16+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T23:02:15+00:00\" \/>\n<meta name=\"author\" content=\"Mauro Bernal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:site\" content=\"@_maurobernal\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mauro Bernal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/\"},\"author\":{\"name\":\"Mauro Bernal\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"headline\":\"Por dentro del motor: entendiendo la arquitectura de Docker\",\"datePublished\":\"2026-03-11T18:20:16+00:00\",\"dateModified\":\"2026-03-11T23:02:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/\"},\"wordCount\":692,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"keywords\":[\"arquitectura\",\"contenedores\",\"daemon\",\"devops\",\"docker\",\"linux\",\"registry\"],\"articleSection\":[\"Kubernetes\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/\",\"name\":\"Por dentro del motor: entendiendo la arquitectura de Docker &#183; devops Mauro Bernal\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\"},\"datePublished\":\"2026-03-11T18:20:16+00:00\",\"dateModified\":\"2026-03-11T23:02:15+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/arquitectura-interna-de-docker-engine-daemon-imagenes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Por dentro del motor: entendiendo la arquitectura de Docker\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/\",\"name\":\"devops Mauro Bernal\",\"description\":\"Cuando tu trabajo es hacer que las cosas funcionen bien...\",\"publisher\":{\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/maurobernal.com.ar\\\/blog\\\/#\\\/schema\\\/person\\\/09c4dbdfb59b20e015c703fd19713283\",\"name\":\"Mauro Bernal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\",\"width\":1740,\"height\":1740,\"caption\":\"Mauro Bernal\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/maurobernal.com.ar\\\/blog\\\/wp-content\\\/uploads\\\/2023\\\/07\\\/logo-maurobernal.png?fit=1740%2C1740&ssl=1\"},\"description\":\"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman\",\"sameAs\":[\"https:\\\/\\\/maurobernal.com.ar\",\"https:\\\/\\\/x.com\\\/_maurobernal\",\"https:\\\/\\\/youtube.com\\\/maurobernal\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Por dentro del motor: entendiendo la arquitectura de Docker &#183; devops Mauro Bernal","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/","og_locale":"es_ES","og_type":"article","og_title":"Por dentro del motor: entendiendo la arquitectura de Docker &#183; devops Mauro Bernal","og_description":"Entender la arquitectura de Docker \u2014 client, daemon, containerd, registry \u2014 es lo que separa a quien usa Docker de quien lo domina. Te lo explico con diagramas y ejemplos reales.","og_url":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/","og_site_name":"devops Mauro Bernal","article_published_time":"2026-03-11T18:20:16+00:00","article_modified_time":"2026-03-11T23:02:15+00:00","author":"Mauro Bernal","twitter_card":"summary_large_image","twitter_creator":"@_maurobernal","twitter_site":"@_maurobernal","twitter_misc":{"Escrito por":"Mauro Bernal","Tiempo de lectura":"6 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/#article","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/"},"author":{"name":"Mauro Bernal","@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"headline":"Por dentro del motor: entendiendo la arquitectura de Docker","datePublished":"2026-03-11T18:20:16+00:00","dateModified":"2026-03-11T23:02:15+00:00","mainEntityOfPage":{"@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/"},"wordCount":692,"commentCount":0,"publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"keywords":["arquitectura","contenedores","daemon","devops","docker","linux","registry"],"articleSection":["Kubernetes"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/","url":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/","name":"Por dentro del motor: entendiendo la arquitectura de Docker &#183; devops Mauro Bernal","isPartOf":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#website"},"datePublished":"2026-03-11T18:20:16+00:00","dateModified":"2026-03-11T23:02:15+00:00","breadcrumb":{"@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/maurobernal.com.ar\/blog\/arquitectura-interna-de-docker-engine-daemon-imagenes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/maurobernal.com.ar\/blog\/"},{"@type":"ListItem","position":2,"name":"Por dentro del motor: entendiendo la arquitectura de Docker"}]},{"@type":"WebSite","@id":"https:\/\/maurobernal.com.ar\/blog\/#website","url":"https:\/\/maurobernal.com.ar\/blog\/","name":"devops Mauro Bernal","description":"Cuando tu trabajo es hacer que las cosas funcionen bien...","publisher":{"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/maurobernal.com.ar\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":["Person","Organization"],"@id":"https:\/\/maurobernal.com.ar\/blog\/#\/schema\/person\/09c4dbdfb59b20e015c703fd19713283","name":"Mauro Bernal","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","url":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","contentUrl":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1","width":1740,"height":1740,"caption":"Mauro Bernal"},"logo":{"@id":"https:\/\/i0.wp.com\/maurobernal.com.ar\/blog\/wp-content\/uploads\/2023\/07\/logo-maurobernal.png?fit=1740%2C1740&ssl=1"},"description":"Desarrollo de Sistemas en .Net, IT Callcenters, DBA de SQL Server, Mikrotik, Pentest y T\u00e9cnico consultor de Sistemas Bejerman","sameAs":["https:\/\/maurobernal.com.ar","https:\/\/x.com\/_maurobernal","https:\/\/youtube.com\/maurobernal"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1169","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/comments?post=1169"}],"version-history":[{"count":4,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1169\/revisions"}],"predecessor-version":[{"id":1244,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/posts\/1169\/revisions\/1244"}],"wp:attachment":[{"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/media?parent=1169"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/categories?post=1169"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/maurobernal.com.ar\/blog\/wp-json\/wp\/v2\/tags?post=1169"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}