扩展架构

扩展是运行在 Docker Desktop 内部的应用程序。它们以 Docker 镜像的形式打包,通过 Docker Hub 进行分发,用户可通过 Docker Desktop 仪表盘中的应用市场或 Docker Extensions CLI 命令行工具进行安装。

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

  • 前端界面(或用户界面):在 Docker Desktop 的仪表板标签页中显示的 Web 应用程序
  • 后端:一个或多个在 Docker Desktop 虚拟机中运行的容器化服务
  • 可执行文件:Docker Desktop 在安装扩展时复制到主机上的 shell 脚本或Binaries
Overview of the three components of an extension

扩展程序不一定需要包含所有这些组件,但根据扩展功能的不同,至少需要包含其中的一项。 Docker Desktop 使用 metadata.json 文件来配置和运行这些组件。有关更多详细信息,请参阅 元数据部分。

前端界面

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

当 Docker Desktop 安装该扩展时,它会从扩展镜像中提取 UI 文件夹,具体由 ui 部分在 metadata.json 中定义。有关更多详情,请参见 UI 元数据部分

每次用户点击扩展选项卡时,Docker Desktop 都会像首次加载一样初始化该扩展的用户界面。当用户离开该选项卡时,该用户界面本身及其启动的所有子进程(如果存在)都将被终止。

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

提示

docker extension init 生成一个基于 React 的扩展。但您仍可将其作为自身扩展的起点,并使用任意其他前端框架,例如 Vue、Angular、Svelte 等,甚至继续使用原生 JavaScript。

了解有关为您的扩展程序 构建前端的更多信息。

后端

除了前端应用程序外,扩展还可以包含一个或多个后端服务。在大多数情况下,扩展无需后端服务,相关功能可通过SDK调用Docker命令即可实现。但某些场景下,扩展需要依赖后端服务,例如:

  • 运行必须比前端生存时间更长的长时间运行进程
  • 将数据存储在本地数据库中,并通过REST API提供服务
  • 为了存储扩展程序的状态(例如,当按钮启动一个长时间运行的进程时),以便在您离开扩展程序页面后再次返回时,前端能够恢复到之前的状态继续执行
  • 要访问 Docker Desktop 虚拟机中的特定资源,例如通过在 compose 文件中挂载文件夹

提示

docker extension init 会生成一个 Go 后端。但您仍可将其作为开发自身扩展的起点,并使用其他任意语言和框架,例如 Node.js、Python、Java、.NET 等。

通常,后端由一个在 Docker Desktop 虚拟机内运行的容器组成。在内部,Docker Desktop 会创建一个 Docker Compose 项目,从 image 部分的 vm 部分的 metadata.json 选项 image 创建该容器,并将其附加到该 Compose 项目上。有关更多详细信息,请参见 UI 元数据部分

在某些情况下,可以使用 compose.yml 文件替代 image 文件。当后端容器需要更具体的配置选项(例如挂载卷或请求能力),而这些无法仅通过Docker镜像来表达时,这种方式尤为有用。compose.yml 文件还可用于添加扩展所需的多个容器,例如数据库或消息代理。 注意:若Compose文件中定义了多个服务,SDK仅能与其中第一个服务建立连接。

注意

在某些情况下,从后端与Docker引擎进行交互是有用的。 请参阅 如何从后端使用Docker套接字

为与后端通信,扩展 SDK 提供了 函数,用于从前端发起 GETPOSTPUTHEADDELETE 请求。在底层,通信通过套接字或命名管道实现,具体取决于操作系统。如果后端监听某个端口,则很难避免与其他已在主机或容器中运行的应用程序发生端口冲突。此外,部分用户在受限环境中运行 Docker Desktop,无法在机器上开放端口。

Backend and frontend communication

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

了解更多关于 为您的扩展添加后端的信息。

可执行文件

除了前端和后端之外,扩展还可以包含可执行文件。可执行文件是指在安装扩展时安装到宿主机上的Binaries或Shell脚本。 前端可以通过扩展SDK调用这些可执行文件。

这些可执行文件在扩展需要与第三方命令行工具(如 AWS、kubectl 等)进行交互时非常有用。 将这些可执行文件与扩展一起分发,可确保用户机器上始终可用相应版本的命令行工具。

当 Docker Desktop 安装该扩展时,它会按照 host 部分中的定义,将可执行文件复制到宿主机上。 详见 UI 元数据部分 了解更多信息。

Executable and frontend communication

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

详见 主机元数据部分以获取更多详情。

了解如何 调用主机Binaries