Macvlan

使用macvlan网络模式创建docker,使容器拥有独立ip,便于分流适用场景;或者支持 IPv6;

家里主路由网关是192.168.31.1,旁路由网关是192.168.31.3,因nas需要科学环境比如拉docker镜像、刮削等等,如何做到单独让qb、tr不走科学网络?常见的方法是使用旁路由的分流规则,比如openclash、passwall等或者爱快主路由上根据协议、域名分流等等,但是这种方法还是难免有一些流量偷走科学流量,如果docker容器可以有独立的ip,单独设置网关是最保险的措施。

  1. 查看网卡名称,使用 ifconfig 命令:

  2. 主路由的 ipv6 模式改成无状态模式或者叫 SLAAC,这样子可以保证 ipv6 地址前缀变化时容器跟着变化!

命令

创建macvlan命令:

docker network create \
  -d macvlan \
  --subnet=192.168.31.0/24 --gateway=192.168.31.3 \
  --ipv6 --subnet=fd00::/64 \
  -o parent=ens7 \
  macnet
  • --subnet 家里V4子网网段

  • --gateway 家里V4不走科学环境的网关

  • --ipv6 --subnet 家里V6子网网段,这是个内网段,创建容器时会向父网卡dhcp获取真实ip。如果要指定,增加: --subnet=fd0d:7eb5:2afd::/64--gateway=fd0d:7eb5:2afd::1 。第二组 --subnet 和 --gateway 是为 IPv6 配置的 ULA 网段,根据上面的内容,这部分是私有网段,与宿主机的 IP 设置和路由器设置无关,不会用于公网通信,因此可以自行设置。容器会自动从上级路由获取公网 IPv6 地址。

  • -o parent 指定了出口网卡,需要通过 ifconfig 或 ip a 命令查看实际的出口网卡,还可能是 en0eth0 等等,务必修改为正确的网卡。

  • macnet 这个随意,就是macvlan网络的网卡名称

创建容器命令:

docker run --name qbittorrent \
  --network macnet \
  -v /vol1/1000/docker/qb:/config \
  -v /vol2/1000/download:/downloads \
  --ip=192.168.31.29 \
  --restart=always \
  --privileged=true -d \
  linuxserver/qbittorrent:4.6.5

容器不需要额外配置ipv6地址,会自动获取

命令注释:

  • --name容器名称,随意就好,通过这个名字可以分辨哪些容器就行

  • --net=macnet macnet是上一步创建的macvlan网卡名称

  • --ip=192.168.31.29 ip地址根据实际情况更改

  • Macvlan 模式下无需配置端口映射。

Compose:

version: '3'
services:
  qbittorrent:
    image: lscr.io/linuxserver/qbittorrent:latest
    container_name: qbittorrent
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - WEBUI_PORT=8080
    volumes:
      - /path/to/appdata/config:/config
      - /path/to/downloads:/downloads
    restart: unless-stopped
    networks: # 指定网络
      bridge-host:
        ipv4_address: 192.168.31.202
    dns:  #可选,指定 dns 服务器
      - 223.5.5.5
      - 119.29.29.29
      - "2400:3200::1"
      - "2402:4e00::"

networks:
    bridge-host: # 引用之前创建的外部网络
      external: true

至此,docker 应该可以顺利使用 IPv6 网络了,可以进入容器内部通过 ifconfig 或 ip a 命令查看网络配置是否正常。