群晖Docker容器设置独立IP MACVLAN

前言

有时我们有出于各种情况需要把某一个docker容器在网络上与宿主机做隔离,以方便管理。macvlan网络模式就可以很好的帮我们解决这个问题。macVLAN可以理解为设置此网络模式下的docker容器为局域网一个独立服务器,拥有一个独立IP,这们我们依赖网络管理容器时就能帮我们解决问题,比如常见的根据IP限速、分流等等。博主所用的机型为群晖DS920+,仅供参考。

群晖设置

Open vSwitch就是虚拟交换机,可以这样理解,docker容器连接这个虚拟交换机就相当于一个网络接入点,只是这个接入点用来把docker容器接入到局域网,而不走宿主机网络。
打开Open vSwitch开关以后,使用终端工具进入ssh控制台。输入以下命令查看网络配置并确认Open vSwitch是否打开。

图中列出了NAS的所有网卡,其中有两个带有”ovs”开头的ovs_eth0、ovs_eth1两个网口,说明NAS的两个物理网口已经开启了虚拟交换机功能。这两个网口就是开启了Open vSwitch以后的接入网口。
选择要建立macvlan网络的接口,这里应该选择你接入局域网的接口来建立创建docker的macvlan网络。比如群晖有两个接口,我只使用一根网络接入了ovs_eth1口,LAN IP地址为10.10.10.100。另一个口没有插网线所以就选择那个网络接口设置Macvlan网络接口。

创建macvlan模式docker网络

然后就是添加macvlan网络。
我这里内网网段是 10.10.10.0/24 ,路由器IP(网关)是10.10.10.1 。
创建仅IPV4的macVLAN网络命令。

				
					docker network create -d macvlan --subnet=10.10.10.0/24 --gateway=10.10.10.1 -o parent=ovs_eth0 name 
				
			

ipv4&ipv6双栈。

				
					docker network create -d macvlan --subnet=10.101.0.0/24 --gateway=10.10.10.1 --ipv6 --subnet=2408:8214:7219:a8d0::/60 --gateway=2408:8214:7219:a8d0::/1  -o parent=ovs_eth0 name
				
			

命令解释。

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

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

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

--ipv6 
#启用ipv6支持

--subnet=2408:8214:7219:a8d0::/60 
#macvlan的ipv6前缀

--gateway=2408:8214:7219:a8d0::/1 
#macvlan的ipv6网关

-o parent=ovs_eth1 
#接入点是ovs_eth1接口。

name 
#macvlan网络的名称(可随意)
				
			

创建容器

MacVLAN网络创建成功以后,我们就可以使用它来创建容器了,比如我创建一个qbittorrent容器。

				
					docker run -d --name=qB --net=PT --ip=10.10.10.50 -v /volume1/docker/qB/config1:/config --privileged=true --restart=always linuxserver/qbittorrent:latest
				
			

PT网络名,–ip=10.10.10.150为指定容器的IP。

使用MacVLAN网络建立的qb容器,用户里已经连接上了Ipv4和Ipv6网络。

与宿主机通讯

但是,还没有完,因为macVLAN模式设计的时候为了安全而禁止了宿主机和容器直接通信,其他主机没有影响,这样我们在宿主机部署一个程序,然后使用macvlan网络部署一个容器时,宿主机的程序就不能通过网络访问macVLAN下的容器。如果想要实现互通,有个曲线救国的方法,就是macvlan与macVLAN之间可以互通,只需要在宿主机再创建一个macVLAN网络,然后修改路由,让数据经过这个macVLAN达到互通的目的。

				
					ip link add macvlan link ovs_eth1 type macvlan mode bridge
#创建一个名为macvlan的macvlan接口
ip addr add 10.10.10.123 dev macvlan
#设置macvlan接口的IP为10.10.10.123
ip link set macvlan up
#启动ABC接口
ip route add 10.10.10.50 dev macvlan
#让IP10.10.10.50的流量经过macvlan接口到宿主机。
				
			

如果宿主机需要与多个MacVLAN容器通过网络连接,只需多增加“IP route add 10.10.10.50 dev macvlan”(IP更改为要连接的容器IP)命令即可。

● 自动配置

接下来还没有完,那就是上面macVLAN网络模式下容器与宿主机互通的相关配置,默认情况下重启后会重置,每次重启后就要重新执行一遍。手动输入就是相当于大残废功能,食之无味,弃之可惜。所以需要打造自动化,就是把命令配置为服务来实现开机自动添加。

● 创建服务

我们先创建一个新的Systemd服务,取名 Macvlan.Service,进入SSH执行。

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

按“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
				
			

然后按 esc 键入 :wq 保存修改。
然后再编写两个脚本,一个用于开机启动时添加MacVLAN网络,一个用于关机时删除MacVLAN网络。

● 开机自动配置脚本

创建开机脚本。

				
					vi /usr/local/bin/macvlan_start.sh
				
			

同样“i”键进入编辑模式。

				
					
ip link add macvla link ovs_eth1 type macvlan mode bridge

ip addr add 10.10.10.123 dev macvla

ip link set macvla up

ip route add 10.10.10.50 dev macvla
				
			

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

● 关机取消配置脚本

创建关机取消脚本。

				
					vi /usr/local/bin/macvlan_stop.sh
				
			

同样“i”键进入编辑模式。

				
					ip route del 10.10.10.50 dev macvla || true

ip link set macvla down || true

ip addr del 10.10.10.123 dev macvla || true

ip link del macvla || true
				
			

这样就配置好了启动和停止脚本。以后只要macvlan.service在运行中,就会检测docker服务运行状态。当docker服务启动完成后,macvlan.service服务会执行start脚本。当Docker服务关闭后,macvlan.service服务会执行stop脚本。
然后我们重新加载一下systemd服务。

				
					systemctl daemon-reload
				
			

管理服务

开启macvlan.service服务开机启动。

				
					systemctl enable macvlan

				
			

如果想取消开机自启动。

				
					systemctl disable macvlan
				
			

启动服务。

				
					systemctl start macvlan
				
			

停止服务。

				
					systemctl stop macvlan
				
			

查看服务运行状态。

				
					systemctl status macvlan
				
			
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
最旧
最新 最多投票
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论!x