群晖DSM7实现Docker的macvlan

参考:NAS 相关 篇十二:群晖 DSM7 下,docker 中 macvlan 网络模式配置简单教程 实现 macvlan 与 host 网络互通,及互通服务自启动_NAS 存储_什么值得买

感谢转身就买大佬,群晖教程本来就少,写的这么详细的更是难得。

MACVLAN 的作用

macvlan 网络模式的 docker 容器,可以看作是局域网内的一个独立设备,它会有一个独立的内网 IP。每个 macvlan 下的 docker 容器,都有自己一套完整的端口可用,不会互相冲突。

创建 macvlan

启用 Open vSwitch 。

路径:控制面板 - 网络 - 网络界面 - 管理 - Open vSwitch 设置

群晖DSM7实现Docker的macvlan插图

Open vSwitch 就是虚拟交换机。可以简单这样理解,docker 容器接入这台交换机,就可以连上你的,相当于一台手机 or 平板 or 盒子接入你家网络。

确认打开 Open vSwitch 开关以后,我们进入 SSH 控制台。

输入

ip addr 查看 NAS 网卡情况 确认 Open vSwitch 功能是否打开。

群晖DSM7实现Docker的macvlan插图1

图中列出了 NAS 的所有网卡,其中有一个 ovs_eth0 的网口,对应 NAS 物理网口信息。这个网口就是开启了 Open vSwitch 以后的联网网口。如果你的联网网口是其他口(eth*),这里的 ovs_eth * 也可能不一样,自行注意。等会创建 macvlan 网络需要使用这个端口,一定记好,不要搞错。

下一步输入

docker network ls

查看 docker 的网络详情

群晖DSM7实现Docker的macvlan插图2

目前默认只有三种网络模式

bridge、host、none 三种网络模式是什么原理作用,大家自行百度即可。

如果已经有 driver 为 macvlan 的 docker 网络,可以执行 docker network rm name 来进行删除,name 为 macvlan 网络实际名称,即图上的 NAME 栏参数。

确认 docker 网络中没有 macvlan 网络,我们再进行下一步。

创建自定义 macvlan 网络。


创建命令很简单,和创建 docker 容器类似。

我这里内网网段是 192.168.50.0/24 ,主路由网关 192.168.50.1 ,旁路由网关 192.168.2.1 。

我的目的是让 qB 和 TR 不经过旁路由网关,直接走主路由网关,所以要把 macvlan 的网关设置成 192.168.50.1。

创建 macvlan 网络命令如下


仅 ipv4

docker network create -d macvlan –subnet=192.168.50.0/24 –gateway=192.168.50.1 -o parent=ovs_eth0 name


ipv4&ipv6 双栈

docker network create -d macvlan –subnet=192.168.50.0/24 –gateway=192.168.50.1 –ipv6 –subnet=2008::/60 –gateway=2008::1 -o parent=ovs_eth0 name


# 我的创建 macvlan docker network create -d macvlan --subnet=192.168.50.1/24 --gateway=192.168.50.1 -o parent=ovs_eth0 macv

简单解释一下

docker network create -d macvlan #指定创建的网络类型是 macvlan

–subnet=192.168.50.0/24 #macvlan 的 ipv4 网段,这里写你的内网网段即可。

–gateway=192.168.50.1 #macvlan 的 ipv4 网关,这里写您需要容器走的网关。

–ipv6 #启用 ipv6 支持

–subnet=2408::/60 #macvlan 的 ipv6 前缀

–gateway=2408::1 #macvlan 的 ipv6 网关

-o parent=ovs_eth0 #桥接网络走的是 ovs_eth0 接口,如果你的接口不是这个,请自行更改。

name #macvlan 网络的名称(可以自定义)

参数怎么填大家按照自己实际需求情况来


创建完之后在 Docker – 网络中可以看到自定义的 macvlan

群晖DSM7实现Docker的macvlan插图3

创建 Docker

命令创建

我这里部署的是甜糖 ttnode

#通过macvlan 启动docker docker run -d --name=ttnode3 --net=macv --ip=192.168.50.23 -v /volume4/data/m/node3:/mnt/data/ttnode tiptime/ttnode:latest

–net=macv #为容器使用名为 macv 的 docker 网络模式

–ip=192.168.50.23 #指定容器 IP

其余部分跟普通创建容器一致。

创建其他容器只要 –net 配置为 macvlan 网络名称即可,大家自行举一反三。

图形创建

群晖DSM7实现Docker的macvlan插图4

从映像点击启动,直接可以选择自己创建的自己的 macvlan 。

缺点就是无法指定 ip 了。但是可以从前面的 subnet 里面获取到 ip。

ps. 这个貌似是不接受 DHCP 的,我 DHCP 设置的是 192.168.50.200-192.168.50.240,但是爱快显示的是 192.168.50.2 。分流等功能都正常


macvlan 网络模式下容器与宿主机互通

由于我没有这个需求,所以直接复制了

“一般在 macvlan 模式下同网段的其他机器可以和容器互通,但宿主不能和容器互通,这是在 macvlan 模式设计的时候为了安全而禁止了宿主机和容器直接通信。” 援引 Rehtt 大佬的话。

打个比方就是你用 host 模式创建的 iyuu,默认情况下是访问不了 ping 不通 macvlan 模式下的 qB 客户端的,反之也一样。

群晖DSM7实现Docker的macvlan插图5

群晖DSM7实现Docker的macvlan插图6

尝试宿主机直接 ping 容器 qB-down1 的 IP ,无法 ping 通。

不过我们还有曲线救国的办法

具体直接看 Rehtt 大佬的教程,里面有详细原理方法介绍。

【Docker】macvlan 网络模式下容器与宿主机互通 – Rehtt's Blog

群晖DSM7实现Docker的macvlan插图7

“如果想要实现互通,有个曲线救国的方法,就是 macvlan 与 macvlan 之间可以互通,只需要在宿主机再创建一个 macvlan 网络,然后修改路由,让数据经过这个 macvlan 达到互通的目的。” 同样援引 Rehtt 大佬的话。

命令也很简单

以我前面的配置环境举例就是以下几条命令即可

ip link add TTTTT link ovs_eth0 type macvlan mode bridge

ip addr add 11.0.0.160 dev TTTTT

ip link set TTTTT up

ip route add 11.0.0.151 dev TTTTT

ip route add 11.0.0.152 dev TTTTT

ip route add 11.0.0.153 dev TTTTT

以下为简单解释

ip link add TTTTT link ovs_eth0 type macvlan mode bridge #创建一个名为 TTTTT 的 macvlan 接口,名字随意你可以设置为你喜欢的名字。ovs_eth0 和之前一样,需要写为开启了 Open vSwitch 以后的联网网口。

ip addr add 11.0.0.160 dev TTTTT #设置 TTTTT 接口的 IP 为 11.0.0.160,需要和你之前设置的第一个 macvlan(GGGGG)同网段。

ip link set TTTTT up #启动 TTTTT 接口。

ip route add 11.0.0.151 dev TTTTT #让 IP11.0.0.151(qB-down1)到宿主机的路由经过 TTTTT 接口。

ip route add 11.0.0.152 dev TTTTT #让 IP11.0.0.152(qB-down2)到宿主机的路由经过 TTTTT 接口。

ip route add 11.0.0.153 dev TTTTT #让 IP11.0.0.153(qB-down3)到宿主机的路由经过 TTTTT 接口。

群晖DSM7实现Docker的macvlan插图8

创建完成后输入 ip addr 可以发现新建的 TTTTT 接口已经生效。

尝试在宿主机 ping 容器 IP

群晖DSM7实现Docker的macvlan插图9

均可 ping 通,说明配置已经生效。

到这里就完成了整套 macvlan 配置,可以正常使用没有问题了。


不过!还没完

群晖DSM7实现Docker的macvlan插图11

那就是上面 macvlan 网络模式下容器与宿主机互通的相关配置,默认情况下重启后会重置。

每次重启后就要重新执行一遍

ip link add TTTTT link ovs_eth0 type macvlan mode bridge

ip addr add 11.0.0.160 dev TTTTT

ip link set TTTTT up

ip route add 11.0.0.151 dev TTTTT

ip route add 11.0.0.152 dev TTTTT

ip route add 11.0.0.153 dev TTTTT

手动输入,作为一个懒人,这能忍?

群晖DSM7实现Docker的macvlan插图12

所以最后就是配置开机启动自动配置。

因为群晖 7.0 变动比较大,不能简单地用系统自带的开机执行脚本方法实现。

我们需要把命令配置为 systemd 服务,通过 systemd 来实现开机启动自动配置。

我们先创建一个新的 systemd 服务,取名 macvlan.service

进入 SSH 执行

vi /usr/local/lib/systemd/system/macvlan.service

群晖DSM7实现Docker的macvlan插图14

按 i 键,进入编辑模式,输入以下内容。


[Unit]

Description=Macvlan shim to allow docker to route to host

# After=pkgctl-Docker.service

# BindsTo=pkgctl-Docker.service

ReloadPropagatedFrom=pkgctl-Docker.service

PartOf=pkgctl-Docker.service

[Service]

Type=oneshot

ExecStart=/bin/bash /usr/local/bin/macvlan_start.sh

ExecStop=/bin/bash /usr/local/bin/macvlan_stop.sh

RemainAfterExit=yes

Restart=no

[Install]

WantedBy=pkgctl-Docker.service


直接复制的同学请注意格式,参考截图。

群晖DSM7实现Docker的macvlan插图15

然后按 esc 键入 :wq 保存修改

可以利用 cat 检查一下是否正常

cat /usr/local/lib/systemd/system/macvlan.service

群晖DSM7实现Docker的macvlan插图16

文件内容如图即为正确

然后我们要配置两个 bash 脚本。

也就是要对应 macvlan.service 服务配置内容中,start 服务和 stop 服务两个脚本的路径。

群晖DSM7实现Docker的macvlan插图17


先配置 start 服务执行脚本

执行

vi /usr/local/bin/macvlan_start.sh

同样按 i 进入编辑模式,输入需要开机执行的命令,也就是我们的 macvlan 与宿主机互通需要的命令。


ip link add TTTTT link ovs_eth0 type macvlan mode bridge

ip addr add 11.0.0.160 dev TTTTT

ip link set TTTTT up

ip route add 11.0.0.151 dev TTTTT

ip route add 11.0.0.152 dev TTTTT

ip route add 11.0.0.153 dev TTTTT


群晖DSM7实现Docker的macvlan插图18

确定无误后,按 Esc 键入 :wq 保存脚本。

接下来配置 stop 脚本

同样道理

执行

vi /usr/local/bin/macvlan_stop.sh

输入对应的停止服务命令,如下。


ip route del 10.0.0.151 dev TTTTT || true

ip route del 10.0.0.152 dev TTTTT || true

ip route del 10.0.0.153 dev TTTTT || true

ip link set TTTTT down || true

ip addr del 11.0.0.160 dev TTTTT || true

ip link del TTTTT || true


同样操作,保存脚本。

群晖DSM7实现Docker的macvlan插图19

这样就配置好了启动和停止脚本。

以后只要 macvlan.service 在运行中,就会检测 docker 服务运行状态。当 docker 服务启动完成后,macvlan.service 服务会执行 start 脚本。当 docker 服务关闭后,macvlan.service 服务会执行 stop 脚本。


然后我们重新加载一下 systemd 服务

执行

systemctl daemon-reload

群晖DSM7实现Docker的macvlan插图20

这样 macvlan.service 服务已经在 systemd 服务列表中了。

最后执行

systemctl enable macvlan

开启 macvlan.service 服务开机启动,这样就 OK 啦。

如果想取消开机自启动,执行

systemctl disable macvlan

即可

同时可以用


systemctl start macvlan

systemctl stop macvlan

systemctl status macvlan


这三个命令,分别为立即启动服务、立即停止服务、查看服务运行状态。

为了验证一下自启动是否成功。

我们重启群晖测试。

群晖DSM7实现Docker的macvlan插图21

开机后输入

systemctl status macvlan

查看 macvlan.service 服务运行状态

群晖DSM7实现Docker的macvlan插图22

服务运行正常

直接 ping 容器 IP 测试

群晖DSM7实现Docker的macvlan插图23

完美 ping 通。

说明开机执行脚本成功,完美。

如果大家有新增的 macvlan 容器,或者需要修改自动执行的命令。

以后只需要修改

/usr/local/bin/macvlan_start.sh

/usr/local/bin/macvlan_stop.sh

这俩个脚本即可

原文链接:https://blog.csdn.net/vistaup/article/details/125783806?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167586359916782425669948%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=167586359916782425669948&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-29-125783806-null-null.blog_rank_default&utm_term=% E9% BB%91% E7% BE% A4% E6%99%96%2C% E7% BE% A4% E6%99%96%2Cnas%2C% E8%9C%97% E7%89%9B% E6%98%9F% E9%99%85%2CDSM% EF% BC%8C% E5%86%85% E7% BD%91% E7% A9% BF% E9%80%8F%2Cipv6%2C% E8% BF%9C% E7% A8%8B% E8% AE% BF% E9%97% AE%2Cwordpress% EF% BC%8C% E5% BB% BA% E7% AB%99%2C% E9%98% BF% E9%87%8C% E4% BA%91%2C% E8%85% BE% E8% AE% AF% E4% BA%91%2C% E5%9F%9F% E5%90%8D%2C% E4% BA%91% E6%9C%8D% E5%8A% A1% E5%99% A8%2C

上一篇
下一篇