容器部署sub2api,多实例隔离

Sub2api 本身是一个订阅转换与代理池管理工具,常见的单实例部署能跑通,但你会发现所有用户共用一个后端、一套机场订阅、一个 IP 池。
当你希望不同分组使用不同代理节点、不同订阅来源,或者要给不同客户隔离流量时,就需要用 Docker 把 Sub2api 拆成多个实例,每个实例挂独立的数据目录和代理池配置。
这篇文章直接给出可复制的多实例部署方案,包含从准备目录到验证隔离效果的完整过程,跟着做就能完成多开部署。

部署前需要确认的三件事

动手前先确认服务器已经装好 Docker 和 Docker Compose。
可以用下面命令快速检查:

docker --version
docker compose version

如果提示找不到命令,先安装 Docker,建议使用官方安装脚本,这里不赘述。

另外规划好端口和目录。
例如要跑两个实例,就分配 81008200 两个端口,并准备两个完全独立的目录,避免它们读写同一个数据库或配置文件。

最后确认你的机场订阅链接或自有代理池信息已经准备好。
Sub2api 的代理池通常通过配置文件或后台导入,不同实例之间要使用不同的订阅组名,否则即使容器分开了,代理节点还会互相串。

用 Docker Compose 搭建两套独立 Sub2api 实例

最推荐的方式不是直接写两份 docker run,而是用一个 Compose 文件同时定义两个 service,每个 service 有自己的挂载目录。

先创建目录结构:

mkdir -p /opt/sub2api/{instance1,instance2}/data

然后新建 /opt/sub2api/docker-compose.yml

version: "3"

services:
  sub2api-1:
    image: your/sub2api-image:latest
    container_name: sub2api-1
    restart: always
    ports:
      - "8100:8100"
    volumes:
      - ./instance1/data:/app/data
    environment:
      - TZ=Asia/Shanghai
      - INSTANCE_NAME=instance1

  sub2api-2:
    image: your/sub2api-image:latest
    container_name: sub2api-2
    restart: always
    ports:
      - "8200:8200"
    volumes:
      - ./instance2/data:/app/data
    environment:
      - TZ=Asia/Shanghai
      - INSTANCE_NAME=instance2
注意:your/sub2api-image:latest 需要替换成你实际使用的镜像地址。如果官方镜像默认端口不是 8100,请改成镜像内部实际监听端口,避免映射后打不开。

保存后启动:

cd /opt/sub2api
docker compose up -d

查看两个容器是否都在运行:

docker compose ps

正常情况下应该有两个容器,端口分别是 8100->81008200->8200

给每个实例配置独立的代理池

容器只是隔离了进程和文件,真正的“代理池隔离”需要靠每个实例自己的数据目录和后台配置。

进入实例 1 的后台,地址是 http://服务器IP:8100,完成初始化后,在代理池或订阅管理页面导入第一组机场订阅,并给这组订阅起一个唯一名字,例如 pool-a

实例 2 则访问 http://服务器IP:8200,同样初始化后,导入第二组机场订阅或自己的节点列表,命名为 pool-b

此时两个实例虽然共用同一个 Docker 宿主,但数据目录已经分开,配置不会互相写入。
如果你看到 instance1/data 里生成的文件在 instance2/data 里也同时出现,说明你用了同一个目录或同一个外部数据库,这是最常见的隔离失效原因。

验证隔离效果的正确方法

不要只看容器在运行就判断成功,建议按下面步骤逐项验证:

  1. 分别请求两个实例的健康检查地址或首页,确认返回值不同。若是 API,可以调用 /version/status 查看实例标识。
  2. 在实例 1 中删除一个代理节点,刷新实例 2 的节点列表,确认实例 2 不受影响。
  3. 查看两个容器挂载目录的内容是否各自独立:
ls -l /opt/sub2api/instance1/data
ls -l /opt/sub2api/instance2/data

如果两边文件内容完全一样,说明你挂载卷写错了,请检查 compose 文件里 volumes 的路径。

  1. 从不同网络环境分别连接两个实例生成的订阅地址,确认互不干扰。最直接的方法是让实例 1 的订阅连不通境外网络时,实例 2 仍然能正常更新节点。例如把实例 1 的订阅暂时停掉,实例 2 的订阅照常拉取成功,就能证明代理池隔离已生效。

几个必须避开的坑

端口冲突:两个实例不能用同一个宿主端口。
如果启动报 address already in use,改成不同端口并重新 docker compose up -d

容器重启后配置丢失:很多人喜欢用 docker run 并只映射端口,没有映射数据目录。
Sub2api 的配置数据如果写在容器内部,容器重建后就会丢,务必像上文一样挂载 data 目录。

代理池被覆盖:如果两个实例使用同一个外部 Redis 或同一个数据库连接字符串,后导入的订阅会覆盖先导入的订阅。
检查后台设置里的数据库、Redis 地址,不同实例一定要用不同的库编号或不同连接信息。

防火墙只放行了一个端口:腾讯云、阿里云等安全组或宝塔防火墙,默认只放行常用端口。
如果你只放行了 8100 没放行 8200,实例 2 后台自然是打不开的。
进入安全组把对应端口加进放行规则,再在宝塔面板或系统防火墙同步放行。

如果你导入的订阅链接本身区分了用户身份,比如每条订阅对应不同机场账号,建议在实例名称和后台备注里都写清楚,否则时间长了很难判断哪个实例用的是哪条通道。
最后再强调一遍:完整多实例隔离不是只拆容器,而是数据存储、后台配置、订阅来源和端口访问都需要各自独立
环境异常时先回到本文的验证步骤逐项排查,通常会比盲目重启容器更快定位问题。

分享到:
上一篇
多地区家宽节点统一管理,代理池统一调度Redis中心化
下一篇
宿主机磁盘IO过高导致全部虚拟机卡顿
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意