简介
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
来源参考: macvlan模式容器与宿主机通信问题 | 爱折腾的小白 - MoPoQAQ https://mopo-blog.ddnsfree.com/2021/02/23/n1-eth0-macvlan/