
使用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: true
-
32.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 协议,完整转载请注明来自 老鬼迪克
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果