同时使用 Hyper-V Docker 和 Virtual Box Docker Toolbox

  • fennng 

有时候我们因为种种原因我们需要使用 Virtual Box, 而不能使用 Hyper-V. 而Virtual Box 和 Hyper-V 由于一个是二级虚拟,一个是一级虚拟, 它们两个是不能同时使用的。 当然,这里我要提示大家一下, 不能同时使用并不是不能同时安装。 它们可以同时存在, 只是不能同时启用罢了。

我本来是一直在使用 Hyper-V 的, 因为我装的Docker 需要它。 但是最近我想安装 Geny Montion这个安卓模拟器, 而因为这个模拟器是基于Virtual Box 的, 导至无法启动。 而也有小伙伴跟我反应在Windows 7 和 Windows 10 家庭版里都没有 Hyper -V, 无法使用 Docker. 所以我就研究了下如何在Virtual Box 里使用Docker. 然后我发现, 其实Hyper-V 和Virtual Box是可以轮着用的,不需要卸载其中一个,只是切换的时候需要重启电脑。

首先,我使用了以下命令来禁用Hyper V, 需要在管理员模式下运行

bcdedit /set hypervisorlaunchtype off

如果你之后想重新启用 Hyper V, 使用以下命令

bcdedit /set hypervisorlaunchtype auto

禁用 Hyper-V 后, 重启电脑, 这时候你发现 Hyper V Manager 还是可以用的, 只是里面的虚拟机打不开了, 原来的Docker自动启动的时候也会出错。

这个时候,下载 Docker ToolBox 并安装。

安装的时候,可选安装 Virtual Box, 如果你已经安装了, 可以把勾去掉。

安装好后, 在桌面上点击Docker Quickstart Terminal, 就会进入一个特殊的命令行。 第一次启动要花点时间, 等进入以后, 你会看到一个以$ 开头的BASH 命令提示符。

这个时候你就可以直接输入 Docker 命令了。

但是和Hyper V下的Docker 有一点区别, 当你用 -p 映射端口的时候, 你映射的不是本地端口, 而是虚拟机的端口,比如说我开了一个网页服务器用 -p 8080:80 这个参数, 最后服务器正常工作,但我却不能使用 localhost:8080 去访问它, 我需要使用 192.168.99.100:8080 去访问它。 而且你会注意到, 这个Docker 和你Hyper V里面的Docker 是分开的, 你所有的原来是Docker 容器都需要重建, 相关的镜像文件也要重新下载,这是因为他们在不同的虚拟机里运行。

因为我可能会切换回Hyper V去使用Docker, 所以我并不想改我代码里面的 localhost:8080这个服务器地址到 192.168.99.100:8080, 那怎么样才可以让 localhost:8080也工作呢? 其实办法很简单, 在Linux我们有个常用的小工具叫socat, 可以用来作端口转发, 而在Windows底下, 其实也有一个自带的工具可以做到。

这个命令叫netsh

以管理员身份输入以下命令, 就会把 localhost:8080 的访问数据转发到 192.168.99.100:8080,
这样就不需要改动代码了。

netsh interface portproxy add v4tov4 listenport=8080 listenaddress=localhost connectport=8080 connectaddress=192.168.99.100

当然,当你用完的时候,你需要使用以下命令来删除端口转发

netsh interface portproxy delete v4tov4 listenport=8080 listenaddress=localhost 

你也可以创建另一个Ubuntu的虚拟机,再使用 ssh 通道来做端口转发 (可以映射到 localhost), 这是我在不知道 netsh可以做端口转发时想到的方法。

当你用完 Virtual Box 想回到 Hyper V了, 在管理员模式下输入以下命令, 然后重启

bcdedit /set hypervisorlaunchtype auto

你就又回到Hyper V里面了。 你的Virtual Box 和 Docker Toolbox 都还在,只是启动不了了。 但是你随时可以禁用 Hyper V 重新启用它们。

发表评论

您的电子邮箱地址不会被公开。