随着容器化技术的普及,Docker镜像的使用需求激增。然而,Docker Hub官方镜像源(registry-1.docker.io
)因部署在国外服务器,国内用户在拉取镜像时完全无法访问,因此搭建私有中转节点成为了一种选择。Harbor、Nexus、Nginx都可以实现,本文将使用最快速的nginx快速搭建DockerHub中转节点。
202507028更新:
不推荐使用此方法了,建议使用:https://github.com/dqzboy/Docker-Proxy
本站已提供镜像服务:blog.procoding.cn/mirror/
针对上述问题,本方案提出通过Nginx 反向代理+HTTPS 加速的方式,构建一个高性能的本地镜像代理服务器。首先我们需要一台香港的高速服务器,带宽越大、延迟越低越好。
服务器搭建好后,安装nginx。
sudo apt update
sudo apt install nginx
允许防火墙(如有)
sudo ufw allow 443
修改/etc/nginx/nginx.conf文件,添加如下配置:
注意修改成你的域名和证书
#反代docker hub镜像源
server {
listen 443 ssl;
server_name dockerhub.procoding.cn; # 你的域名
ssl_certificate /usr/local/nginx/conf/ssl/procoding.cn/_.procoding.cn.crt; #你的crt证书
ssl_certificate_key /usr/local/nginx/conf/ssl/procoding.cn/_.procoding.cn.key; #你的证书密钥
ssl_session_timeout 24h;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
location /v2/ {
proxy_pass https://registry-1.docker.io; # Docker Hub 的官方镜像仓库
proxy_set_header Host registry-1.docker.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 关闭缓存
proxy_buffering off;
# 转发认证相关的头部
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
# 重写 www-authenticate 头为你的反代地址
proxy_hide_header www-authenticate;
add_header www-authenticate 'Bearer realm="https://dockerhub.procoding.cn/token",service="registry.docker.io"' always;
# always 参数确保该头部在返回 401 错误时无论什么情况下都会被添加。
# 对 upstream 状态码检查,实现 error_page 错误重定向
proxy_intercept_errors on;
# error_page 指令默认只检查了第一次后端返回的状态码,开启后可以跟随多次重定向。
recursive_error_pages on;
# 根据状态码执行对应操作,以下为301、302、307状态码都会触发
error_page 301 302 307 = @handle_redirect;
}
# 处理 Docker OAuth2 Token 认证请求
location /token {
resolver 1.1.1.1 valid=600s;
proxy_pass https://auth.docker.io; # Docker 认证服务器
# 设置请求头,确保转发正确
proxy_set_header Host auth.docker.io;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 传递 Authorization 头信息,获取 Token
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
# 禁用缓存
proxy_buffering off;
}
location @handle_redirect {
resolver 1.1.1.1;
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
}
}
保存并执行nginx重启命令
sudo nginx -s reload
使用方式:
直接拉取镜像:
docker pull dockerhub.procoding.cn/stilleshan/frpc:latest
或者设置全局,编辑/etc/docker/daemon.json文件:
{ "registry-mirrors": [ "https://dockerhub.procoding.cn" ] }
然后重启docker即可
service docker restart
不使用镜像也可以配置docker代理
vi ~/.docker/config.json
#插入
{
"proxies": {
"default": {
"httpProxy": "http://代理地址",
"httpsProxy": "http://代理地址",
"noProxy": "*.test.example.com,.example.org,127.0.0.0/8"
}
}
}
推荐两个别人的dockerhub代理
{ "registry-mirrors": [ "https://dockerproxy.net","https://docker.m.daocloud.io" ] }
View Comments