参考,感谢作者的分享:

让 QB/TR 拥有独立 ip,使用 macvlan 网络创建 docker 容器

IPv6 Docker 跑 BT 的方案和问题

背景

出于某些特殊的原因,想给一些容器独立的 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
  1. 网卡 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
  1. 32.xx 为希望固定的 ip

  2. 从参考文章里得知,因为 qBittorrent 启动得“太快”了,以至于网络接口还没来得及配置好 IPv6,会导致启动后无法获取 v6 公网的情况。所以在创建 qb 的时候,对启动做延迟处理,在启动文件里增加 sleep 5,并且为了确保每次重启不会叠加这行代码,在添加前增加一个判断(详见上述代码中 entrypoint 内配置内容)。

三、容器间互访问题

macvlan 具有隔离特性!!!

所以上面所创建的 macvlan 容器是无法与其他 docker 容器或者 nas 本身进行通信的,比如你的同个宿主机内的容器无法访问这个 qb,要实现互访有两种方案:

  1. 方案一:简单粗暴,就是把你需要互访的容器都部署到同一个 vlan 下,前提是你只需要他们之间互访,不需要与其他容器互访。

  2. 方案二:通过虚拟网桥来实现与宿主机之间的互通,并且要设置开机自启。

下面具体说下方案二的步骤:

  1. 创建网桥

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

  1. 创建 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

保存并退出。

  1. 启用并启用 systemd 服务:  

systemctl daemon-reload
systemctl enable setup-network.service

  1. 可以 reboot 后使用以下命令查看网桥是否自动创建:

ip link show