Docker Desktop for Mac 常见问题

什么是 HyperKit?

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

Docker 使用 HyperKit 来避免使用其他虚拟机产品,例如 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. Resources(资源)选项卡中选择 Settings(设置),然后选择 Advanced(高级)。

  2. Disk image location(磁盘镜像位置)部分,选择 Browse(浏览),然后选择磁盘镜像的新位置。

  3. 选择 Apply & Restart(应用并重启)使更改生效。

重要

请勿直接在 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. Resources(资源)选项卡中选择 Settings(设置),然后选择 Advanced(高级)。

  2. Disk image size(磁盘镜像大小)部分包含一个滑块,允许您更改磁盘镜像的最大大小。调整滑块以设置较低的限制。

  3. 选择 Apply & Restart(应用并重启)。

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

如何添加 TLS 证书?

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

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

支持所有受信任的 CA(根证书或中间证书)。Docker Desktop 会根据 Mac Keychain 创建所有用户信任的 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

另请参阅证书目录结构

注意

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

有关如何执行此操作的完整说明,请参阅博客文章将自签名仓库证书添加到 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 目录中。

注意

  • 对钥匙串或 ~/.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/        <-- Certificate directory
└── localhost:5000          <-- Hostname:port
   ├── client.cert          <-- Client certificate
   ├── client.key           <-- Client key
   └── ca.crt               <-- Certificate authority that signed
                                the registry certificate

您也可以拥有此目录结构,只要 CA 证书也位于您的钥匙串中。

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

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

页面选项