了解 Windows 的权限要求

本页面包含有关在 Windows 上运行和安装 Docker Desktop 所需的权限信息,以及特权辅助进程 com.docker.service 的功能说明,以及采用此方案的原因。

它还 clarifies(阐明)以 root 用户身份运行容器与以 Administrator 用户身份在主机上运行并拥有 Windows Docker 引擎及 Windows 容器权限之间的区别。

权限要求

尽管 Docker Desktop 在 Windows 上无需 Administrator 权限即可运行,但在安装过程中仍需要相关权限。安装时会弹出 UAC 提示,允许安装一个具有特权的辅助服务。此后,只要您属于 docker-users 组,即可在无管理员权限的情况下运行 Docker Desktop。如果您执行了安装操作,则您将被自动添加到该组;其他用户则必须由管理员手动添加。此机制使管理员能够控制哪些用户可访问 Docker Desktop。

采用这种方法的原因是,Docker Desktop 需要执行一组有限的特权操作,这些操作由特权辅助进程 com.docker.service 完成。这种设计遵循最小权限原则,使得 Administrator 的访问权限仅用于绝对必要的操作,同时仍允许以非特权用户身份使用 Docker Desktop。

特权助手

特权辅助程序 com.docker.service 是一个 Windows 服务,它在后台以 SYSTEM 权限运行。它监听命名管道 //./pipe/dockerBackendV2。开发者运行 Docker Desktop 应用程序,该程序连接到命名管道并向服务发送命令。此命名管道受到保护,仅属于 docker-users 组的用户才能访问它。

该服务提供以下功能:

  • 确保在 Win32 主机文件中定义 kubernetes.docker.internal。定义 DNS 名称 kubernetes.docker.internal 可使 Docker 与容器共享 Kubernetes 上下文。
  • 确保在 Win32 主机文件中定义 host.docker.internalgateway.docker.internal。它们指向主机的本地 IP 地址,从而使应用程序能够使用相同的主机名从主机本身或容器内部解析出主机的 IP 地址。
  • 安全地缓存对开发者只读的注册表访问管理策略。
  • 创建 Hyper-V 虚拟机 "DockerDesktopVM" 并管理其生命周期——包括启动、停止和销毁该虚拟机。虚拟机名称在服务代码中硬编码,因此该服务无法用于创建或操作任何其他虚拟机。
  • 移动 VHDX 文件或文件夹。
  • 启动和停止 Windows Docker 引擎,并查询其是否正在运行。
  • 正在删除所有 Windows 容器数据文件。
  • 正在检查 Hyper-V 是否已启用。
  • 检查引导加载程序是否激活 Hyper-V。
  • 正在检查所需 Windows 功能是否已安装并启用。
  • 执行健康检查并获取服务自身的版本。

服务启动模式取决于所选的容器引擎,对于 WSL,还取决于是否需要在 Win32 hosts 文件中维护 host.docker.internalgateway.docker.internal。此设置由设置页面中的 Use the WSL 2 based engine 下的选项控制。启用该设置后,WSL 引擎的行为与 Hyper-V 相同。因此:

  • 使用 Windows 容器或 Hyper-V Linux 容器时,服务会在系统启动时自动启动,并持续运行,即使 Docker Desktop 未运行也是如此。这是为了确保您可以在不以管理员权限运行的情况下启动 Docker Desktop。
  • 使用 WSL2 Linux 容器时,该服务并非必需,因此系统启动时不会自动运行。当您切换到 Windows 容器或 Hyper-V Linux 容器,或选择在 Win32 主机文件中保留 host.docker.internalgateway.docker.internal 时,将显示用户账户控制 (UAC) 提示,要求您批准启动该服务的特权操作。若批准,则服务将启动,并设置为在下次 Windows 启动时自动运行。

在 Linux 虚拟机中以 root 身份运行的容器

Linux Docker守护进程和容器运行在由Docker管理的最小化、专用Linux虚拟机中。该虚拟机是不可变的,因此您无法对其进行扩展或更改已安装的软件。这意味着,尽管容器默认以root身份运行,但这并不允许修改该虚拟机,也不授予对Windows宿主机的Administrator访问权限。该Linux虚拟机作为安全边界,限制了对宿主机资源的访问。文件共享采用用户空间实现的文件服务器,任何从宿主机绑定挂载到Docker容器中的目录仍保留其原始权限。它不会为您提供对任何原本不可访问文件的访问权限。

增强的容器隔离性

此外,Docker Desktop 支持 增强型容器隔离模式(ECI), 该功能仅面向企业客户,可在不影响开发人员工作流的前提下进一步保障容器安全。

ECI 会自动在 Linux 用户命名空间中运行所有容器,从而使容器内的 root 用户映射为 Docker Desktop 虚拟机内的非特权用户。ECI 利用此技术及其他高级手段,进一步增强 Docker Desktop Linux 虚拟机内容器的安全性,使其与 Docker 守护进程及虚拟机内运行的其他服务实现更严格的隔离。

Windows 容器

与在虚拟机中运行的 Linux Docker 引擎和容器不同,Windows 容器是操作系统的一个功能,可直接在 Windows 主机上以 Administrator 特权级别运行。对于不希望其开发人员使用 Windows 容器的组织,从版本 4.11 起提供了一个 –no-windows-containers 安装程序标志,可用于禁用其使用。

网络

为了实现网络连接,Docker Desktop 使用一个用户空间进程(vpnkit),该进程会从启动它的用户处继承诸如防火墙规则、VPN、HTTP 代理属性等约束条件。