# 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

![Resumen de los tres componentes de una extensión](/extensions/extensions-sdk/architecture/images/extensions-architecture.png?w=600h=400)

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](/extensions/extensions-sdk/architecture/metadata) 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](/extensions/extensions-sdk/architecture/metadata/#ui-section) 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](https://www.npmjs.com/package/@docker/extension-api-client).

> [!TIP]
>
> El comando `docker extension init` genera 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](/extensions/extensions-sdk/build/frontend-extension-tutorial/) 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

> [!TIP]
>
> El comando `docker extension init` genera 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](/extensions/extensions-sdk/architecture/metadata/#vm-section) 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)](https://docs-docker.esdocu.com/engine/reference/run/#runtime-privilege-and-linux-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.

> [!NOTE]
>
> En algunos casos, también es útil interactuar con el motor de Docker desde el backend.
> Consulta [Cómo usar el socket de Docker](/extensions/guides/use-docker-socket-from-backend/) desde el backend.

Para comunicarse con el backend, el SDK de extensiones proporciona [funciones](/extensions/dev/api/backend/#get) 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.

![Comunicación entre backend y frontend](/extensions/extensions-sdk/architecture/images/extensions-arch-2.png?w=500h=300)

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](/extensions/extensions-sdk/build/backend-extension-tutorial/) 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](/extensions/dev/api/backend/#invoke-an-extension-binary-on-the-host).

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](/extensions/extensions-sdk/architecture/metadata/#host-section) para obtener más detalles.

![Comunicación entre ejecutable y frontend](/extensions/extensions-sdk/architecture/images/extensions-arch-3.png?w=250h=300)

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](/extensions/extensions-sdk/architecture/metadata/#host-section) para obtener más detalles.

Aprende a [invocar binarios del host](/extensions/guides/invoke-host-binaries/).

