使用Nginx搭建DockerHub中转节点

随着容器化技术的普及,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" ] }

RabbitMQ 快速入门实践 Linux 虚拟机根目录扩容指南(使用 GParted 和 LVM) ESXi 6.7/7.0/8.0配置GPU/硬盘直通
View Comments
There are currently no comments.