笔者家里有一台服务器,在服务器上用Docker私有化部署一些服务,譬如:
- aria2:跨平台,多协议支持的下载工具
- Emby:开源的自建影视站解决方案
- Home Assistant:开源的智能家居解决方案
- Frigate:NVR With Realtime Object Detection for IP Cameras
- UniFi Controller:UniFi网络设备的管理系统
- frp:内网穿透的反向代理应用
- clash:A rule-based tunnel in Go
- 其他笔者开发的程序
在局域网内,笔者的Apple TV / PS4 / HomePod / Google Nest mini等设备都通过同一网络下部署的clash透明代理连接互联网。但运行一众Docker服务的服务器则没有这样部署,原因有几个:
- 服务器运行了VPN Server,引入clash会增大网络配置复杂度
- 对服务器的网络可用性要求会比其他娱乐设备高,不希望clash故障导致服务器无法连接网络
- 网络流量经过clash会降低吞吐量
- aria2的bt / pt流量不希望走代理,容易触发DMCA
由于众所周知但又不能细说的原因,在服务上执行docker pull
命令下载Docker Hub上的image十分缓慢,每次对全部image更新都需要花费大半天的时间,十分影响工作效率。在此之前,通过使用一些国内免费的Docker Hub镜像进行加速,一定程度缓解了这个问题。但自从Docker Hub限制匿名用户pull requests的次数,国内的镜像站基本处于不可用状态。其实这些镜像站只是通过专线访问Docker Hub并对image layer进行cache,有没有可能配合clash自建镜像站呢?
实际上,Docker官方就提供了library/registry
这个image供搭建私有的Docker registry。利用proxy.remoteurl
这个配置,可以搭建一个pull through cache。另外通过设置HTTPS_PROXY / HTTP_PROXY / ALL_PROXY
这几个环境变量,Go http client会读取这些环境变量,并通过指定的代理发送http request达到加速目的。
version: "3"
services:
registry:
image: library/registry:latest
ports:
- 5000:5000
volumes:
- <path-to-store-images>:/var/lib/registry
environment:
TZ: Asia/Hong_Kong
HTTPS_PROXY: HTTP://<clash-ip>:<clash-port>
HTTP_PROXY: HTTP://<clash-ip>:<clash-port>
ALL_PROXY: SOCKS5://<clash-ip>:<clash-port>
REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io # upstream
restart: always
例如,笔者搭建的registry地址为https://docker.x.terrychan.me
,则可以这样拉取Docker Hub镜像,通过clash dashboard可以观察到,registry的回源请求都走了代理。