关于我
~一个热爱火影的业余小提琴玩家~
Joynaruto

Docker网络之Macvlan

前言

继上次整了Plex上挂载阿里云之后 8-)


发现Plex经常连不上,以至于降级到缓慢的间接连接。一看后台发现了问题:由于我的NAS是在科学下的,而我的Plex用的是NAS的ip+端口的形式进行访问,这就导致DDNS变成科学解析了。正巧看到eSir这个视频,讲的非常棒!于是乎想到如果Plex能拥有一个独立的IP地址,那就能在OpenWrt下对其单独配置。

2023-05-13更新:最近突然发现Plex时不时被阻断,每次登录都要等很久,初步怀疑是我将Plex.tv设置为不走代理。果不其然,在我将Plex.tv拿出白名单后,登陆瞬间恢复。然而紧接着就是Plex检测到我的代理地址了,远程访问又变成了难题。上次其实偷了个懒,直接把Plex.tv放进白名单完事儿,没细查他检测IP的那个域名,这次通过抓包发现Plex真正检测IP的域名是v4.plex.tv,尝试让他强制走代理,瞬间成功!登录+远程终于再次达成 ;-) 

Macvlan的概念及作用

什么是Macvlan

引用Macvlan的官方文档

Use macvlan networks
Some applications, especially legacy applications or applications which monitor network traffic, expect to be directly connected to the physical network. In this type of situation, you can use the macvlan network driver to assign a MAC address to each container’s virtual network interface, making it appear to be a physical network interface directly connected to the physical network. In this case, you need to designate a physical interface on your Docker host to use for the macvlan, as well as the subnet and gateway of the macvlan. You can even isolate your macvlan networks using different physical network interfaces. Keep the following things in mind:

It is very easy to unintentionally damage your network due to IP address exhaustion or to “VLAN spread”, which is a situation in which you have an inappropriately large number of unique MAC addresses in your network.

Your networking equipment needs to be able to handle “promiscuous mode”, where one physical interface can be assigned multiple MAC addresses.

If your application can work using a bridge (on a single Docker host) or overlay (to communicate across multiple Docker hosts), these solutions may be better in the long term.

Macvlan的好处

总的来说Macvlan有两个好处:
其一是少了一层容器内到服务器网络层的NAT损失,减少了服务器资源的占用并加快了网络速度;
其二就是能够让容器有个独立的IP地址,方便对其进行单独配置。

配置Macvlan

OpenWrt下使用DockerMan

不得不说DockerMan真的非常好用,首先驱动那栏选Macvlan,然后配置下自己的子网和网关即可。具体参照下图配置

群晖下配置

Macvlan在群晖下不能通过GUI点选创建,需要通过SSH连接后台进行创建

#新建macvlan网络
docker network create -d macvlan -o parent=【eth0】【eNet】\
--subnet=【Network IP】\
--gateway=【Gateway IP】
#一个例子
docker network create -d macvlan -o parent=ovs_eth0  ml \
--subnet=192.168.2.0/24 \
--gateway=192.168.2.233

完成配置后输入docker network ls即可看到刚新创建的Macvlan网络,当然也可以在GUI中查看

使用Macvlan创建容器

在创建完Macvlan网络后就可以让容器使用Macvlan来获取独立于宿主机的IP地址了。举几个例子:

Plex

docker run -d \
  --name=plex \
  --network=ml \       //使用刚创建的ml
  --ip=192.168.2.xx \  //指定容器的ip
  -e PUID=1024 \
  -e PGID=100 \
  -e VERSION=docker \
  -v /volume2/docker/plex/config:/config \
  -v /volume2/docker/plex/data/tv:/tv \
  -v /volume2/docker/plex/data/movies:/movies \
  --device=/dev/dri/renderD128 \    //开启硬解
  --restart unless-stopped \
  linuxserver/plex:latest

qBittorrent

docker run -d \
  --name=qb \
  -e PUID=1024 \
  -e PGID=100 \
  -e TZ=Asia/Shanghai \
  -e WEBUI_PORT=8080 \
  --network ml \        //使用刚创建的ml
  --ip=192.168.2.xx \   //指定容器的ip
  -v /volume2/docker/qb/config:/config \
  -v /volume2/Download/qb:/downloads \
  --restart unless-stopped \
  linuxserver/qbittorrent:latest

Heimdall

docker run -d \
  --name=heimdall \
  --network ml \        //使用刚创建的ml
  --ip=192.168.2.xx \   //指定容器的ip
  -e PUID=1024 \
  -e PGID=100 \
  -e TZ=Asia/Shanghai \
  -v /volume2/docker/heimdall:/config \
  --restart unless-stopped \
  linuxserver/heimdall:latest

解除一些限制(可选)

通过上述操作已经可以很舒服的给容器分配独立的IP地址,但会发现一个问题,那就是虽然这些容器可以和局域网内其他的设备或者在他们之间通信,但是却无法与宿主机通信。其实这是Macvlan的一个安全机制,按照下面方法即可绕过该限制

#创建一个新的macvlan网络
ip link add mll link ovs_eth0 type macvlan mode bridge
#给新创建的macvlan一个地址
ip addr add 192.168.2.35 dev mll
#启动网络
ip link set mll up
#让容器通过新创建的macvlan网络
ip route add 192.168.2.31 dev mll
#测试下是否能正常通信
ping x.x.x.x
#如果正常就加入开机脚本完成固化
/etc/rc.local

最后

在配置了Macvlan后,Plex再也没有断联过。容器们有了独立的IP地址之后管理起来真心方便很多,再次感谢eSir的视频!

不过在docker-compose中如何引入Macvlan参数我还没整明白,如果看到此文的你知道如何在的中配置Macvlan的话,麻烦在下面留言哦 :oops: 

发表回复

textsms
account_circle
email

Joynaruto

Docker网络之Macvlan
前言 继上次整了Plex上挂载阿里云之后 8-) 发现Plex经常连不上,以至于降级到缓慢的间接连接。一看后台发现了问题:由于我的NAS是在科学下的,而我的Plex用的是NAS的ip+端口的形式…
扫描二维码继续阅读
2022-05-04