由于该问题在 SO 上被标记为离题,因此在此进行交叉发布。
我看到过一些关于使用以下方式将 Docker 容器连接到物理网络的问题麦克维兰,但尚未找到针对我当前情况的答案。
我想要实现的目标:
- 在运行 Ubuntu 的 VirtualBox VM 内运行 Docker 容器。
- 使用 macvlan,将容器连接到同一个 docker 网络,并为每个容器分配一个物理网络子网内的 IP 地址。
- 从主机或连接到网络的任何其他设备通过此分配的 IP 地址访问每个容器。
到目前为止,我已经完成了以下工作:
- 使用 Vagrant 创建了我的虚拟机。
- 将我的 Wi-Fi 接口作为桥接适配器添加到虚拟机。
- 按照说明为虚拟机设置关联的默认网关这里到我的路由器的IP(192.168.1.1)。
- 使用以下命令创建 Docker 网络:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ip-range=192.168.1.160/27 -o parent=eth1 test_net
- 运行我的容器,并将它们连接到上面描述的网络。
我可以验证两个容器都已启动,并分配了 192.168.1.160 和 192.168.1.161。显然,由于 macvlan 的工作方式,这些地址在虚拟机内无法访问。
但是,当我尝试从主机 ping 这两个地址时,请求超时。但是,在我尝试 ping 这些地址之后,当我在主机上运行 arp -a 时,我可以看到两个容器的条目:
? (192.168.1.160) at 2:42:c0:a8:1:a0 on en0 ifscope [ethernet] ? (192.168.1.161) at 2:42:c0:a8:1:a1 on en0 ifscope [ethernet]
我已检查以确保路由器的防火墙已禁用,上述 IP 地址不与网络上的任何其他设备冲突,我可以从主机 ping 我的虚拟机,并且虚拟机的默认网关在 eth1 接口上正确设置为 192.168.1.1。此外,我检查了 docker network create 命令中的子网是否与路由器配置的子网匹配。
我见过利用 Docker-p
标志的解决方案,但这对我来说不是一个选择,因为我需要能够仅通过其 IP 地址来引用每个容器。
有没有人成功完成了我想做的事情?此外,为什么两个容器都有 ARP 条目但无法访问,我该怎么做才能纠正这个问题?或者,有什么与 VirtualBox 如何处理桥接适配器有关的东西吗?
我认为我应该iptables
在虚拟机上进行编辑以将默认FORWARD
策略设置为ACCEPT
,但这也不起作用。因为 ARP 似乎有效,所以我猜测数据包在返回主机之前就被虚拟机丢弃了,但我不确定要更改什么才能解决这个问题。
答案1
如果其他人遇到此问题,则似乎与 docker 网络所连接的接口是否启用了混杂模式有关。
我认为从 VirtualBox 的设置中将适配器设置为混杂模式就足够了,但似乎并非如此(我对此的最佳假设是我正在使用 Vagrant)。
从 VirtualBox 设置混杂模式后(设置 --> 网络 --> 桥接适配器 --> 高级 --> 混杂模式 --> 全部允许),我还必须在 VM 中将其打开:
sudo ip link set eth1 promisc on
现在,我可以从主机通过 IP ping 我的虚拟机容器!我能够在 Ubuntu 14.04 和 16.04 上成功测试这一点,而且完全没有干扰iptables
!
再次,就像我上面提到的那样,你惯于由于 macvlan 的特性,能够从虚拟机内部 ping 通容器。
答案2
我找到了一种让容器 ping 虚拟机的方法;你只需删除容器中的路由规则。
就我而言,route del -net 192.168.1.0/24
效果很好。