使用 macvlan 驱动程序时如何从同一网络上的不同主机访问容器

How to access container from different host on same network when using macvlan driver

我创建了我的 macvlan 网络如下:

docker network create -d macvlan -o parent=eth0 \
--subnet 192.168.1.0/24 \
--gateway 192.168.1.1 \
--ip-range 192.168.1.192/27 \
--aux-address 'host=192.168.1.223' \
 mynet

我运行我的容器如下:

docker run --name nginx -d --net mynet nginx

容器IP为192.168.1.192

我有两个主机可以相互 ping 通:

主机 A:192.168.1.98(其中 Docker 引擎为 运行ning)

主机B:192.168.1.6

因为 macvlan 的定义不允许主机到容器的通信,我创建了一个如下的子接口来允许这种通信:

ip link add mynet-shim link eth0 type macvlan  mode bridge

ip addr add 192.168.1.223/32 dev mynet-shim

ip link set mynet-shim up

ip route add 192.168.1.192/27 dev mynet-shim

我可以从主机 A 访问容器,就像我 运行:

curl 192.168.1.192:80,我收到的nginx默认html

我还可以从主机 A ping 容器。

当我运行docker logs nginx时,它说:

192.168.1.223 - - [02/Nov/2018:16:19:32 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"

所以它正在与 mynet-shim 子接口一起工作。

但是,我无法从主机 B 访问容器,因为主机 B 对容器的 curlping 命令均失败,即使它与主机位于同一子网中A 和容器

我在主机 B 上是否遗漏了任何其他配置?

问题出在 VMWare 的网络设置上。

在 VMWare ESXi 6.5(客户端版本 1.2.3)上:

  1. 单击左侧窗格中的 "Networking"
  2. 点击"Security"
  3. 为 "Promiscuous mode"、"MAC address changes" 和 "Forged transmits"
  4. 选择 "Accept"
  5. 保存

在此之后,我能够从同一网络上的不同主机(即主机 B)访问容器