Docker Desktop安装(Mac)

作为软件开发者,在日常工作中经常需要在本地环境启动多种服务,例如Redis、MySQL等。传统的做法需要我们分别下载和安装这些软件,并且配置环境,过程不仅繁琐而且耗时。Docker Desktop提供了一个更加高效和简便的解决方案。本教程主要介绍如何在Mac上安装部署Docker Desktop。

一、系统要求

为了在Mac上顺利安装和运行Docker Desktop,需要满足以下系统要求:

1、支持的Mac类型:无论是配备Intel芯片的Mac还是最新配备Apple芯片的Mac,Docker Desktop都提供支持。

2、兼容的macOS版本:Docker Desktop支持当前版本的macOS以及前两个版本的macOS。一旦新的macOS主要版本普及,Docker将停止支持最老的版本,转而支持最新的macOS版本(包括其前两个版本)。

3、内存需求:Mac至少需要有4GB的内存。

二、权限要求

适用于 Mac 的 Docker Desktop 以非特权用户身份运行。但是,Docker Desktop 需要某些功能来执行一组有限的特权配置,例如:

  • 在/usr/local/bin中安装符号链接;
  • 绑定小于 1024 的特权端口。所谓的“特权端口”通常不用作安全边界,但是操作系统仍然会阻止非特权进程绑定它们,从而破坏诸如 .docker run -p 127.0.0.1:80:80 docker/getting-started;
  • 确保和被定义localhostkubernetes.docker.internal在。一些旧的 macOS 安装没有 ,这会导致 Docker 失败。定义 DNS 名称允许 Docker 与容器共享 Kubernetes 上下文;
  • 安全地缓存对开发人员只读的注册表访问管理策略。

根据使用的 Docker Desktop for Mac 版本,在安装、首次运行期间或仅在需要时授予特权访问权限。

版本 4.18 及更高版本:

从版本 4.18 及更高版本开始,适用于 Mac 的 Docker Desktop 可以更好地控制在安装过程中启用的功能。首次启动 Docker Desktop for Mac 时,它会显示一个安装窗口,可以在其中选择使用默认设置(适用于大多数开发人员并要求授予特权访问权限)或使用高级设置。如果在安全要求较高的环境中工作,例如禁止本地管理访问,则可以使用高级设置来消除授予特权访问的需要。可以配置:

  • Docker CLI 工具在系统目录或用户目录中的位置;
  • 默认的 Docker 套接字;
  • 特权端口映射。

根据配置的高级设置,必须输入密码进行确认。可以稍后从“设置”中的“高级”页面更改这些配置。

版本 4.15 - 4.17:

Docker Desktop for Mac 版本 4.15 到 4.17 不需要特权进程即可永久运行。每当配置需要提升的权限时,Docker Desktop 都会提示有关需要执行的任务的信息。大多数配置只应用一次,后续运行不再提示特权访问。 Docker Desktop 可能启动特权进程的唯一时间是绑定主机操作系统上默认不允许的特权端口。

4.15 之前的版本:

Docker Desktop for Mac 版本 4.15 到 4.17 不需要特权进程即可永久运行。每当配置需要提升的权限时,Docker Desktop 都会提示有关需要执行的任务的信息。大多数配置只应用一次,后续运行不再提示特权访问。 Docker Desktop 可能启动特权进程的唯一时间是绑定主机操作系统上默认不允许的特权端口。

1、安装符号链接

默认情况下,Docker二进制文件安装在/Applications/Docker.app/Contents/Resources/bin中。Docker Desktop 为/usr/local/binPATH中的二进制文件创建符号链接,这意味着它们会自动包含在大多数系统中。

版本 4.18 及更高版本:

  • 在版本 4.18 及更高版本中,可以选择是在 Docker Desktop 安装过程中还是在安装过程中安装符号链接;
  • 如果选择了此位置,并且非特权用户无法写入此位置,则 Docker Desktop 需要授权才能确认此选择,然后才能在 中创建指向 Docker 二进制文件的符号链接。如果选择,则不需要授权,但必须/usr/local/bin/usr/local/bin$HOME/.docker/bin手动添加$HOME/.docker/bin到他们的 PATH;
  • 还可以选择启用符号链接的安装。创建/var/run/docker.sock符号链接可确保依赖于默认 Docker 套接字路径的各种 Docker 客户端无需进行其他更改即可工作。

版本 4.17 及更早版本:

  • 对于 4.18 之前的版本,在 Docker Desktop 首次启动时执行的特权配置中安装符号链接。Docker Desktop 检查符号链接是否存在,并执行以下操作:
  • 在没有管理员提示符的情况下创建符号链接(如果可由非特权用户写入/usr/local/bin);
  • 触发管理员提示,让用户授权在/usr/local/bin中创建符号链接。如果授权,则会在/usr/local/bin中创建指向 Docker 二进制文件的符号链接。如果拒绝提示,不愿意运行需要提升权限的配置,或者在计算机上没有管理员权限,Docker Desktop 会在 shell 配置文件中创建符号链接并编辑 shell 配置文件,以确保此位置位于 PATH 中。

2、绑定特权端口

  • 版本 4.18 及更高版本:
  • 对于版本 4.18 及更高版本,可以选择在安装期间启用特权端口映射,或者在安装后从“设置”中的“高级”页面启用特权端口映射。Docker Desktop 需要授权才能确认此选择。

版本 4.17 及更早版本:

对于低于 4.18 的版本,如果运行需要绑定特权端口的容器,Docker Desktop 首先尝试将其直接绑定为非特权进程。如果操作系统阻止此操作并且失败,Docker Desktop 将检查特权帮助程序进程是否正在运行,以通过它绑定特权端口。

如果特权帮助程序进程未运行,Docker Desktop 会提示你进行授权以运行它推出. 这会将特权帮助程序配置为在 4.15 之前的 Docker Desktop 版本中运行。但是,此特权帮助程序提供的功能现在仅支持端口绑定和缓存注册表访问管理策略。 如果拒绝启动特权帮助程序进程,则无法绑定特权端口,并且 Docker CLI 将返回错误:

$docker run -p 127.0.0.1:80:80 docker/getting-started
docker: Error response from daemon: Ports are not available: exposing port
TCP 127.0.0.1:80 -> 0.0.0.0:0: failed to connect to /var/run/com.docker.vmnetd.sock:
is vmnetd running?: dial unix /var/run/com.docker.vmnetd.sock: connect: connection
refused.
ERRO[0003] error waiting for container: context canceled

3、定义 localhost

对于版本 4.18 及更高版本,有责任确保将 localhost 解析为127.0.0.1,如果使用 Kubernetes,则解析为 kubernetes.docker.internal127.0.0.1。

对于版本 4.17 及更早版本,首次运行时,Docker Desktop 会检查是否解析为localhost127.0.0.1,如果解析失败,它会提示允许将映射添加到/etc/hosts。同样,在安装 Kubernetes 集群时,它会检查已解析的内容并提示这样做。

三、安装部署

1、通过命令行安装

在 Docker Desktop for Mac 版本 4.11 及更高版本中,在安装过程中使用 install 命令上的标志应用特权配置。在这种情况下,系统不会提示在首次运行 Docker Desktop 时授予 root 权限。具体来说,标志:

  • 卸载以前的com.docker.vmnetd(如果存在);
  • 设置符号链接;
  • 确保已解析为localhost127.0.0.1。

这种方法的局限性在于,Docker Desktop 只能由每台计算机的一个用户帐户运行,即标志中指定的用户帐户。

2、特权帮助程序

在需要特权帮助程序的有限情况下(例如,绑定特权端口或缓存注册表访问管理策略),特权帮助程序由后台启动并在后台运行,除非如前所述在运行时禁用它。Docker Desktop 后端通过 UNIX 域套接字与特权帮助程序进行通信。它执行的功能包括:

  • 绑定小于 1024 的特权端口;
  • 安全地缓存对开发人员只读的注册表访问管理策略;
  • 卸载特权帮助程序。

特权帮助程序进程的删除方式与删除进程相同。

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

四、运行为 root 用户

在使用 Docker Desktop 时,值得注意的是 Docker 守护进程和容器都是在由 Docker 管理的轻量级 Linux 虚拟机(VM)内运行的。这种设置确保了即便容器以 root 用户身份运行,它们也无法获得对 Mac 主机的直接访问权限。Linux VM 在这里作为一个安全边界,严格限制了从容器中可能对主机系统进行的操作。此外,任何从主机挂载到 Docker 容器中的目录都会保持其原有的权限设置。

五、强化容器隔离

Docker Desktop 支持一种称为增强型容器隔离(ECI)的模式,这项功能目前仅对企业客户开放。ECI 提供了一个更为强化的隔离环境,能够保护容器的安全性,同时不会干扰或影响开发者的正常工作流程。

在 ECI 模式下,所有容器默认在 Linux 用户命名空间内以非特权用户身份运行,这就意味着容器内的 root 用户会被映射到 Docker 桌面 VM 的一个非特权用户。利用这个和其他高级技术,ECI 确保了 Docker 桌面的 Linux VM 中的容器得到了更好的保护,从而与 Docker 守护进程以及其他在 VM 内部运行的服务保持了严格的隔离。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录