如何优雅地使用 Docker 搭建个人订阅转换

如何优雅地使用 Docker 搭建个人订阅转换

写在前面

使用订阅代理时,商家提供的 Clash 配置非常混乱。虽说不是不能用,但体验确实差了点。而且,为了各个设备能同步使用自定义规则,就只能上订阅转换啦。而为了安全性,还是本地搭建一个比较合适。

虽然标题写着优雅,但摸索过程着实有些狼狈。但是,折腾嘛。

正文开始

思路很简单:

  1. 通过 Github 提供的 Gits 来保存远程配置(其实任何 Git 仓库也可以,只要能直链下载源文件)
  2. 远程配置使用 ACL 4 SSR 提供的规则模板 + 个人定制规则
  3. 本地搭建 subconvert 进行订阅转换
  4. Clash 订阅

思路主要是参考了: 如何优雅地为 Clash 添加自定义代理规则?这是你要看的最后一篇教程 - V2EX

远程配置

这一步其实是最简单的,可以直接按照文章里的方法构建远程配置。

这里再分享一下我的远程配置,和文章里的略有不同,可以借鉴参照(直接拿去)

搭建 subconvert

我使用的是 Docker 方式,踩了不少坑,属于是为了折腾而折腾了。

按踩坑填坑的时间顺序一一道来,不想了解的可以直接从“填坑”看起。

Github 访问的问题

众所周知,Github 的访问是非常不稳定的。而订阅转换时 subconvert 要先下载存在 Github 上的远程配置,然后再解析远程配置,下载配置中给出的各种规则(也在 Github 上)。如果没有代理,这个转换过程很可能失败,或者耗时过长。

其实我最早就是直接搭建在云服务器上,最后因为无法访问 Github 而以失败告终。虽然可以在云服务器也开启代理,但我觉得比较麻烦,而且也还会碰到下一个“坑”。
此外,将此订阅转换服务直接暴露到公网可能会引起很多恶意的请求,严重时可能造成损失。

所以,我在 MBP 上跑起了 subconvert 容器。

Docker 容器代理的问题

Docker 容器运自然是不会主动使用代理的。如果不用 Docker 部署自然没有这个问题,但我头铁我就要🫤

查找资料后,我理清了如何为 Docker 容器设置代理:传入环境变量。

然后我就傻傻的传入 http_proxy= http://127.0.0.1:7890https_proxy=http://127.0.0.1:7890

不出意外地失败了。Docker 容器运行在隔离的网络空间中,不能直接使用宿主的网络空间,自然不能直接访问宿主上的代理服务。

再次查阅资料后,了解到 Docker 容器默认是以桥接的方式连接到宿主的网络。可以通过参数 --net=host 让容器使用宿主的网络空间。但这样宿主和容器共用同样的网络空间,有可能出现端口冲突等问题。

为了将优雅贯彻到底,我还是决定使用桥接方式。啥叫桥接?就是用网桥连接。数据链路层设备共享广播域,我只要把 127.0.0.1 改成宿主的内网 ip 就可以了。但这又延伸出一个问题,宿主的内网 ip 是有可能变动的,而且每次查询、修改也不方便。

再再次查阅资料后,我终于找到了解决容器代理问题的最终答案:

host.docker.internal 是 Docker 提供的特殊 DNS 名称,用于映射到宿主机的 IP 地址。

为此,我特意总结了一下如何正确地为Docker容器设置代理

填坑

由于是本地个人部署,我使用 Docker 配置文件来设置代理相关环境变量。

~/.docker/config.json 文件:

1
2
3
4
5
6
7
8
9
{
"proxies": {
"default": {
"httpProxy": "http://host.docker.internal:7890",
"httpsProxy": "http://host.docker.internal:7890",
"noProxy": "localhost,127.0.0.1"
}
}
}

启动容器:

1
2
3
4
5
docker run \
-d --restart=always \
-p 25500:25500 \
--name="subconverter" \
tindy2013/subconverter:latest

订阅

转换后订阅链接:

1
2
3
4
5
# 格式
http://127.0.0.1:25500/sub?target=clash&url=<URL编码后的订阅链接>&config=<URL编码后的配置文件链接>

# 我的配置
http://127.0.0.1:25500/sub?target=clash&url=<URL编码后的订阅链接>&config=https%3A%2F%2Fgist.githubusercontent.com%2FAkiChase%2F4d419fb56d0de67ef68f406438a9e27e%2Fraw%2FSub-ClashRule.ini

将转换后的订阅链接在 Clash 中导入即可。

提示

同局域网的设备订阅时要将 http://127.0.0.1:25500 改成 http://内网ip地址:25500

对于本地搭建的 subconverter,除非你准备一直运行这个容器,否则应当关闭订阅的自动更新

最后

踩坑的过程虽然痛苦,但这也让我彻底理解了如何让容器访问宿主网络。

关于 Docker 知识增加了~

希望这篇文章能帮助你优雅地使用 Docker 搭建个人订阅转换。

   Vector Landscape Vectors by Vecteezy
作者

AkiChase

发布于

2024-01-07

更新于

2024-01-11

许可协议