使用macvlan或ipvlan为容器创建独立ip
参考,感谢作者的分享:

背景
出于某些特殊的原因,想给一些容器独立的ip,再利用主路由的黑名单对其进行一些访问限制,查到可以利用macvlan或ipvlan来处理此类需求,经过几天时间反复尝试以及朋友的指导,终于圆满达成目的。
笔者这里用飞牛os来做演示和讲解,下面是具体步骤:
一、创建macvlan网络
docker network create -d macvlan --subnet=192.168.32.0/24 --gateway=192.168.32.1 -o parent=网卡id --ipv6 --subnet=fd00:1111:2222:3333::/64 --gateway=fd00:1111:2222:3333::1 br_macvlan网卡id可以通过ifconfig查询,或者在飞牛设置页面查到
2. 不用设置ip段,因为我们在创建容器时候可以固定ip
二、创建容器,这里以qb为例
version: "3.8"
services:
qbittorrent:
image: linuxserver/qbittorrent:latest
container_name: qbittorrent
ports:
- 8080:8080
environment:
- PUID=0
- PGID=0
- TZ=Asia/Shanghai
- WEBUI_PORT=8080
- TORRENTING_PORT=12345
volumes:
- ./config:/config
- 下载目录原始路径:/downloads
restart: always
entrypoint:
- sh
- -c
- grep -q '^sleep 5$' /init || sed -i '2i sleep 5' /init && exec /init
#network_mode: host
networks:
br_macvlan:
ipv4_address: 192.168.32.xx
networks:
br_macvlan:
external: true32.xx为希望固定的ip
从参考文章里得知,因为qBittorrent 启动得“太快”了,以至于网络接口还没来得及配置好 IPv6,会导致启动后无法获取v6公网的情况。所以在创建qb的时候,对启动做延迟处理,在启动文件里增加sleep 5,并且为了确保每次重启不会叠加这行代码,在添加前增加一个判断(详见上述代码中entrypoint内配置内容)。
三、容器间互访问题
macvlan具有隔离特性!!!
所以上面所创建的macvlan容器是无法与其他docker容器或者nas本身进行通信的,比如你的同个宿主机内的容器无法访问这个qb,要实现互访有两种方案:
方案一:简单粗暴,就是把你需要互访的容器都部署到同一个vlan下,前提是你只需要他们之间互访,不需要与其他容器互访。
方案二:通过虚拟网桥来实现与宿主机之间的互通,并且要设置开机自启。
下面具体说下方案二的步骤:
创建网桥
ssh到飞牛,sudo -i到root
nano /usr/local/bin/setup_network.sh写入:
#!/bin/bash
# 创建 macvlan 网卡,vlan_bridge可自定义
ip link add vlan_bridge link 网卡id type macvlan mode bridge
# 配置 IP 地址,手动填一个子网中未用过的 IP
ip addr add 192.168.32.yy dev vlan_bridge
# 启动 macvlan 网卡
ip link set vlan_bridge up
# 添加路由,目标 Docker 的 IP
ip route add 192.168.32.xx dev vlan_bridge保存并退出。
添加权限:
chmod +x /usr/local/bin/setup_network.sh创建systemd服务单元:
nano /etc/systemd/system/setup-network.service输入:
[Unit]
Description=Setup Network for macvlan
After=network.target
[Service]
ExecStart=/usr/local/bin/setup_network.sh
Type=oneshot
RemainAfterExit=true
[Install]
WantedBy=multi-user.target保存并退出。
启用并启用systemd服务:
systemctl daemon-reload
systemctl enable setup-network.service可以reboot后使用以下命令查看网桥是否自动创建:
ip link show
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 老鬼迪克
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果