前段时间使用到了docker的macvlan模式,这个模式通俗一点讲就是在一张物理网卡上虚拟出两个虚拟网卡,具有不同的MAC地址,可以让宿主机和docker同时接入网络并且使用不同的ip,此时docker可以直接和同一网络下的其他设备直接通信,相当的方便,但是这种模式有一个问题,宿主机和容器是没办法直接进行网络通信的,如宿主机ping容器的ip,尽管他们属于同一网段,但是也是ping不通的,反过来也是。因为该模式在设计的时候,为了安全禁止了宿主机与容器的直接通信,不过解决的方法其实也很简单——宿主机虽然没办法直接和容器内的macvlan接口通信,但是只要在宿主机上再建立一个macvlan,然后修改路由,使数据经由该macvlan传输到容器内的macvlan即可,macvlan之间是可以互相通信的。
具体一些的教程可以查看USING DOCKER MACVLAN NETWORKS
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.3.0/24 容器通过macvlan获得的ip为 192.168.3.10
# 以下操作都在宿主机上运行,新增一个叫mynet(不要和容器的macvlan重名)的macvlan接口
ip link add mynet link eth0 type macvlan mode bridge
# 为该接口分配ip,并启用
ip addr add 192.168.3.66 dev mynet
ip link set mynet up
# 修改路由,使宿主机到192.168.3.66的通信全部经由mynet进行
ip route add 192.168.3.66 dev mynet
完成这些配置后,再次在宿主机中使用ping 192.168.3.10
可以发现已经可以和容器直接通信了。
还有一点需要注意的是,重启后自己创建的macvlan接口会消失,我的方法是把上述命令都写到了rc.local内。
暂无评论
要发表评论,您必须先 登录