如何让macvlan模式的容器与宿主机通信

前段时间使用到了docker的macvlan模式,这个模式通俗一点讲就是在一张物理网卡上虚拟出两个虚拟网卡,具有不同的MAC地址,可以让宿主机和docker同时接入网络并且使用不同的ip,此时docker可以直接和同一网络下的其他设备直接通信,相当的方便,但是这种模式有一个问题,宿主机和容器是没办法直接进行网络通信的,如宿主机ping容器的ip,尽管他们属于同一网段,但是也是ping不通的,反过来也是。因为该模式在设计的时候,为了安全禁止了宿主机与容器的直接通信,不过解决的方法其实也很简单——宿主机虽然没办法直接和容器内的macvlan接口通信,但是只要在宿主机上再建立一个macvlan,然后修改路由,使数据经由该macvlan传输到容器内的macvlan即可,macvlan之间是可以互相通信的。

具体一些的教程可以查看USING DOCKER MACVLAN NETWORKS

With a container attached to a macvlan network, you will find that while it can contact other systems on your local network without a problem, the container will not be able to connect to your host (and your host will not be able to connect to your container). This is a limitation of macvlan interfaces: without special support from a network switch, your host is unable to send packets to its own macvlan interfaces.

Fortunately, there is a workaround for this problem: you can create another macvlan interface on your host, and use that to communicate with containers on the macvlan network.

原文中针对的情形是将网络下的某一网段就分配给docker容器,使宿主机可以和这些容器互相通信,而我当前只需要使宿主机和一个容器可以通信即可,所以命令会有一些不同。

假设所在网络的网段为 192.168.0.0/24 容器通过macvlan获得的ip为 192.168.0.100

# 以下操作都在宿主机上运行,新增一个叫mynet(不要和容器的macvlan重名)的macvlan接口
ip link add mynet link eth0 type macvlan mode bridge
# 为该接口分配ip,并启用
ip addr add 192.168.0.10 dev mynet
ip link set mynet up
# 修改路由,使宿主机到192.168.0.100的通信全部经由mynet进行
ip route add 192.168.0.100 dev mynet

完成这些配置后,再次在宿主机中使用ping 192.168.0.100可以发现已经可以和容器直接通信了。

还有一点需要注意的是,重启后自己创建的macvlan接口会消失,我的方法是把上述命令都写到了rc.local内。

文章目录