群晖使用macvlan为虚拟机分配独立IP

  1. 启用Open vSwitch 。路径:控制面板-网络-网络界面-管理-Open vSwitch 设置
  2. ssh登录,ip addr 查看ovs_开头的IP,如ovs_eth0,如果存在可以确认开通成功
  3. 创建网络
docker network create -d macvlan --subnet=192.168.123.0/24 --ip-range=192.168.123.48/28 --gateway=192.168.123.1 -o parent=ovs_eth1 macv

创建容器

#通过macvlan 启动docker,使用命令行可以指定IP,可视化界面中可以选择网络但是无法指定IP,下次启动时可能会变,所以还是通过命令行指定为好
docker run -d --name=nginx-1 --net=macv --ip=192.168.123.49 -v /volume1/docker/nginx:/etc/nginx/conf.d nginx:latest

启动容器后,macvlan可以和局域网内的其他机器互相访问,但是就是无法访问宿主机,这个时候需要执行如下命令:

## vi /usr/local/bin/macvlan_start.sh
# 创建一个名称为macv_bridge的网桥
ip link add macv_bridge link ovs_eth1 type macvlan mode bridge
# 给macv_bridge指定一个IP
ip addr add 192.168.123.47 dev macv_bridge
# 启动 macv_bridge
ip link set macv_bridge up
# 创建路由连接子网
ip route add 192.168.123.48/28 dev macv_bridge

如果要恢复网络需要执行相反的命令:

## vi /usr/local/bin/macvlan_stop.sh
# 删除路由
ip route del 192.168.123.48/28 dev macv_bridge || true
# 停用网桥
ip link set macv_bridge down || true
# 删除网桥IP
ip addr del 192.168.123.47/32 dev macv_bridge || true
# 删除网桥
ip link del macv_bridge || true
# 以上两个文件加执行权限
chmod +x /usr/local/bin/macvlan_start.sh
chmod +x /usr/local/bin/macvlan_stop.sh

想要每次开机自动执行,需要编辑成一个服务:

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

[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
systemctl daemon-reload
# 设置服务自动启动
systemctl enable macvlan

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