我已经在2台docker主机之间设置了Macvlan网络,如下所示:
主机设置: HOST_1 ens192: 172.18.0.21
创建macvlan网桥接口
docker network create -d macvlan \
--subnet=172.18.0.0/22 \
--gateway=172.18.0.1 \
--ip-range=172.18.1.0/28 \
-o macvlan_mode=bridge \
-o parent=ens192 macvlan创建macvlan接口HOST_1
ip link add ens192.br link ens192 type macvlan mode bridge
ip addr add 172.18.1.0/28 dev ens192.br
ip link set dev ens192.br up主机设置: HOST_2 ens192: 172.18.0.23
创建macvlan网桥接口
docker network create -d macvlan \
--subnet=172.18.0.0/22 \
--gateway=172.18.0.1 \
--ip-range=172.18.1.16/28 \
-o macvlan_mode=bridge \
-o parent=ens192 macvlan在HOST_2中创建macvlan接口
ip link add ens192.br link ens192 type macvlan mode bridge
ip addr add 172.18.1.16/28 dev ens192.br
ip link set dev ens192.br up容器设置
在两台主机上创建容器
HOST_1# docker run --net=macvlan -it --name macvlan_1 --rm alpine /bin/sh
HOST_2# docker run --net=macvlan -it --name macvlan_1 --rm alpine /bin/shHOST_1中的CONTAINER_1
24: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 02:42:ac:12:01:00 brd ff:ff:ff:ff:ff:ff
inet 172.18.1.0/22 brd 172.18.3.255 scope global eth0
valid_lft forever preferred_lft foreverHOST_2中的CONTAINER_2
21: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN
link/ether 02:42:ac:12:01:10 brd ff:ff:ff:ff:ff:ff
inet 172.18.1.16/22 brd 172.18.3.255 scope global eth0
valid_lft forever preferred_lft foreverCONTAINER_1和CONTAINER_2中的路由表
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.18.0.1 0.0.0.0 UG 0 0 0 eth0
172.18.0.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0场景
HOST_1 (172.18.0.21) <-> HOST_2 (172.18.0.23) = OK (反之亦然)
HOST_1 (172.18.0.21) -> CONTAINER_1 (172.18.1.0) and CONTAINER_2 (172.18.1.16) = OK
HOST_2 (172.18.0.23) -> CONTAINER_1 (172.18.1.0) and CONTAINER_2 (172.18.1.16) = OK
CONTAINER_1 (172.18.1.0) -> HOST_2 (172.18.0.23) = OK
CONTAINER_2 (172.18.1.16) -> HOST_1 (172.18.0.21) = OK
CONTAINER_1 (172.18.1.0) <-> CONTAINER_2 (172.18.1.16) = OK (反之亦然)
CONTAINER_1 (172.18.1.0) -> HOST_1 (172.18.0.21) =失败
CONTAINER_2 (172.18.1.16) -> HOST_2 (172.18.0.23) =失败
问题
除了这个单一问题,我已经非常接近我想要实现的解决方案了。如何才能让容器连接到自己的主机。如果有解决方案,我想知道如何在ESXi虚拟化角度进行配置,以及裸机是否有任何不同
发布于 2018-08-23 03:02:48
这是为macvlan定义的行为,并且是设计出来的。请参阅Docker Macvlan Documentation
发布于 2020-10-15 04:13:48
这个问题“有点陈旧”,但其他人可能会发现它很有用。USING DOCKER MACVLAN NETWORKS BY LARS KELLOGG-STEDMAN的主机访问一节中介绍了一种解决方法。我可以确认-它起作用了。
主机访问通过连接到macvlan网络的容器,您会发现,虽然它可以毫无问题地联系您本地网络上的其他系统,但容器将无法连接到您的主机(并且您的主机将无法连接到您的容器)。这是macvlan接口的一个限制:如果没有来自网络交换机的特殊支持,您的主机无法将数据包发送到它自己的macvlan接口。
幸运的是,这个问题有一个解决方法:您可以在主机上创建另一个macvlan接口,并使用该接口与macvlan网络上的容器进行通信。
首先,我将保留网络范围中的一个地址,以供主机接口使用,方法是使用--aux-address选项对接network create。这使得我们的最终命令行看起来像这样:
docker网络创建-d macvlan -o parent=eno1 \--子网192.168.1.0/24 \--网关192.168.1.1 \ --ip-range 192.168.1.192/27 \--辅助地址'host=192.168.1.223‘\ mynet
这将阻止Docker将该地址分配给容器。
接下来,我们在主机上创建一个新的macvlan接口。你可以随心所欲地叫它,但我称它为mynet-shim:
ip链路添加mynet-shim链路eno1类型macvlan模式桥
现在,我们需要使用保留的地址配置接口,并将其打开:
ip addr add 192.168.1.223/32 dev mynet-shim ip link set mynet-shim up
我们需要做的最后一件事是告诉我们的主机在与容器通信时使用该接口。这相对容易,因为我们已经将容器限制到本地网络的特定CIDR子集;我们只需向该范围添加一个路由,如下所示:
ip路由添加192.168.1.192/27设备mynet-shim
有了该路由,在与mynet网络上的容器通信时,您的主机将自动使用mynet-shim接口。
请注意,此处显示的接口和路由配置不是持久的-如果要重新启动主机,您将会失败。如何使其持久化是依赖于分布的。
发布于 2021-06-04 18:40:11
在我的情况下,我在容器中又添加了一个网络。
因此,可以通过不同的IP (10.123.0.2)到达CONTAINER_1 -> HOST_1。
CONTAINER_2或HOST_2可以连接到172.18.1.0。
以下是docker-compose示例,希望这可以作为解决方法。
version: "3"
services:
macvlan_1:
image: alpine
container: macvlan_1
command: ....
restart: always
networks:
macvlan:
ipv4_address: 172.18.1.0
internalbr:
ipv4_address: 10.123.0.2
networks:
macvlan:
driver: macvlan
driver_opts:
parent: ens192
macvlan_mode: bridge
ipam:
driver: default
config:
- subnet: 172.18.0.0/22
gateway: 172.18.0.1
ip_range: 172.18.1.0/28
internalbr:
driver: bridge
ipam:
config:
- subnet: 10.123.0.0/24https://stackoverflow.com/questions/49600665
复制相似问题