群晖DSM7下docker配置macvlan网络模式简单教程
docker配置macvlan网络模式
[scode type="green"]配置macvlan网络模式实现macvlan与host网络互通,及互通服务自启动[/scode]
[scode type="green"]简单来说就是使用macvlan网络模式的docker容器,可以看作是局域网内的一个独立设备,它会有一个独立的内网IP。
每个macvlan下的docker容器,都有自己一套完整的端口可用,不会互相冲突。
来说,macvlan最大的优点就是可以和宿主机配置为不同网关,方便网络分流。
当然如果是其他网络拓扑模式的同学,也可以通过macvlan来给每个容器分配好IP,方便通过IP分流管理。[/scode]
打开Open vSwitch
[scode type="green"]
首先进入-控制面板-网络-网络界面-管理-Open vSwitch 设置-打开Open vSwitch[/scode]
Open vSwitch就是虚拟交换机。可以简单这样理解,docker容器接入这台交换机,就可以连上你的路由器,相当于一台手机or平板or盒子接入你家网络。
查看NAS网卡情况
[scode type="green"]
确认打开Open vSwitch开关以后,我们进入SSH控制台
输入ip addr
查看NAS网卡情况 确认Open vSwitch功能是否打开
[/scode]
[scode type="green"]
图中列出了NAS的所有网卡,其中有一个ovs_eth0的网口,对应NAS物理网口信息。
这个网口就是开启了Open vSwitch以后的联网网口。如果你的联网网口是其他口(eth),这里的ovs_eth也可能不一样,自行注意。
等会创建macvlan网络需要使用这个端口,一定记好,不要搞错。
[/scode]
查看docker的网络详情
输入
docker network ls
查看docker的网络详情
目前默认只有三种网络模式
[scode type="green"]
如果已经有driver为macvlan的docker网络,可以执行
docker network rm name
来进行删除,name为macvlan网络实际名称,即图上的NAME栏参数。
[/scode]
创建自定义macvlan网络
[scode type="green"]
确认docker网络中没有macvlan网络,我们再进行下一步。
创建自定义macvlan网络。
创建命令很简单,和创建docker容器类似
[/scode]
[scode type="green"]
我这里内网网段是
192.168.1.0/24
主路由网关
192.168.1.3
旁路由网关
192.168.1.5
[/scode]
我的目的是让qB和TR不经过旁路由网关,直接走主路由网关,所以要把macvlan的网关设置成 192.168.1.3
创建macvlan网络命令
仅ipv4
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.3 -o parent=ovs_eth1 name
ipv4&ipv6双栈
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.3 --ipv6 --subnet=2008::/60 --gateway=2008::1 -o parent=ovs_eth1 name
docker network create -d macvlan #指定创建的网络类型是macvlan
--subnet=192.168.1.0/24 #macvlan的ipv4网段,这里写你的内网网段即可。
--gateway=192.168.1.3 #macvlan的ipv4网关,这里写您需要容器走的网关。
--ipv6 #启用ipv6支持
--subnet=2408::/60 #macvlan的ipv6前缀
--gateway=2408::1 #macvlan的ipv6网关
-o parent=ovs_eth1 #桥接网络走的是ovs_eth0接口,如果你的接口不是这个,请自行更改。
name #macvlan网络的名称
[scode type="green"]
参数怎么填大家按照自己实际需求情况
[/scode]
[scode type="green"]
这里给个参考
[/scode]
docker network create -d macvlan --subnet=11.0.0.0/24 --gateway=11.0.0.1 --ipv6 --subnet=2408:825c:900:xxxx::/60 --gateway=2408:825c:900:xxxx::1 -o parent=ovs_eth0 IP03
[scode type="green"]
创建了一个名为GGGGG(名字随意,你喜欢就可以)的ipv4&ipv6双栈macvlan网络。
[/scode]
[scode type="green"]
创建完成以后可以再次输入 docker network ls 检查是否创建成功
也可以打开docker的webui,检查网络信息
[/scode]
[scode type="green"]
macvlan网络创建成功以后,我们就可以使用它来创建具体容器了
[/scode]
[scode type="green"]
容器创建指定ipdocker命令
[/scode]
docker run -dit \
--net=IP03 \
--ip=192.168.1.80 \
--name clash \
-v /volume1/docker/clash/config.yaml:/root/.config/clash/config.yaml \
-p 8890:7890 \
--privileged=true \
--restart always \
dreamacro/clash
[scode type="green"]
--net=clash #为容器使用名为clash的docker网络模式
--ip=192.168.1.80 #指定容器IP
其余部分跟普通创建容器一致
[/scode]
[scode type="green"]
创建其他容器只要 --net 配置为macvlan网络名称即可,大家自行举一反三
创建成功以后可以看到macvlan网络模式下有三个容器
[/scode]
查看docker ip
docker exec -it 891a6784b ip addr
[scode type="green"]
以上就是如何创建macvlan网络模式,以及如何创建依赖于macvlan网络docker容器的方法
[/scode]
[scode type="green"]
一般在macvlan模式下同网段的其他机器可以和容器互通,但宿主不能和容器互通,这是在macvlan模式设计的时候为了安全而禁止了宿主机和容器直接通信。
打个比方就是你用host模式创建的青龙面板,默认情况下是访问不了ping不通macvlan模式下的clash客户端的,反之也一样。
[/scode]
让macvlan与macvlan之间可以互通
[scode type="green"]
如果想要实现互通,有个曲线救国的方法,就是macvlan与macvlan之间可以互通,只需要在宿主机再创建一个macvlan网络,然后修改路由,让数据经过这个macvlan达到互通的目的。
[/scode]
假设现有网段为192.168.1.0/24
的网络:
名字 | ip | 接口 |
---|---|---|
宿主机 | 192.168.1.10 | eth0 |
容器 | 192.168.1.20 | macvlan |
建立一个名为macvlan2
的macvlan
接口,并分配一个ip:
名字 | ip | 接口 |
---|---|---|
macvlan2 | 192.168.1.15 | macvlan |
命令:
ip link add macvlan2 link eth0 type macvlan mode bridge
ip addr add 192.168.1.15 dev macvlan2
ip link set macvlan2 up
修改路由,让宿主机到容器(192.168.1.20)
的数据经过macvlan2
:
ip route add 192.168.1.20 dev macvlan2
宿主机 访问 容器的ip:192.168.1.20
容器 访问 宿主机ip:192.168.1.15