扩展架构

Table of contents

扩展是运行在 Docker Desktop 内部的应用程序。它们被打包为 Docker 镜像,通过 Docker Hub 分发,用户可以通过 Docker Desktop 控制面板中的 Marketplace 或 Docker Extensions CLI 进行安装。

扩展可由三个(可选)组件构成:

  • 前端(或用户界面):在 Docker Desktop 控制面板的标签页中显示的 Web 应用程序
  • 后端:在 Docker Desktop 虚拟机中运行的一个或多个容器化服务
  • 可执行文件:Shell 脚本或二进制文件,Docker Desktop 在安装扩展时会将其复制到主机上
扩展的三个组件概览

扩展不一定需要包含所有这些组件,但至少需要包含其中一个,具体取决于扩展的功能。 要配置和运行这些组件,Docker Desktop 会使用 metadata.json 文件。有关更多详细信息,请参阅 metadata 部分。

前端

前端基本上是一个由 HTML、JavaScript 和 CSS 构成的 Web 应用程序。它可以由一个简单的 HTML 文件、原生 JavaScript 或任何前端框架(如 React 或 Vue.js)构建。

当 Docker Desktop 安装扩展时,它会从扩展镜像中提取 UI 文件夹,如 metadata.json 中的 ui 部分所定义。有关更多详细信息,请参阅 ui metadata 部分

每次用户点击 Extensions 标签页时,Docker Desktop 都会初始化扩展的 UI,就像第一次一样。当他们离开该标签页时,UI 本身以及由其启动的所有子进程(如果有)都会被终止。

前端可以通过 Extensions SDK 调用 docker 命令、与扩展后端通信,或调用部署在主机上的扩展可执行文件。

Tip

docker extension init 会生成一个基于 React 的扩展。但你仍然可以将其作为自己扩展的起点,使用任何其他前端框架,如 Vue、Angular、Svelte 等,或者继续使用原生 JavaScript。

了解如何为你的扩展 构建前端

后端

除了前端应用程序,扩展还可以包含一个或多个后端服务。在大多数情况下,扩展不需要后端,功能可以通过 SDK 调用 docker 命令来实现。然而,在某些情况下,扩展需要后端服务,例如:

  • 运行必须比前端存活时间更长的长时间运行进程
  • 在本地数据库中存储数据并通过 REST API 提供数据
  • 存储扩展状态,例如当按钮启动长时间运行进程时,这样如果你离开扩展再回来,前端可以从中断的地方继续
  • 访问 Docker Desktop 虚拟机中的特定资源,例如通过在 compose 文件中挂载文件夹
Tip

docker extension init 会生成一个 Go 后端。但你仍然可以将其作为自己扩展的起点,使用任何其他语言,如 Node.js、Python、Java、.Net 或任何其他语言和框架。

通常,后端由一个在 Docker Desktop 虚拟机中运行的容器构成。在内部,Docker Desktop 会创建一个 Docker Compose 项目,从 metadata.jsonvm 部分的 image 选项创建容器,并将其附加到 Compose 项目。有关更多详细信息,请参阅 ui metadata 部分

在某些情况下,可以使用 compose.yaml 文件而不是 image。当后端容器需要更具体的选项时,这很有用,例如挂载卷或请求 capabilities,这些无法仅通过 Docker 镜像表达。compose.yaml 文件也可用于添加扩展所需的多个容器,如数据库或消息代理。 请注意,如果 Compose 文件定义了许多服务,SDK 只能联系其中的第一个服务。

Note

在某些情况下,从后端与 Docker 引擎交互也很有用。 请参阅如何从后端使用 Docker socket

要与后端通信,扩展 SDK 提供了函数,用于从前端发起 GETPOSTPUTHEADDELETE 请求。在底层,通信是通过套接字或命名管道完成的,具体取决于操作系统。如果后端监听端口,将很难防止与主机上或容器中已运行的其他应用程序发生冲突。此外,一些用户在受限环境中运行 Docker Desktop,无法在其机器上打开端口。

后端和前端通信

最后,后端可以使用任何技术构建,只要它可以在容器中运行并监听套接字。

了解如何为你的扩展 添加后端

可执行文件

除了前端和后端,扩展还可以包含可执行文件。可执行文件是在安装扩展时安装在主机上的二进制文件或 shell 脚本。前端可以使用扩展 SDK 调用它们。

当扩展需要与第三方 CLI 工具(如 AWS、kubectl 等)交互时,这些可执行文件非常有用。将这些可执行文件与扩展一起打包,可以确保 CLI 工具始终可用,并且是用户机器上的正确版本。

当 Docker Desktop 安装扩展时,它会根据 metadata.json 中的 host 部分定义,将可执行文件复制到主机上。有关更多详细信息,请参阅 ui metadata 部分

可执行文件和前端通信

然而,由于它们是在用户的机器上执行的,因此必须对它们所运行的平台可用。 例如,如果你想分发 kubectl 可执行文件,你需要为 Windows、Mac 和 Linux 提供不同的版本。多架构镜像也需要包含为正确架构(AMD / ARM)构建的二进制文件。

有关更多详细信息,请参阅 host metadata 部分

了解如何调用主机二进制文件