Docker Desktop for Mac 常见问题解答

什么是 HyperKit?

HyperKit 是一个构建在 macOS Hypervisor.framework 之上的虚拟机管理器(hypervisor)。它完全在用户空间中运行,没有其他依赖项。

Docker 使用 HyperKit 来消除对其他 VM 产品(如 Oracle VirtualBox 或 VMware Fusion)的需求。

HyperKit 有什么优势?

HyperKit 比 VirtualBox 和 VMware Fusion 更轻量级,并且包含的版本是针对 Mac 上的 Docker 工作负载定制的。

Docker Desktop 将 Linux 容器和镜像存储在哪里?

Docker Desktop 将 Linux 容器和镜像存储在 Mac 文件系统中的一个单独的大型“磁盘镜像”文件中。这与 Linux 上的 Docker 不同,后者通常将容器和镜像存储在 /var/lib/docker 目录中。

磁盘镜像文件在哪里?

要定位磁盘镜像文件,请从 Docker Desktop 仪表板中选择 Settings(设置),然后从 Resources(资源)选项卡中选择 Advanced(高级)。

Advanced(高级)选项卡会显示磁盘镜像的位置。它还显示磁盘镜像的最大大小以及磁盘镜像实际占用的空间。请注意,其他工具可能会显示文件的最大文件大小,而不是实际文件大小。

如果文件太大怎么办?

如果磁盘镜像文件太大,您可以:

  • 将其移动到更大的驱动器
  • 删除不必要的容器和镜像
  • 减小文件的最大允许大小
如何将文件移动到更大的驱动器?

要将磁盘镜像文件移动到其他位置:

  1. 选择 Settings(设置),然后从 Resources(资源)选项卡中选择 Advanced(高级)。
  2. Disk image location(磁盘镜像位置)部分,选择 Browse(浏览)并为磁盘镜像选择一个新位置。
  3. 选择 Apply(应用)以使更改生效。
Important

不要直接在 Finder 中移动文件,因为这可能导致 Docker Desktop 无法追踪该文件。

如何删除不必要的容器和镜像?

检查是否有任何不必要的容器和镜像。如果您的客户端和守护进程 API 运行的是 1.25 或更高版本(在客户端使用 docker version 命令检查您的客户端和守护进程 API 版本),您可以通过运行以下命令查看详细的空间使用信息:

$ docker system df -v

或者,要列出镜像,请运行:

$ docker image ls

要列出容器,请运行:

$ docker container ls -a

如果存在大量冗余对象,请运行命令:

$ docker system prune

此命令会删除所有已停止的容器、未使用的网络、悬空的镜像以及构建缓存。

根据磁盘镜像文件的格式,回收主机上的空间可能需要几分钟时间。如果文件名为:

  • Docker.raw,主机上的空间将在几秒钟内回收。
  • Docker.qcow2,空间将在几分钟后由后台进程释放。

空间仅在镜像被删除时释放。当在运行的容器内部删除文件时,空间不会自动释放。要在任何时候触发空间回收,请运行命令:

$ docker run --privileged --pid=host docker/desktop-reclaim-space

请注意,许多工具报告的是最大文件大小,而不是实际文件大小。 要从终端查询主机上文件的实际大小,请运行:

$ cd ~/Library/Containers/com.docker.docker/Data/vms/0/data
$ ls -klsh Docker.raw
2333548 -rw-r--r--@ 1 username  staff    64G Dec 13 17:42 Docker.raw

在此示例中,磁盘的实际大小为 2333548 KB,而磁盘的最大大小为 64 GB。

如何减小文件的最大大小?

要减小磁盘镜像文件的最大大小:

  1. 选择 Settings(设置),然后从 Resources(资源)选项卡中选择 Advanced(高级)。
  2. Disk image size(磁盘镜像大小)部分包含一个滑块,允许您更改磁盘镜像的最大大小。调整滑块以设置较低的限制。
  3. 选择 Apply(应用)。

当您减小最大大小时,当前的磁盘镜像文件将被删除,因此,所有容器和镜像都会丢失。

如何添加 TLS 证书?

您可以将受信任的证书颁发机构 (CA)(用于验证注册表服务器证书)和客户端证书(用于向注册表进行身份验证)添加到您的 Docker 守护进程中。

添加自定义 CA 证书(服务器端)

支持所有受信任的 CA(根或中间)。Docker Desktop 基于 Mac 钥匙串创建所有用户受信任 CA 的证书包,并将其附加到 Moby 受信任证书中。因此,如果企业 SSL 证书在主机上被用户信任,它也会被 Docker Desktop 信任。

要手动添加自定义的自签名证书,首先将证书添加到 macOS 钥匙串中,Docker Desktop 会自动获取该证书。以下是一个示例:

$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ca.crt

或者,如果您更愿意仅将证书添加到您自己的本地钥匙串中(而不是针对所有用户),请运行以下命令:

$ security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain ca.crt

另请参阅证书的目录结构

Note

您需要在对钥匙串或 ~/.docker/certs.d 目录进行任何更改后重新启动 Docker Desktop,以使更改生效。

有关如何执行此操作的完整说明,请参阅博客文章 Adding Self-signed Registry Certs to Docker & Docker Desktop for Mac

添加客户端证书

您可以将客户端证书放在 ~/.docker/certs.d/<MyRegistry>:<Port>/client.cert~/.docker/certs.d/<MyRegistry>:<Port>/client.key 中。

当 Docker Desktop 应用程序启动时,它会将您 Mac 上的 ~/.docker/certs.d 文件夹复制到 Moby(Docker Desktop xhyve 虚拟机)上的 /etc/docker/certs.d 目录中。

Note
  • 您需要在对钥匙串或 ~/.docker/certs.d 目录进行任何更改后重新启动 Docker Desktop,以使更改生效。
  • 注册表不能被列为 不安全注册表。Docker Desktop 会忽略不安全注册下列出的证书,并且不会发送客户端证书。尝试从注册表拉取的命令(如 docker run)会在命令行以及注册表上产生错误消息。

证书的目录结构

如果您有以下目录结构,则无需手动将 CA 证书添加到您的 Mac OS 系统登录中:

/Users/<user>/.docker/certs.d/
└── <MyRegistry>:<Port>
   ├── ca.crt
   ├── client.cert
   └── client.key

以下进一步说明并解释了包含自定义证书的配置:

/etc/docker/certs.d/        <-- 证书目录
└── localhost:5000          <-- 主机名:端口
   ├── client.cert          <-- 客户端证书
   ├── client.key           <-- 客户端密钥
   └── ca.crt               <-- 签署注册表证书的证书颁发机构

您也可以拥有以下目录结构,只要 CA 证书也在您的钥匙串中即可。

/Users/<user>/.docker/certs.d/
└── <MyRegistry>:<Port>
    ├── client.cert
    └── client.key

要了解有关如何为注册表安装 CA 根证书以及如何设置客户端 TLS 证书以进行验证的更多信息,请参阅 Docker Engine 主题中的 使用证书验证仓库客户端