整理时间:2025年4月1日
一、背景
对于需要多线路管理的用户,将Docker容器按需分配到国内外线路可提升效率并节省流量。例如,百度网盘、迅雷/P2P 下载等国内服务直连本地网关;而部分容器需通过软路由访问国际资源。本文基于飞牛OS系统,分享如何通过自定义Docker网络实现线路分离,并解决Fake-IP 网络环境下容器DNS错误导致的断网问题。
本教程最适合于已经将飞牛 OS 的网关和 DNS 指向软路由的用户。
二、环境准备
-
系统版本:飞牛OS(Docker服务已启用)
-
网络拓扑:
- 主路由:本地网关(如
192.168.1.1
)
- 软路由:国际线路网关(如
192.168.1.210
)
-
工具需求:SSH访问权限或终端工具
三、实现思路:
- 默认将飞牛 OS 宿主机网关和 DNS 指向软路由(简略);
- 新建 macvlan 网络实现容器网络定向指向硬路由,不经过软路由;
- 再配置容器 DNS 映射修复联网问题。
(本文的重点在2和3,理论上环境反过来也可以,但笔者习惯使用的官方 docker 源需要代/理,且下载容器通过 macvlan 而非bridge 直接指向硬路由会有更好的性能。)
四、实现步骤
1. 将飞牛 OS 宿主机网关和 DNS 指向软路由(简略)
在飞牛 OS 操作界面,打开系统设置--网络设置--网口编辑,手动设置地址并将网关地址设置为软路由地址,这里是 192.168.1.210
,DNS 根据你的软路由情况设置,我使用的是 Fake-IP,这里设置为 198.18.0.2
。
这一步一般来说为了宿主机能够连接外网,是你早就根据其他需求提前设置好的。如对设置不懂或没有外网连接需求也没必要这么设置,也不用往下看了。软路由相关设置不做分享。
2、新建 macvlan 网络实现容器网络定向指向硬路由,不经过软路由
通过 SSH 工具连接飞牛,输入以下命令查看和确认已经存在的docker网络:
docker network ls
创建 macvlan:
通过第1步的网络设置查看网口名称,我这里是 enp1s0
。
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 --ipv6 --subnet=fd00::/64 -o parent=enp1s0 china
解释:Docker Network 创建一个 macvlan 接口,v4子网地址 192.168.1.0/24,v6子网地址 fd00::/64 ,网关地址 192.168.1.1 ,网络接口 enp1s0 macvlan ,接口名称 china。
创建容器时,选择 bridge 对应国外网络环境 ,选择 China 对应国内网络环境,需要注意的是由于目前飞牛 OS 不支持界面配置 macvlan 下容器的 IP 地址,所以需要通过 SSH 创建容器。
3、配置容器 DNS 映射修复联网问题
软路由为 Fake-IP 网络环境可能会因为 DNS 导致网络类型为 china 的容器无法访问互联网。在任意目录,比如 /vol1/1000/myappdata/network/resolv.conf 里新建一个文本文件 resolv.conf,内容为 nameserver 223.5.5.5
之后在容器中映射路径容器路径: /etc/resolv.conf 到主机路径: /vol1/1000/myappdata/network/resolv.conf 即可。
五、举例说明-迅雷
通过 SSH 工具连接飞牛,输入以下命令创建迅雷 docker,实现通过 macvlan 网络,不经过宿主机 bridge 网桥,直连国内网络:
docker run -d \
--name xunlei \
--network china \
--ip 192.168.1.20 \
--privileged \
-v /vol1/1000/myappdata/xunlei:/xunlei/data \
-v /vol2/1000/download:/xunlei/downloads \
-v /vol1/1000/myappdata/network/resolv.conf:/etc/resolv.conf \
-e XL_DASHBOARD_USERNAME=admin \
-e XL_DASHBOARD_PASSWORD=12345678 \
cnk3x/xunlei
解释:
-d
以“后台模式”(detached mode)运行容器;
--name xunlei
为容器指定名称 xunlei
;
--network china
指定容器加入名为 china
的自定义 Docker 网络;
--ip 192.168.1.20
为容器分配固定 IP 192.168.1.20
;
--privileged
赋予容器“特权模式”;
-v /vol1/1000/myappdata/xunlei:/xunlei/data
将宿主机的 /vol1/1000/myappdata/xunlei
目录挂载到容器的 /xunlei/data
,保存配置文件;
-v /vol2/1000/download:/xunlei/downloads
将宿主机的下载目录 /vol2/1000/download
挂载到容器的 /xunlei/downloads
,保存下载文件;
-v /vol1/1000/myappdata/network/resolv.conf:/etc/resolv.conf
覆盖容器内的 DNS 配置文件 /etc/resolv.conf
,自定析规则;
-e XL_DASHBOARD_USERNAME=admin
和 -e XL_DASHBOARD_PASSWORD=12345678
设置容器内环境变量,用于配置迅雷 Web 控制台的登录用户名和密码。
cnk3x/xunlei
** 使用的迅雷镜像。
通过以上设置,可实现Docker容器国内外网络指向的精细化控制,同时提升网络稳定性。欢迎留言讨论优化方案。