扩展架构

扩展是运行在 Docker Desktop 中的应用程序。它们被打包成 Docker 镜像,通过 Docker Hub 分发,用户可以通过 Docker Desktop Dashboard 中的 Marketplace 或 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 本身及其启动的所有子进程(如果有)都将被终止。

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

提示

docker extension init 命令会生成一个基于 React 的扩展。但是,您可以将其用作自己扩展的起点,并使用任何其他前端框架,如 Vue、Angular、Svelte 等,甚至只使用原生 Javascript。

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

后端

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

  • 运行必须比前端更长的长时间运行进程
  • 将数据存储在本地数据库中并通过 REST API 提供服务
  • 存储扩展状态,例如当一个按钮启动一个长时间运行的进程时,这样如果用户离开扩展并返回,前端可以从上次离开的地方继续
  • 访问 Docker Desktop VM 中的特定资源,例如通过在 compose 文件中挂载文件夹
提示

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

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

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

注意

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

为了与后端通信,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)构建的二进制文件

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

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

© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.