前言
有时我们有出于各种情况需要把某一个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