因为使用Openwrt作为宿主机运行Docker,因为他占用资源少,但总会出现需要使用的端口被Openwrt自身服务占用的事情,举个很常见的例子,比如自带的Upnp,Dlna接收器,Airplay接收器,他们都需要5000端口,Airplay其实还好,因为用的是udp和ipv6,所以可以和Upnp共存,这时候就需要使用Macvlan虚拟端口了。

首先来说说他的原理,通常一个端口会有一个mac地址,
ip会与这个mac地址绑定,当设备被通过ip地址访问时,会去查路由表应该往哪条路走,最后根据ip找到mac地址对应设备将包给他,Macvlan就是给一个端口虚拟多个mac地址,来实现给一个端口分配多个地址的方案,多个地址又可以以host模式分别给容器使用。
有些操作其实很简单,但是总没有人告诉咩咩应该怎么做,也没有任何相关资料,因此折腾了一个下午+一个晚上才搞定。

子网192.168.10.1:24启用ipv6其他默认.jpeg
Docker -> 网络 -> 新建
名称lan,驱动MAC VLAN
首先容器的Macvlan网络需要被局域网访问,因此是桥接到br-lan上
先说明一点,在同一个网段是不可能的,因为这是两个相同网段的路由表,他并不知道应该走虚拟的还是真实的路由,所以会导致外部可以访问容器,容器没外网,已经试过了不行就别再试了
虽然设置不同的网段,但是测试路由的通的,咩咩的局域网是192.168.1.1/24,分配给它的子网是192.168.10.1/24
网关选择了子网的第一个ip,192.168.10.1
开启ipv6,因为像Airplay这种服务需要ipv6,子网用默认的fe80::/10就行

docker网络.jpeg
docker_lan接口.jpeg
创建好后,网络中会出现一个新的接口

请注意最重要的一点,使用这个Macvlan的容器必须是带着--net=lan全新run的,不能修改现有容器加上这个网络,否则启动会报错网段冲突,无论网段是否真的冲突,绝对会报错
网段冲突错误.jpeg