扩展架构

扩展是在 Docker Desktop 内运行的应用程序。它们打包为 Docker 镜像,通过 Docker Hub 分发,并由用户通过 Docker Desktop 仪表板内的市场或 Docker Extensions CLI 安装。

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

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

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

前端

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

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

每次用户单击**扩展**选项卡时,Docker Desktop 都会初始化扩展的 UI,就好像这是第一次一样。当他们离开该选项卡时,UI 本身及其启动的所有子进程(如果有)都将被终止。

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

提示

`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 项目,从 `metadata.json` 的 `vm` 部分的 `image` 选项创建容器,并将其附加到 Compose 项目。有关更多详细信息,请参阅 ui 元数据部分

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

注意

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

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

Backend and frontend communication

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

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

可执行文件

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

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

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

Executable and frontend communication

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

有关更多详细信息,请参阅主机元数据部分

学习如何调用主机二进制文件