如何访问docker的HyperKit创建的VM?

Jif*_*ang 63 docker docker-machine docker-for-mac

Docker for Mac使用HyperKit创建的Linux VM 在Mac上存储和运行容器.

使用Docker Toolbox,我可以打开VirtualBox并访问docker-machine VM.但是使用Docker for Mac,我如何访问HyperKit创建的VM?

Jif*_*ang 120

更新2019-01-31,感谢ru10的更新,现在有更好的方法:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
Run Code Online (Sandbox Code Playgroud)

原答案:

过了一会儿,我找到了以下方法来获取由HyperKit创建的VM的shell:

从终端运行:

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Run Code Online (Sandbox Code Playgroud)

您将看到一个空屏幕,然后输入enter, 你会得到一个登录提示.登录root并按Enter键,您将获得一个shell(无密码),你会得到壳:

在此输入图像描述 它有点hacky,但它似乎现在工作 (2016年9月) (2017年9月).

  • 这在 Docker Desktop 3 中不再有效。 (3认同)

ru1*_*u10 39

Mac OS High Sierra Docker版本18.06.0-ce-mac70(26399)

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
Run Code Online (Sandbox Code Playgroud)

代替

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
Run Code Online (Sandbox Code Playgroud)

  • 这在 Docker Desktop 3 中不再有效。 (5认同)
  • 感谢您更新的路径.接受的答案需要更新. (3认同)

aug*_*rar 21

根据Docker 维护者的这个 GitHub 问题评论,访问 VM 的推荐方式是通过特权 docker 容器。

尝试登录虚拟机:(我建议这样做而不是在 TTY 上使用屏幕)

$ docker run -it --privileged --pid=host justincormack/nsenter1
Run Code Online (Sandbox Code Playgroud)

  • 这应该是 2021 年接受的答案,因为“tty”链接在最新版本的 Docker Desktop 中已消失。如果您对使用来自未经验证的发布者的随机映像持怀疑态度,这也可以:“docker run -it --rm --privileged --pid=host busybox nsenter -t1 -m -u -i -n”。 (3认同)
  • 这对我有用,但无法访问 Catalina 中的 tty (2认同)

Kir*_*ill 5

这个问题有一个通用的答案,可以在《Kubernetes in Action》第二版书中找到:

\n
\n

在撰写本文时,如果您想从内部探索它,Docker Desktop 没有提供登录虚拟机的命令。但是,您可以运行配置为使用 VM\xe2\x80\x99s 命名空间的特殊容器来运行远程 shell,这实际上与使用 SSH 访问远程服务器相同。要运行容器,请执行以下命令:

\n
\n
docker run --net=host --ipc=host --uts=host --pid=host --privileged \\\n  --security-opt=seccomp=unconfined -it --rm -v /:/host alpine chroot /host\n
Run Code Online (Sandbox Code Playgroud)\n
\n

这个长命令需要解释一下:

\n
    \n
  • 该容器是从\xc2\xa0 alpine\xc2\xa0image 创建的。
  • \n
  • \xc2\xa0 --net、\xc2\ --ipcxa0 、--uts\xc2\xa0 \xc2 --pid\xa0 和 \xc2\xa0 \xc2\xa0 标志使容器使用主机\xe2\x80\x99s 命名空间而不是沙箱,并且 \xc2\ xa0 --privileged\xc2\xa0and\xc2\xa0 --security-opt\xc2\xa0flags 使容器可以不受限制地访问所有系统调用。
  • \n
  • \xc2\xa0 -it\xc2\xa0flag 运行容器交互模式,\xc2\xa0 --rm\xc2\xa0flags 确保容器在终止时被删除。
  • \n
  • \xc2\xa0 -v\xc2\xa0flag 将主机\xe2\x80\x99s 根目录挂载到/host容器中的\xc2\xa0 \xc2\xa0 目录。然后, \xc2\xa0 chroot /host\xc2\xa0 命令使该目录成为容器中的根目录。
  • \n
\n
\n