非官方 Overture Docker 镜像
非官方 Overture Docker 镜像,无污染DNS,国内/国外分流等…
资料来源:
https://github.com/shawn1m/overture
https://moe.best/tutorial/overture.html
https://hub.docker.com/r/daxingplay/docker-overture/dockerfile更新
1 | 20.08.22 初始化 |
导语
上个月完成了 overture docker 的更新,基本实现了自己需要的功能.项目地址 Overture Docker
这一篇是描述镜像的实现,与 overture 有关配置详情见 docker 搭建 overture 无污染 DNS
项目地址
功能
默认配置文件在 /home/overture/config.json
- 主 DNS 是阿里 DNS,走 DOH.
- 副 DNS 是 Google DNS,走 DOT.(选择 Google DNS 因为其 cdn 解析更准确)
- (21.03.30) DOT DOH 可用性堪忧,尽量走本地代理吧.
- 域名分流,国内常见域名直走主 DNS,GFW list 直走 副DNS.
- IP 分流,主 DNS 结果为国内 IP,直接采用,不再等待副 DNS.
其他特性
每天凌晨 2 点,自动更新分流的 ip 和 域名 list.更新完毕,自动重启 overture.- 这里直接拉取的 releases 的二进制文件,并非由源码编译.
- 每天 Gtihub Action 更新最新的 ip 和 域名 list,编译新镜像.
- ip 和 域名不需要频繁更新,有需要时 pull 最新的镜像即可.
使用
拉取镜像
1 | docker pull jasperhale/overture |
直接运行~~(这里有个坑),镜像运行只能以 -d
直接运行在后台.(后面会解释原因)~~.
1 | docker run -p 53:53 -p 53:53/udp jasperhale/overture |
使用 docker-compose.启动同样需要 -d
1 | version: '3' |
实现
定期更新文件
这个需求实现比较简单.alpine
支持 crond
.
这里将更新的动作写到了
getfilter.sh
在将执行这个文件的命令写到
/var/spool/cron/crontabs/root
.1
2# 每天两点执行
echo '0 2 * * * sh /getfilter.sh'>>/var/spool/cron/crontabs/root随后在 docker 启动时执行的
entrypoint.sh
文件执行crond
启动定期任务.
自动重启 overture (Docker 中运行多进程)
(21.3.30) 因为调试问题,低估了无法输出 log 的问题,因此 目前暂时更改为更新 docker image 而不是直接容器内更新.
不使用 docker 的情况下,自动重启进程一般有两种方式
- 通过 crond 定期执行杀进程重启.
- 运行守护进程,另一边只管定期杀进程.
- 进程托管到进程管理程序,通过管理系统定期重启.
一般情况下 docker 就是一个进程对应一个容器.中止了 overture 进程相当于直接结束了容器.单一的 crond 重启并不可行.
就剩下多进程的解决方案了.这里选了一个取巧的方案.
- docker 对应的主进程换成守护进程.守护进程会不断轮讯检查 overture 进程是否存在.
- overture 作为子进程启动,不再关联 docker 的生命周期.
- 每次更新完分流的文件后,杀掉 overture,之后由守护进程重启.
- 因为守护进程才是关联到 docker 的主进程,所以 docker 并不会因此 overture 重启而结束.
多进程还有另一种实现. s6-overlay 是专门为容器环境编写的多进程管理程序,完全托管到 s6-overlay
在更多进程情况下会更加实用.
警告: 如果非必要,不要在 docker 运行多个进程.
结束
之后会把 DockerHub 文档完善一下.