首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容器内的Docker Macvlan网络无法到达自己的主机

容器内的Docker Macvlan网络无法到达自己的主机
EN

Stack Overflow用户
提问于 2018-04-02 01:22:18
回答 3查看 11.1K关注 0票数 8

我已经在2台docker主机之间设置了Macvlan网络,如下所示:

主机设置: HOST_1 ens192: 172.18.0.21

创建macvlan网桥接口

代码语言:javascript
复制
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

代码语言:javascript
复制
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网桥接口

代码语言:javascript
复制
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接口

代码语言:javascript
复制
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

容器设置

在两台主机上创建容器

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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中的路由表

代码语言:javascript
复制
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虚拟化角度进行配置,以及裸机是否有任何不同

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-23 03:02:48

这是为macvlan定义的行为,并且是设计出来的。请参阅Docker Macvlan Documentation

  • 使用macvlan时,您无法ping默认名称空间IP地址或与其通信。例如,如果您创建了一个容器并尝试ping Docker主机的eth0,它将无法工作。该流量由内核模块本身显式过滤,以提供额外的提供者隔离和安全性。

  • 可以向Docker主机添加macvlan子接口,以允许Docker主机和容器之间的流量。需要在此子接口上设置IP地址并将其从父地址中删除。
票数 8
EN

Stack Overflow用户

发布于 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接口。

请注意,此处显示的接口和路由配置不是持久的-如果要重新启动主机,您将会失败。如何使其持久化是依赖于分布的。

票数 6
EN

Stack Overflow用户

发布于 2021-06-04 18:40:11

在我的情况下,我在容器中又添加了一个网络。

因此,可以通过不同的IP (10.123.0.2)到达CONTAINER_1 -> HOST_1

CONTAINER_2HOST_2可以连接到172.18.1.0

以下是docker-compose示例,希望这可以作为解决方法。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49600665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档