非官方 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
2
20.08.22 初始化
21.03.30 更改 docker 逻辑

导语

上个月完成了 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
2
3
4
5
6
7
8
9
10
11
12
13
version: '3'

services:

overture:
image: jasperhale/overture
container_name: overture
restart: always
ports:
- "53:53/tcp"
- "53:53/udp"
volumes:
- - ./config.json:/home/overture/config.json

实现

定期更新文件

这个需求实现比较简单.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 文档完善一下.