扩展架构
扩展是在 Docker Desktop 内运行的应用程序。它们打包为 Docker 镜像,通过 Docker Hub 分发,并由用户通过 Docker Desktop 仪表板内的市场或 Docker Extensions CLI 安装。
扩展可以由三个(可选)组件组成
- 前端(或用户界面):在 Docker Desktop 仪表板的选项卡中显示的 Web 应用程序
- 后端:在 Docker Desktop 虚拟机中运行的一个或多个容器化服务
- 可执行文件:Docker Desktop 在安装扩展时复制到主机的 shell 脚本或二进制文件


扩展不一定需要所有这些组件,但至少需要其中一个,具体取决于扩展功能。为了配置和运行这些组件,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 提供了函数,以便前端可以发出GET
、POST
、PUT
、HEAD
和DELETE
请求。在底层,通信是通过套接字或命名管道完成的,具体取决于操作系统。如果后端正在监听端口,则很难防止与主机上或已在容器中运行的其他应用程序发生冲突。此外,一些用户在受限环境中运行Docker Desktop,他们无法在其机器上打开端口。


最后,后端可以使用任何技术构建,只要它能够在容器中运行并在套接字上监听即可。
了解更多关于向扩展添加后端的信息。
可执行文件
除了前端和后端之外,扩展还可以包含可执行文件。可执行文件是在安装扩展时安装在主机上的二进制文件或shell脚本。前端可以使用扩展SDK调用它们。
当扩展需要与第三方CLI工具(如AWS、kubectl
等)交互时,这些可执行文件非常有用。将这些可执行文件与扩展一起交付,可以确保CLI工具始终可用,并且版本正确,位于用户的机器上。
当Docker Desktop安装扩展时,它会根据metadata.json
中的host
部分定义将可执行文件复制到主机。有关更多详细信息,请参阅UI 元数据部分。


但是,由于它们是在用户的机器上执行的,因此它们必须可用于其运行的平台。例如,如果要交付kubectl
可执行文件,则需要为Windows、Mac和Linux提供不同的版本。多架构镜像还需要包含为正确的架构(AMD/ARM)构建的二进制文件。
有关更多详细信息,请参阅主机元数据部分。
学习如何调用主机二进制文件。