Tips-利用Macvlan与宿主机通讯
前言:默认情况下各个macvlan之间可以通讯,但是不能与宿主机进行通讯!! 出现这种情况的原因是为了安全而禁止互通,如宿主机ping容器的ip,尽管他们属于同一网段,但是也是ping不通的,反过来也是。
下面先介绍一下基本的Docker网络模式
工作模式
1. Private
private模式下于VEPA模式类似,都是各个子设备之间不可用进行通讯,而此模式不同的是,也不能使用外部交换机链接进行通讯,是完全隔离的!
2. Virtal Ethernet Port Aggregator
各个子设备无法直接进行通讯,需要外部交换机支持(需支持802.1Qbg/VPEA功能——数据可从接口接受并且可以回传),外部通信正常。
3. Bridge
桥接模式,各个虚拟的子网卡都被链接到一个虚拟网桥上面可以进行相互通讯,不需要外部交换机支持(内部虚拟)。
4. Passthrough
这种模式下会完全接管父接口的所有流量信息,并且每个父接口只允许一个macvlan设备进行连接。并且主接口必须改为混杂模式!
解决方案:可以在宿主机上建立一个macvlan链接,这样就可以通过宿主机上的macvlan与容器内部的macvlan进行连接,从而解决了宿主机与macvlan容器之间不能通讯的问题。
创建容器macvlan示例:
1.docker 创建macvlan
macvlan_ipv4
docker network create -d macvlan
--subnet=192.168.123.0/24(你的网络子网号)
--gateway=192.168.123.1(你的网关)
-o parent=ovs_eth0(你的父网卡)
macvlan(新的网络名称)
macvlan_ipv6
docker network create -d macvlan --ipv6
--subnet=192.168.123.0/24 --gateway=192.168.123.1
--subnet=240e::/60 --gateway=240e::1
-o parent=ovs_eth0
-o macvlan_mode=bridge
macvlan(新的网络名称)
2.docker容器运行macvlan模式
docker run -d
--name=xxxx
--network macvlan(你的macvlan网络名称)
--ip=192.168.0.39(指定macvlan ip地址)
--dns=192.168.0.29(指定容器dns)
--restart=always
--name=movie-robot
......其他docker运行参数
3.宿主机和容器通讯
宿主机创建一个macvlan
ip link add macvlan2(一个网络名称) link ovs_eth0(你的物理网卡) type macvlan mode bridge
设置macvlan ip 并启用
ip addr add 192.168.123.240 dev macvlan2
ip link set macvlan2 up #启用新建网络
增加路由表
ip route add 目的ip(需要建立通讯的macvlan容器 ip) dev macvlan(刚宿主机建立的macvlan)
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

