根据这篇“是时候出手了,规避运营商PCDN误判限速”,配置使用后下载源可能无效了,没办法正常用,现在以更换微软下载镜像,因为个人的特殊癖好,不想一直都在下载,所以我用豆包修改了部分代码,增加一个自定义设置项,可以修改运行日期和时间、下载速度、单次下载文件大小、检测时间,下载链接等,并添加了注释,二创产品写的不好,大家轻喷,谢谢!!!
version: '3' # Docker Compose版本
services:
traffic-keeper: # 服务名称
image: alpine:latest # 使用Alpine Linux镜像(轻量级)
container_name: net-flow-generator # 容器名称
restart: unless-stopped # 重启策略:除非手动停止,否则自动重启
logging: # 日志配置部分
driver: "json-file" # 使用JSON格式记录日志
options: # 日志选项
max-size: "5m" # 单个日志文件最大5MB
max-file: "3" # 最多保留3个日志文件(自动轮转)
tmpfs: # 临时文件系统挂载(内存中)
- /tmp # 将/tmp目录挂载到内存中,提高IO性能
command: # 容器启动后执行的命令
- /bin/sh # 使用shell解释器
- -c # 执行后面的字符串命令
- | # 多行命令开始
# 第一步:配置Alpine包管理器使用阿里云镜像(加速下载)
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
# 第二步:安装curl工具(用于HTTP下载)
apk add --no-cache curl
# 第三步:输出启动信息
echo "流量保镖服务启动...开始平衡你的上下行比例"
# 第四步:主循环(无限循环)
while true; do
# 生成随机数:1-10次下载任务(模拟用户行为随机性)
# $$RANDOM是Alpine ash shell的随机数变量(0-32767)
# expr $$RANDOM % 10:取0-9的余数
# +1:变成1-10
RUN_TIMES=$$(expr $$RANDOM % 10 + 1)
# 输出本轮任务信息(日期时间格式:年-月-日 时:分:秒)
echo "$$(date +'%F %T'): 本轮将连续执行$${RUN_TIMES}次下载任务..."
# 第五步:执行连续下载任务
i=1 # 初始化计数器
# 使用while循环(兼容Alpine的ash shell,不支持bash的for((i=1;i<=N;i++))语法)
while [ $${i} -le $${RUN_TIMES} ]; do
# 输出当前下载任务信息
echo "$$(date +'%F %T'): 执行第$${i}/$${RUN_TIMES}次下载任务..."
# 第六步:执行curl下载命令(整行书写避免参数解析问题)
# curl参数详解:
# -L:跟随重定向
# -o /dev/null:下载内容丢弃到空设备(不保存文件)
# -#:显示进度条
# -S:显示错误信息
# --limit-rate 10M:限制下载速度为10MB/秒(约80Mbps)
# -H 'Cache-Control: no-cache':添加HTTP头,禁用缓存
# -A "Mozilla/5.0...":设置User-Agent,模拟Chrome浏览器
# --connect-timeout 15:连接超时15秒
# --max-time 3600:最大执行时间1小时
# --retry 5:失败重试5次
# --retry-delay 10:重试间隔10秒
# -w "...": 下载完成后输出的格式化信息
# %{time_total}s:总耗时(秒)
# %{speed_download}B/s:平均下载速度(字节/秒)
# %{http_code}:HTTP状态码
# "https://...":下载的URL(微软Windows更新文件)
# || echo "...": 如果curl命令失败(返回非0),执行后面的echo
curl -L -o /dev/null -# -S --limit-rate 10M -H 'Cache-Control: no-cache' -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" --connect-timeout 15 --max-time 3600 --retry 5 --retry-delay 10 -w "\n结果: 耗时%{time_total}s | 均速%{speed_download}B/s | 状态%{http_code}\n" "https://catalog.sf.dl.delivery.mp.microsoft.com/filestreamingservice/files/b7aa64b3-8441-4d36-b8f7-409f3cfeac1c/public/windows11.0-kb5074109-x64_fe29a336e6e650dda4038e82bcc0c6286c70b9a1.msu" || echo "第$${i}次下载异常,继续执行下一次..."
# 第七步:计数器递增(Alpine ash语法)
# expr $${i} + 1:计算i+1的值
i=$$(expr $${i} + 1)
done # while循环结束
# 第八步:一轮下载完成后,随机休息一段时间
# 生成1-600秒的随机休息时间
RANDOM_SLEEP=$$(expr $$RANDOM % 600 + 1)
# 输出休息信息
echo "$$(date +'%F %T'): 本轮$${RUN_TIMES}次任务执行完毕,随机休息$${RANDOM_SLEEP}秒..."
# 执行休眠
sleep $${RANDOM_SLEEP}
done # 主while循环结束(无限循环)
【Q&A 常见问题】
- Q:这会影响我打游戏/看电视吗?
- A:脚本里限制了
10M (大约100Mbps) 的速度,现在的宽带一般都是300M、500M起步,这点占用几乎无感。如果你的宽带比较小,可以把 10M 改小一点,比如 5M。
- Q:为什么选下载 微软官方Windows更新文件?
- A:大厂节点,速度快且稳定,且模拟访问 微软官方 的流量看起来比较“正常”。
- Q:真的不伤硬盘吗?
- A:千真万确。
curl 的输出被我重定向到了 /dev/null,在 Linux 里这就是个无底洞,数据流进去就消失了,根本不会经过文件系统写入磁盘。同时我也挂载了 tmpfs 到 /tmp,确保临时文件在内存里解决。
【写在最后】
这种方法属于“物理规避”,主要是为了让流量图表好看一点,别让上行看起来像一根针,下行却是平的。
如果你也被限速过,或者担心被限速,建议部署一个挂着。反正 Docker 一开,平时也不用管它,稳稳的幸福!😎
觉得好用的兄弟,评论区回个“稳”字!