使用 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 对容器的 curl
和 ping
命令均失败,即使它与主机位于同一子网中A 和容器
我在主机 B 上是否遗漏了任何其他配置?
问题出在 VMWare 的网络设置上。
在 VMWare ESXi 6.5(客户端版本 1.2.3)上:
- 单击左侧窗格中的 "Networking"
- 点击"Security"
- 为 "Promiscuous mode"、"MAC address changes" 和 "Forged transmits"
选择 "Accept"
- 保存
在此之后,我能够从同一网络上的不同主机(即主机 B)访问容器
我创建了我的 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 对容器的 curl
和 ping
命令均失败,即使它与主机位于同一子网中A 和容器
我在主机 B 上是否遗漏了任何其他配置?
问题出在 VMWare 的网络设置上。
在 VMWare ESXi 6.5(客户端版本 1.2.3)上:
- 单击左侧窗格中的 "Networking"
- 点击"Security"
- 为 "Promiscuous mode"、"MAC address changes" 和 "Forged transmits" 选择 "Accept"
- 保存
在此之后,我能够从同一网络上的不同主机(即主机 B)访问容器