docker的`net = host`设置是如何工作的,我怎么能用VirtualBox做类似的事情呢?

Leo*_*Leo 18 macos docker

Docker net=host 在此处记录了一个运行选项,允许您运行与主机共享网络堆栈的虚拟机 - 例如,docker容器内的进程可以通过连接到主机localhost,反之亦然.

我想在Mac OS X上设置一个Linux VM来做同样的事情; 我尝试过使用Vagrant及其各种网络设置而没有太多运气.

Docker的VM是否依赖主机和客户操作系统都是Linux,或者是否有某种方法可以实现我缺少的OSX-> Linux?

Dav*_*ert 9

感谢各位同事的帮助,我找到了解决这个问题的方法.此解决方案适用于boot2docker/VirtualBox.我刚刚创建了我的docker VM boot2docker init,我没有对VM配置进行任何特定的更改.

首先运行docker镜像--net=host,以便它与主机VM共享网络,例如

docker run -it --net=host ubuntu bash
Run Code Online (Sandbox Code Playgroud)

然后,您需要从用于docker容器的VM中找到IP地址,您可以通过运行boot2docker sshOSX主机来执行此操作.然后,您可以通过查找其网关来查找VM的IP地址:

$ netstat -rn | grep UG | awk '{print $2}'
10.0.2.2
Run Code Online (Sandbox Code Playgroud)

所以在我的情况下它是10.0.2.2.您现在可以使用此IP地址访问主机上打开的端口,即从Docker容器在OSX上运行的程序.

要自动化,您可以先找到IP地址,然后将其作为环境变量传递给docker命令...

  • //,这是否与DockerMachine以同样的方式工作? (2认同)

Dav*_*ert 5

我找到了另一个有效的答案,我将在这里分享,以便人们可以选择:)

首先,您需要弄清楚OSX主机上首选网络接口的IP地址是什么.以下shell命令为我做了这个:

echo "show State:/Network/Global/IPv4" | scutil | grep PrimaryInterface | awk '{print $3}' | xargs ifconfig | grep inet | grep -v inet6 | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这打印出来: 10.226.98.247

然后你可以简单地在docker中使用该地址,或者甚至更好地为这个地址提供docker内部的主机名:

docker run -it --add-host dockerhost:10.226.98.247 ubuntu bash
Run Code Online (Sandbox Code Playgroud)

然后,dockerhost无论您在哪个环境中启动容器,都可以在docker容器中使用相同的主机名...