Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

xiaoshouchen/docker-proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

3 Commits

Repository files navigation

Docker Registry Proxy

自建 Docker Hub 镜像代理服务,部署在可访问 Docker Hub 的海外服务器上,解决国内无法直接拉取 Docker 镜像的问题。

功能

  • 透明代理 Docker Hub(registry-1.docker.io)的所有 Registry V2 API 请求
  • 内部自动处理 auth.docker.io 鉴权,Docker 客户端无需配置认证
  • Token 缓存,避免重复请求 auth.docker.io
  • 官方镜像自动补全 library/ 前缀
  • Blob 下载 CDN 重定向自动跟随(支持多跳)
  • 支持多上游仓库路由(quay.io、gcr.io、ghcr.io、registry.k8s.io 等)
  • 浏览器访问时展示 Docker Hub 镜像搜索页面
  • 爬虫 UA 屏蔽 + nginx 伪装页
  • /health 健康检查端点,诊断到上游的连通性
  • 支持 TLS(HTTPS)
  • 支持后台守护进程模式运行
  • 单文件编译,无外部依赖,静态链接

编译

需要 Go 1.21+。

# 本机编译
go build -o docker-proxy .
# 交叉编译 Linux x86-64(用于部署到服务器)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o docker-proxy-linux-amd64 .

部署

将编译好的二进制上传到海外服务器:

chmod +x docker-proxy-linux-amd64
# 前台运行(调试用)
./docker-proxy-linux-amd64 -addr :5000
# 后台运行
./docker-proxy-linux-amd64 -d -addr :5000
# 停止
kill $(cat docker-proxy.pid)

命令行参数

参数 默认值 说明
-addr :5000 监听地址
-tls-cert TLS 证书文件路径(留空则使用 HTTP)
-tls-key TLS 私钥文件路径
-d false 后台守护进程模式
-log docker-proxy.log 日志文件路径(守护进程模式下生效)

使用 systemd 管理(推荐)

创建 /etc/systemd/system/docker-proxy.service:

[Unit]
Description=Docker Registry Proxy
After=network.target
[Service]
Type=simple
ExecStart=/opt/docker-proxy/docker-proxy-linux-amd64 -addr :5000
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now docker-proxy

Docker 客户端配置

方式一:配置 registry-mirrors(推荐)

编辑 Docker daemon 配置文件 /etc/docker/daemon.json:

{
 "registry-mirrors": ["http://你的服务器IP:5000"],
 "insecure-registries": ["你的服务器IP:5000"]
}

重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置生效:

docker info | grep -A 5 "Registry Mirrors"

之后正常使用 docker pull 即可自动走代理:

docker pull nginx
docker pull ubuntu:22.04

如果使用 HTTPS(配置了 TLS 证书),则不需要 insecure-registries

方式二:直接指定代理地址拉取

无需修改 daemon.json,直接通过代理地址拉取:

docker pull 你的服务器IP:5000/library/nginx:latest
docker pull 你的服务器IP:5000/bitnami/redis:latest

拉取后可用 docker tag 重命名:

docker tag 你的服务器IP:5000/library/nginx:latest nginx:latest

诊断

健康检查

访问 /health 端点检测代理到上游的连通性:

curl http://你的服务器IP:5000/health

返回示例:

{
 "proxy": "running",
 "listen": ":5000",
 "checks": [
 {"name": "auth.docker.io", "status": "HTTP 200", "latency": "66ms", "detail": "OK"},
 {"name": "registry-1.docker.io", "status": "HTTP 401", "latency": "13ms", "detail": "OK"},
 {"name": "hub.docker.com", "status": "HTTP 200", "latency": "132ms", "detail": "OK"}
 ]
}
  • auth.docker.io → HTTP 200 表示鉴权服务可达
  • registry-1.docker.io → HTTP 401 表示 Registry 可达(未认证返回 401 是正常的)
  • 任何一个显示 FAIL 说明服务器无法访问 Docker Hub

V2 端点测试

curl http://你的服务器IP:5000/v2/
# 期望: {} (HTTP 200,带 Docker-Distribution-Api-Version 头)

手动测试镜像拉取

curl -s http://你的服务器IP:5000/v2/library/alpine/manifests/latest \
 -H "Accept: application/vnd.docker.distribution.manifest.v2+json" | head -20

支持的上游仓库

默认代理 Docker Hub。通过 ns 查询参数或域名前缀路由支持其他仓库:

前缀/参数 上游
默认 registry-1.docker.io
quay quay.io
gcr gcr.io
k8s-gcr k8s.gcr.io
k8s registry.k8s.io
ghcr ghcr.io
cloudsmith docker.cloudsmith.io
nvcr nvcr.io

架构

Docker Client (国内)
 │
 │ docker pull nginx
 │
 ▼
Docker Proxy (海外 VPS :5000)
 │
 ├─→ auth.docker.io (获取 token,带缓存)
 │
 ├─→ registry-1.docker.io (拉取 manifest)
 │
 └─→ CDN / S3 (跟随重定向,下载 blob)
 │
 ▼
Docker Client 收到镜像数据

License

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

Contributors

Languages

AltStyle によって変換されたページ (->オリジナル) /