macvlan模式容器与宿主机通信问题

简介

Docker的macvlan模式非常好用(吹爆),但是该模式有一个重大缺陷,宿主机与容器无法直接通信,如宿主机ping容器的IP,尽管他们属于同一网段,但是也是ping不通的,反之亦然。
因为该模式在设计的时候,为了安全禁止了宿主机与容器的直接通信,不过解决的方法其实也很简单——宿主机虽然没办法直接和容器内的macvlan接口通信,但是只要在宿主机上再建立一个macvlan,然后修改路由表,使数据经由宿主机下的macvlan传输到容器内的macvlan即可。

原理

macvlan之间是可以互相通信的。

环境

  • 宿主机 eth0:192.168.2.2/24
  • Docker任一容器:192.168.2.11/24

解决方案

❗❗❗以下操作均在 宿主机 中,不是在Docker容器中,自行替换以下代码中加粗的参数

  • 新增一个叫mynet(不要和容器的macvlan重名)的macvlan接口

    ip link add mynet link eth0 type macvlan mode bridge

  • 为该接口分配ip

    ip addr add 192.168.2.3 dev mynet

  • 启用名称为mynet的macvlan

    ip link set mynet up

  • 修改路由表,使宿主机(192.168.2.2/24)到Docker任一容器(192.168.2.11/24)的通信全部经由mynet中转,每一个容器都需要添加一条路由

    ip route add 192.168.2.11 dev mynet