了解 Docker Desktop 在 Mac 上的权限要求
本页面包含在 Mac 上运行和安装 Docker Desktop 的权限要求信息。
它还阐明了以 root 身份运行容器与在主机上拥有 root 访问权限之间的区别。
Mac 上的 Docker Desktop 在设计时考虑了安全性。仅在绝对必要时才需要管理权限。
权限要求
Mac 版 Docker Desktop 作为非特权用户运行。但是,Docker Desktop 需要某些功能才能执行一组有限的特权配置,例如:
- 在
/usr/local/bin中安装符号链接。 - 绑定小于 1024 的特权端口。尽管特权端口(小于 1024 的端口)通常不作为安全边界使用,但操作系统仍会阻止非特权进程绑定到它们,这会破坏
docker run -p 127.0.0.1:80:80 docker/getting-started等命令。 - 确保在
/etc/hosts中定义了localhost和kubernetes.docker.internal。一些旧的 macOS 安装在/etc/hosts中没有localhost,这会导致 Docker 失败。定义 DNS 名称kubernetes.docker.internal允许 Docker 与容器共享 Kubernetes 上下文。 - 安全缓存对开发人员只读的注册表访问管理策略。
在安装过程中授予特权访问。
Mac 版 Docker Desktop 首次启动时,会显示一个安装窗口,您可以在其中选择使用默认设置(适用于大多数开发人员,需要您授予特权访问权限)或使用高级设置。
如果您在具有更高安全要求的环境中工作,例如禁止本地管理访问的环境中,则可以使用高级设置来消除授予特权访问的需要。您可以配置
- Docker CLI 工具在系统或用户目录中的位置
- 默认的 Docker 套接字
- 特权端口映射
根据您配置的高级设置,您必须输入密码才能确认。
您可以在以后从 设置 中的 高级 页面更改这些配置。
安装符号链接
Docker 二进制文件默认安装在 /Applications/Docker.app/Contents/Resources/bin 中。Docker Desktop 在 /usr/local/bin 中为二进制文件创建符号链接,这意味着它们在大多数系统上会自动包含在 PATH 中。
您可以在安装 Docker Desktop 期间选择是在 /usr/local/bin 还是 $HOME/.docker/bin 中安装符号链接。
如果选择 /usr/local/bin 且此位置对于非特权用户不可写入,则 Docker Desktop 需要授权才能确认此选择,然后才能在 /usr/local/bin 中创建 Docker 二进制文件的符号链接。如果选择 $HOME/.docker/bin,则不需要授权,但您必须手动将 $HOME/.docker/bin 添加到您的 PATH 中。
您还可以选择启用安装 /var/run/docker.sock 符号链接。创建此符号链接可确保依赖默认 Docker 套接字路径的各种 Docker 客户端无需额外更改即可工作。
由于 /var/run 被挂载为 tmpfs,因此其内容在重启时会被删除,包括 Docker 套接字的符号链接。为了确保 Docker 套接字在重启后仍然存在,Docker Desktop 设置了一个 launchd 启动任务,通过运行 ln -s -f /Users/<user>/.docker/run/docker.sock /var/run/docker.sock 来创建符号链接。这确保了您在每次启动时都不会被提示创建符号链接。如果您在安装时未启用此选项,则不会创建符号链接和启动任务,并且您可能必须在客户端中显式设置 DOCKER_HOST 环境变量为 /Users/<user>/.docker/run/docker.sock。Docker CLI 依赖于当前上下文来检索套接字路径,在 Docker Desktop 启动时,当前上下文被设置为 desktop-linux。
绑定特权端口
您可以在安装期间或从安装后的 设置 中的 高级 页面启用特权端口映射。Docker Desktop 需要授权才能确认此选择。
确保定义了 localhost 和 kubernetes.docker.internal
您有责任确保 localhost 解析为 127.0.0.1,如果使用 Kubernetes,则确保 kubernetes.docker.internal 解析为 127.0.0.1。
从命令行安装
在安装命令上使用 --user 标志在安装期间应用特权配置。在这种情况下,您在 Docker Desktop 首次运行时不会被提示授予 root 权限。具体来说,--user 标志
- 如果存在,则卸载以前的
com.docker.vmnetd - 设置符号链接
- 确保
localhost解析为127.0.0.1
此方法的局限性在于,Docker Desktop 每台机器只能由一个用户帐户运行,即 --user 标志中指定的用户帐户。
特权助手
在需要特权助手的有限情况下,例如绑定特权端口或缓存注册表访问管理策略,特权助手由 launchd 启动并在后台运行,除非如前所述在运行时禁用它。Docker Desktop 后端通过 UNIX 域套接字 /var/run/com.docker.vmnetd.sock 与特权助手通信。它执行的功能是
- 绑定小于 1024 的特权端口。
- 安全缓存对开发人员只读的注册表访问管理策略。
- 卸载特权助手。
特权助手进程的删除方式与删除 launchd 进程的方式相同。
$ ps aux | grep vmnetd
root 28739 0.0 0.0 34859128 228 ?? Ss 6:03PM 0:00.06 /Library/PrivilegedHelperTools/com.docker.vmnetd
user 32222 0.0 0.0 34122828 808 s000 R+ 12:55PM 0:00.00 grep vmnetd
$ sudo launchctl unload -w /Library/LaunchDaemons/com.docker.vmnetd.plist
Password:
$ ps aux | grep vmnetd
user 32242 0.0 0.0 34122828 716 s000 R+ 12:55PM 0:00.00 grep vmnetd
$ rm /Library/LaunchDaemons/com.docker.vmnetd.plist
$ rm /Library/PrivilegedHelperTools/com.docker.vmnetd
在 Linux 虚拟机中以 root 身份运行容器
借助 Docker Desktop,Docker 守护程序和容器在由 Docker 管理的轻量级 Linux 虚拟机中运行。这意味着,尽管容器默认以 root 身份运行,但这并不授予 Mac 主机机器的 root 访问权限。Linux 虚拟机充当安全边界,限制了可以从主机访问的资源。从主机绑定挂载到 Docker 容器的任何目录仍然保留其原始权限。
增强型容器隔离
此外,Docker Desktop 支持增强型容器隔离模式 (ECI),该模式仅适用于企业客户,它可以在不影响开发人员工作流程的情况下进一步保护容器。
ECI 自动在 Linux 用户命名空间中运行所有容器,以便容器中的 root 被映射到 Docker Desktop VM 中的非特权用户。ECI 使用此技术和其他高级技术进一步保护 Docker Desktop Linux VM 中的容器,使它们与 Docker 守护程序和 VM 中运行的其他服务进一步隔离。