9

在我的 Linux 网络中,我无法通过专用的 macvlan 网络从运行它们的主机访问我的 docker 容器。来自这个 macvlan 网络的所有其他连接都很好。

所以基本上设置是:

DOCKER1       eth0  172.0.0.1 (default)
  |           eth1  10.0.0.1  (macvlan)
  CONTAINER1        10.0.0.11 (macvlan)

DOCKER2       eth0  172.0.0.2 (default)
  |           eth1  10.0.0.2  (macvlan)
  CONTAINER2        10.0.0.12 (macvlan)
  • 主机 DOCKER1 无法访问 CONTAINER1
  • 主机 DOCKER2 无法访问 CONTAINER2
  • 主机 DOCKER1 可以到达 DOCKER2
  • 主机 DOCKER1 可以到达 CONTAINER2
  • 主机 DOCKER2 可以到达 DOCKER1
  • 主机 DOCKER2 可以到达 CONTAINER1
  • 所有容器都可以互相到达
  • 物理网络中的所有其他设备都可以到达所有
  • 都可以到达网关/互联网

如何让主机通过 macvlan 网络访问自己的容器?

我需要特定的应用程序通过这个网络进行交互,所以使用docker exec不会解决我的问题;)。

4

2 回答 2

12

您可以通过执行以下操作来做到这一点:

ip link add foobar link enp7s0 type macvlan mode bridge
ip addr add 192.168.9.252/32 dev foobar
ip link set foobar up
ip route add 192.168.9.228/32 dev foobar

在哪里:

enp7s0 - 物理适配器的名称

192.168.9.252/32 - 网络上的真正新 IP

192.168.9.228/32 - 使用 macvlan 的容器 IP

请注意,这不会在重新启动后继续存在,因此您需要编写脚本以运行每次重新启动或使用其他方法使其持久化

于 2019-07-15T11:27:00.290 回答
2

如果没有外部交换机的特殊支持,主机无法与本地 macvlan 设备通信。参见例如这个 Red Hat 文档,它讨论了虚拟机的 macvlan 设备的使用:

但是,当来宾虚拟机配置为使用 type='direct' 网络接口(例如 macvtap)时,尽管能够与网络上的其他来宾和其他外部主机通信,但来宾无法与自己的主机通信。

这种情况实际上不是错误——它是 macvtap 定义的行为。由于主机的物理以太网连接到 macvtap 网桥的方式,转发到物理接口的访客进入该网桥的流量无法反弹回主机的 IP 堆栈。此外,发送到物理接口的主机 IP 堆栈的流量无法反弹回 macvtap 网桥以转发给来宾。

于 2017-05-18T13:41:34.563 回答