Mac 版 Docker 桌面常见问题解答
什么是 HyperKit?
HyperKit 是构建在 macOS 中的 Hypervisor.framework 之上的虚拟机管理程序。它完全在用户空间中运行,没有其他依赖项。
我们使用 HyperKit 来消除对其他 VM 产品的需求,例如 Oracle VirtualBox 或 VMWare Fusion。
HyperKit 有什么好处?
HyperKit 比 VirtualBox 和 VMWare fusion 更薄,并且包含的版本是针对 Mac 上的 Docker 工作负载定制的。
为什么退出应用程序后 com.docker.vmnetd 仍在运行?
特权帮助程序进程com.docker.vmnetd
由 启动launchd
并在后台运行。除非连接到该进程,否则它不会消耗任何资源
Docker.app
,因此可以安全地忽略它。
Docker Desktop 在哪里存储 Linux 容器和镜像?
Docker Desktop 将 Linux 容器和映像存储在 Mac 文件系统中的单个大型“磁盘映像”文件中。这与Linux上的Docker不同,Linux上通常将容器和镜像存储在/var/lib/docker
目录中。
磁盘镜像文件在哪里?
要找到磁盘映像文件,请从 Docker 仪表板中选择设置,然后从资源选项卡中选择高级。
“高级”选项卡显示磁盘映像的位置。它还显示磁盘映像的最大大小以及磁盘映像消耗的实际空间。请注意,其他工具可能会根据最大文件大小而不是实际文件大小来显示文件的空间使用情况。
如果文件太大怎么办?
如果磁盘镜像文件太大,您可以:
- 将其移动到更大的驱动器
- 删除不需要的容器和镜像
- 减小文件的最大允许大小
如何将文件移动到更大的驱动器?
要将磁盘映像文件移动到其他位置:
从“资源”选项卡中选择“设置”,然后选择“高级”。
在“磁盘映像位置”部分中,选择“浏览”并为磁盘映像选择一个新位置。
选择“应用并重新启动”以使更改生效。
重要的
不要直接在 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。
如何减小文件的最大大小?
要减小磁盘映像文件的最大大小:
从“资源”选项卡中选择“设置”,然后选择“高级”。
磁盘映像大小部分包含一个滑块,可让您更改磁盘映像的最大大小。调整滑块以设置下限。
选择应用并重新启动。
当您减小最大大小时,当前磁盘映像文件将被删除,因此所有容器和映像都会丢失。
如何添加 TLS 证书?
您可以将受信任的证书颁发机构 (CA)(用于验证注册表服务器证书)和客户端证书(用于对注册表进行身份验证)添加到 Docker 守护程序。
添加自定义 CA 证书(服务器端)
支持所有受信任的 CA(根 CA 或中间 CA)。 Docker Desktop 基于 Mac 钥匙串创建所有用户信任的 CA 的证书捆绑包,并将其附加到 Moby 信任的证书中。因此,如果主机上的用户信任企业 SSL 证书,则 Docker Desktop 也会信任该证书。
要手动添加自定义自签名证书,请首先将证书添加到由 Docker Desktop 选取的 macOS 钥匙串。这是一个例子:
$ 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 Desktop
~/.docker/certs.d
才能使更改生效。
有关如何执行此操作的完整说明,请参阅博客文章 将自签名注册表证书添加到 Docker 和 Docker Desktop for Mac。
添加客户端证书
您可以将客户端证书放入
~/.docker/certs.d/<MyRegistry>:<Port>/client.cert
和
中~/.docker/certs.d/<MyRegistry>:<Port>/client.key
。
当 Docker Desktop 应用程序启动时,它会将~/.docker/certs.d
Mac 上的文件夹复制到/etc/docker/certs.d
Moby(Docker Desktopxhyve
虚拟机)上的目录。
笔记
对钥匙串或目录进行任何更改后,您需要重新启动 Docker Desktop
~/.docker/certs.d
才能使更改生效。该注册表不能被列为不安全注册表。 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 引擎主题中的使用证书验证存储库客户端。
如何安装 shell 完成?
Docker Desktop 附带了脚本来完成 和docker
命令docker compose
。完成脚本可以在 目录中找到Docker.app
,Contents/Resources/etc/
并且可以安装在 Bash 和 Zsh 中。
重击
Bash
内置了对完成的支持要激活 Docker 命令的完成,需要将这些文件复制或符号链接到您的bash_completion.d/
目录。例如,如果您通过
Homebrew安装了 bash :
etc=/Applications/Docker.app/Contents/Resources/etc
ln -s $etc/docker.bash-completion $(brew --prefix)/etc/bash_completion.d/docker
ln -s $etc/docker-compose.bash-completion $(brew --prefix)/etc/bash_completion.d/docker-compose
将以下内容添加到您的~/.bash_profile
:
[ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion
或者
if [ -f $(brew --prefix)/etc/bash_completion ]; then
. $(brew --prefix)/etc/bash_completion
fi
兹什
在 Zsh 中,
完成系统
会处理所有事情。要激活 Docker 命令的完成,需要将这些文件复制或符号链接到您的 Zshsite-functions/
目录。例如,如果您通过
Homebrew安装了 Zsh :
etc=/Applications/Docker.app/Contents/Resources/etc
ln -s $etc/docker.zsh-completion /usr/local/share/zsh/site-functions/_docker
ln -s $etc/docker-compose.zsh-completion /usr/local/share/zsh/site-functions/_docker-compose
鱼壳
Fish-shell还支持tab补全
系统。要激活 Docker 命令的完成,需要将这些文件复制或符号链接到您的 Fish-shellcompletions/
目录。
创建completions
目录:
$ mkdir -p ~/.config/fish/completions
现在从 docker 添加鱼补全。
$ ln -shi /Applications/Docker.app/Contents/Resources/etc/docker.fish-completion ~/.config/fish/completions/docker.fish
$ ln -shi /Applications/Docker.app/Contents/Resources/etc/docker-compose.fish-completion ~/.config/fish/completions/docker-compose.fish