了解 Windows 的权限要求
此页面包含有关在Windows上运行和安装Docker Desktop的权限要求、特权助手进程com.docker.service
的功能以及这种方法背后的原因的信息。
它还阐明了以root
身份运行容器与在主机上拥有管理员
访问权限的区别,以及Windows Docker引擎和Windows容器的权限。
权限要求
虽然可以在没有管理员
权限的情况下运行Windows上的Docker Desktop,但在安装过程中需要这些权限。安装时,您会收到一个UAC提示,允许安装特权助手服务。之后,如果你是docker-users
组的成员,就可以在没有管理员权限的情况下运行Docker Desktop。如果您进行了安装,则会自动添加到此组,但其他用户必须手动添加。这允许管理员控制谁可以访问Docker Desktop。
采用这种方法的原因是Docker Desktop需要执行由特权助手进程com.docker.service
执行的一组有限的特权操作。按照最小权限原则,这种方法只在绝对必要的操作中使用管理员
访问权限,同时仍然能够以非特权用户身份使用Docker Desktop。
特权助手
特权助手com.docker.service
是一个在后台以SYSTEM
权限运行的Windows服务。它侦听命名管道//./pipe/dockerBackendV2
。开发者运行Docker Desktop应用程序,该应用程序连接到命名管道并将命令发送到服务。此命名管道受保护,只有属于docker-users
组的用户才能访问它。
该服务执行以下功能:
- 确保在Win32 hosts文件中定义
kubernetes.docker.internal
。定义DNS名称kubernetes.docker.internal
允许Docker与容器共享Kubernetes上下文。 - 确保在Win32 hosts文件中定义
host.docker.internal
和gateway.docker.internal
。它们指向主机本地IP地址,并允许应用程序使用相同的名称从主机本身或容器中解析主机IP。 - 安全地缓存对开发人员而言是只读的注册表访问管理策略。
- 创建Hyper-V虚拟机
"DockerDesktopVM"
并管理其生命周期——启动、停止和销毁它。虚拟机名称硬编码在服务代码中,因此该服务不能用于创建或操作任何其他虚拟机。 - 移动VHDX文件或文件夹。
- 启动和停止Windows Docker引擎并查询其是否正在运行。
- 删除所有Windows容器数据文件。
- 检查Hyper-V是否已启用。
- 检查引导加载程序是否激活Hyper-V。
- 检查必需的Windows功能是否已安装和启用。
- 进行健康检查并检索服务本身的版本。
服务启动模式取决于选择的容器引擎,以及对于WSL,取决于是否需要在Win32 hosts文件中维护host.docker.internal
和gateway.docker.internal
。这由设置页面中的使用基于WSL 2的引擎
设置控制。当设置此选项时,WSL引擎的行为与Hyper-V相同。因此:
- 对于Windows容器或Hyper-V Linux容器,系统启动时启动服务,并且始终运行,即使Docker Desktop未运行也是如此。这是必需的,这样您就可以在没有管理员权限的情况下启动Docker Desktop。
- 对于WSL2 Linux容器,不需要该服务,因此系统启动时不会自动运行。当您切换到Windows容器或Hyper-V Linux容器,或选择在Win32 hosts文件中维护
host.docker.internal
和gateway.docker.internal
时,会显示一个UAC提示,要求您接受启动服务的特权操作。如果接受,则服务将启动并设置为在下次Windows启动时自动启动。
在Linux虚拟机中以root身份运行容器
Linux Docker 守护进程和容器运行在一个由 Docker 管理的最小化、专用 Linux 虚拟机中。它是不可变的,因此您无法扩展它或更改已安装的软件。这意味着,尽管容器默认情况下以root
用户运行,但这并不允许更改虚拟机,也不会授予对 Windows 主机系统的管理员
访问权限。Linux 虚拟机充当安全边界,并限制可以访问的主机资源。文件共享使用用户空间定制的文件服务器,任何从主机绑定安装到 Docker 容器的目录仍然保留其原始权限。它不会授予您访问其本身没有访问权限的任何文件。
增强的容器隔离
此外,Docker Desktop 支持增强型容器隔离模式 (ECI),仅供企业客户使用,该模式可在不影响开发者工作流程的情况下进一步增强容器安全性。
ECI 会自动在 Linux 用户命名空间中运行所有容器,这样容器中的 root 用户就会映射到 Docker Desktop 虚拟机内的非特权用户。ECI 使用此技术和其他高级技术来进一步保护 Docker Desktop Linux 虚拟机内的容器安全,使其与 Docker 守护进程和虚拟机内运行的其他服务进一步隔离。
Windows容器
与在虚拟机中运行的 Linux Docker 引擎和容器不同,Windows 容器是操作系统功能,直接在 Windows 主机上以管理员
权限运行。对于不想让其开发者运行 Windows 容器的组织,从 4.11 版本开始提供–no-windows-containers
安装程序标志来禁用其使用。
网络
对于网络连接,Docker Desktop 使用用户空间进程 (vpnkit
),它继承启动它的用户的约束,例如防火墙规则、VPN、HTTP 代理属性等。