Docker Desktop on Mac 虚拟机

macOS安装Docker 后,底层原理是在 macOSxhyve - macOS平台的KVM Hypervisor上运行了一个KVM虚拟机( Alpine Linux ):

../../_images/docker-for-mac-install.png

这个虚拟机是 macOS 上运行的一个全功能虚拟机,实际上可以实现很多有趣的功能:

进入Docker虚拟机内部

方法一:使用netcat

macOS 上,由于 Docker Desktop for Mac 是运行了一个mini VM,所以我们可以通过物理主机上的虚拟机 sock 文件连接到这个虚拟机内部,方便我们排查虚拟机问题,也方便我们在虚拟机内部部署服务:

通过macOS物理主机的sock连接到Docker Desktop for Mac虚拟机
nc -U ~/Library/Containers/com.docker.docker/Data/debug-shell.sock

备注

这是最简单方法,无需下载运行容器,但是控制台似乎是sock影响提示符比较烦人

方法二:使用运行容器的nsenter进入pid 1的控制台(也就是虚拟机)

  • 使用以下命令可以进入priviledged容器:

通过nsenter进入运行容器的控制台
docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh

这里运行了一个使用debian镜像的容器,然后通过这个容器执行 nsenter 连接到 pid 1 的进程,实际上就是Docker虚拟机

备注

这个方法非常巧妙,而且debian容器提供了很好的控制台兼容,使用方便

方法三:最简单的方法,通过 Justin Cormack (Docker Maintainer) 提供的镜像运行nsenter进入虚拟机控制台

Justin Cormack (Docker Maintainer)提供了一个镜像内置了nsenter直接nsenter进入虚拟机控制台:

Justin Cormack (Docker Maintainer)提供通过nsenter进入运行容器的控制台镜像
docker run -it --rm --privileged --pid=host justincormack/nsenter1

虚拟机镜像文件在哪里?

最近需要升级 macOS ,由于我同时安装了 Asahi Linux ,所以磁盘空间非常紧张,甚至连升级系统都需要清理磁盘。但是,这次大版本升级需要 26GB 以上空间,我实在无法腾挪出足够空间升级。考虑到已经将大量的虚拟化运行 Kubernetes Atlas 迁移到服务器上,本地已经没有必要运行Docker和Kubernetes了,所以卸载了Docker Desktop。

但是,Docker Desktop在本地磁盘有一个虚拟机镜像需要清理以释放空间。这个虚拟机镜像位于 ~/Library/Containers/com.docker.docker 目录下。如果你没有删除掉Docker Desktop程序,可以直接通过 docker 命令来清理:

docker system prune -a

如果已经卸载了Docker,则手工删除掉这个目录即可。

参考