Arquitectura de la extensión
Las extensiones son aplicaciones que se ejecutan dentro de Docker Desktop. Están empaquetadas como imágenes de Docker, se distribuyen a través de Docker Hub y los usuarios las instalan mediante el Marketplace dentro del panel de control (Dashboard) de Docker Desktop o la CLI de extensiones de Docker.
Las extensiones pueden estar compuestas por tres componentes (opcionales):
- Un frontend (o interfaz de usuario): Una aplicación web que se muestra en una pestaña del panel de control de Docker Desktop
- Un backend: Uno o varios servicios contenedorizados que se ejecutan en la VM de Docker Desktop
- Ejecutables: Scripts de shell o binarios que Docker Desktop copia en el host al instalar la extensión

Una extensión no necesita tener necesariamente todos estos componentes, sino al menos uno de ellos dependiendo de las características de la extensión. Para configurar y ejecutar estos componentes, Docker Desktop utiliza un archivo metadata.json. Consulta la sección de metadatos para obtener más detalles.
El frontend
El frontend es básicamente una aplicación web hecha con HTML, JavaScript y CSS. Se puede construir con un archivo HTML simple, JavaScript puro (vanilla) o cualquier framework de frontend, como React o Vue.js.
Cuando Docker Desktop instala la extensión, extrae la carpeta de la interfaz de usuario (UI) de la imagen de la extensión, tal como lo define la sección ui en el metadata.json. Consulta la sección de metadatos de ui para obtener más detalles.
Cada vez que los usuarios seleccionan la pestaña Extensions (Extensiones), Docker Desktop inicializa la interfaz de usuario de la extensión como si fuera la primera vez. Cuando salen de la pestaña, tanto la interfaz de usuario en sí como todos los subprocesos iniciados por ella (si los hay) se terminan.
El frontend puede invocar comandos de docker, comunicarse con el backend de la extensión o invocar ejecutables de la extensión desplegados en el host, a través del Extensions SDK.
TipEl comando
docker extension initgenera una extensión basada en React. Sin embargo, puedes usarlo como punto de partida para tu propia extensión y utilizar cualquier otro framework de frontend, como Vue, Angular, Svelte, etc., o incluso quedarte con JavaScript puro.
Obtén más información sobre cómo construir un frontend para tu extensión.
El backend
Junto con una aplicación de frontend, las extensiones también pueden contener uno o varios servicios de backend. En la mayoría de los casos, la extensión no necesita un backend y las funcionalidades se pueden implementar simplemente invocando comandos de Docker a través del SDK. Sin embargo, existen algunos casos en los que una extensión requiere un servicio de backend, por ejemplo:
- Para ejecutar procesos de larga duración que deben seguir funcionando más allá de la duración del frontend
- Para almacenar datos en una base de datos local y servirlos de vuelta mediante una API REST
- Para almacenar el estado de la extensión, como cuando un botón inicia un proceso de larga duración, de modo que si sales de la extensión y regresas, el frontend pueda continuar donde lo dejó
- Para acceder a recursos específicos en la VM de Docker Desktop, por ejemplo, montando carpetas en el archivo compose
TipEl comando
docker extension initgenera un backend en Go. Sin embargo, puedes usarlo como punto de partida para tu propia extensión y utilizar cualquier otro lenguaje como Node.js, Python, Java, .NET o cualquier otro lenguaje y framework.
Por lo general, el backend está compuesto por un contenedor que se ejecuta dentro de la VM de Docker Desktop. Internamente, Docker Desktop crea un proyecto de Docker Compose, crea el contenedor a partir de la opción image de la sección vm del metadata.json y lo asocia al proyecto de Compose. Consulta la sección de metadatos de ui para obtener más detalles.
En algunos casos, se puede utilizar un archivo compose.yaml en lugar de una image. Esto es útil cuando el contenedor de backend necesita opciones más específicas, como montar volúmenes o solicitar capacidades (capabilities) que no se pueden expresar solo con una imagen de Docker. El archivo compose.yaml también se puede usar para añadir múltiples contenedores necesarios para la extensión, como una base de datos o un agente de mensajería (message broker).
Ten en cuenta que, si el archivo de Compose define muchos servicios, el SDK solo podrá comunicarse con el primero de ellos.
NoteEn algunos casos, también es útil interactuar con el motor de Docker desde el backend. Consulta Cómo usar el socket de Docker desde el backend.
Para comunicarse con el backend, el SDK de extensiones proporciona funciones para realizar peticiones GET, POST, PUT, HEAD y DELETE desde el frontend. Por debajo, la comunicación se realiza a través de un socket o una tubería con nombre (named pipe), según el sistema operativo. Si el backend escuchara en un puerto, sería difícil evitar colisiones con otras aplicaciones que ya se estuvieran ejecutando en el host o en un contenedor. Además, algunos usuarios ejecutan Docker Desktop en entornos restringidos donde no pueden abrir puertos en sus máquinas.

Por último, el backend se puede construir con cualquier tecnología, siempre que pueda ejecutarse en un contenedor y escuchar en un socket.
Obtén más información sobre cómo añadir un backend a tu extensión.
Ejecutables
Además del frontend y del backend, las extensiones también pueden contener ejecutables. Los ejecutables son binarios o scripts de shell que se instalan en el host al instalar la extensión. El frontend puede invocarlos con el SDK de la extensión.
Estos ejecutables son útiles cuando la extensión necesita interactuar con una herramienta de CLI de terceros, como AWS, kubectl, etc. Incluir estos ejecutables con la extensión garantiza que la herramienta de CLI esté siempre disponible, en la versión correcta, en la máquina de los usuarios.
Cuando Docker Desktop instala la extensión, copia los ejecutables en el host tal como se define en la sección host del metadata.json. Consulta la sección de metadatos de ui para obtener más detalles.

Sin embargo, dado que se ejecutan en la máquina de los usuarios, deben estar disponibles para la plataforma en la que se están ejecutando.
Por ejemplo, si deseas incluir el ejecutable kubectl, debes proporcionar una versión diferente para Windows, Mac y Linux. Las imágenes multiarquitectura también deberán incluir binarios compilados para la arquitectura correcta (AMD / ARM).
Consulta la sección de metadatos de host para obtener más detalles.
Aprende a invocar binarios del host.