我在2个docker host之间设置了Macvlan网络,如下所示:
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
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/sh
HOST_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 forever
HOST_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 forever
CONTAINER_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)
=确定
HOST_2 (172.18.0.23) -> CONTAINER_1 (172.18.1.0) and CONTAINER_2 (172.18.1.16)
=确定
CONTAINER_1 (172.18.1.0) -> HOST_2 (172.18.0.23)
=确定
CONTAINER_2 (172.18.1.16) -> HOST_1 (172.18.0.21)
=确定
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虚拟化透视图中进行配置,如果存在任何差异,还要知道裸机
答案 0 :(得分:3)
这是为macvlan定义的行为,是设计使然。参见Docker Macvlan Documentation
使用macvlan时,无法ping通或与默认名称空间IP地址通信。例如,如果您创建一个容器并尝试ping Docker主机的eth0,则该容器将无法工作。流量被内核模块本身明确过滤,以提供附加的提供程序隔离和安全性。
可以将macvlan子接口添加到Docker主机,以允许Docker主机和容器之间的通信。需要在此子接口上设置IP地址并将其从父地址中删除。
答案 1 :(得分:1)
这个问题“有点老了”,但是其他人可能会觉得有用。 USING DOCKER MACVLAN NETWORKS BY LARS KELLOGG-STEDMAN的 主机访问 部分中介绍了一种解决方法。我可以确认-它正在工作。
主机访问通过将容器连接到macvlan网络,您将 发现它可以联系您本地网络上的其他系统 没问题,容器将无法连接到您的 主机(您的主机将无法连接到您的容器)。 这是macvlan接口的限制:没有特殊支持 通过网络交换机,您的主机无法将数据包发送到自己的主机 macvlan接口。
幸运的是,有一个解决此问题的方法:您可以创建 主机上的另一个macvlan接口,并使用该接口进行通信 在macvlan网络上使用容器。
首先,我要保留我们网络范围内的地址以供使用 使用docker的--aux-address选项通过主机接口 网络创建。这使我们的最终命令行看起来像:
docker network create -d macvlan -o parent=eno1 \ --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将该地址分配给容器。
接下来,我们在主机上创建一个新的macvlan接口。你可以叫它 任何您想要的东西,但我称这个为mynet垫片:
ip link add mynet-shim link eno1 type macvlan mode bridge
现在,我们需要使用保留的地址配置接口 并提出来:
ip addr add 192.168.1.223/32 dev mynet-shim ip link set mynet-shim up
我们要做的最后一件事是告诉主机使用该接口 与容器通信时。这比较容易 因为我们已将容器限制为特定的CIDR子集 本地网络的;我们只是将一条路线添加到该范围,如下所示:
ip route add 192.168.1.192/27 dev mynet-shim
有了该路由,您的主机将自动使用 与mynet上的容器通信时的mynet-shim接口 网络。
请注意,此处显示的接口和路由配置为 不持久-如果要重新引导主机,则会丢失。怎么样 使其持久取决于分发。
答案 2 :(得分:0)
在我的情况下,我向容器中添加了一个网络。
因此可以通过不同的 IP (CONTAINER_1 -> HOST_1
) 访问 10.123.0.2
。
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/24