利用nginx反向代理加速docker镜像拉取
背景
之前写过一篇“利用cloudflare workers解决docker无法拉取镜像问题”的博客
cloudflare workers 本质上也是使用的反向代理,只是用了cloudflare免费的服务罢了
但操作过就会发现,流量并不能得到保证,有时快有时慢,甚至对于部分地区的人都不支持cloudflare
如果需求非常迫切,可以利用自己的服务器,通过nginx反向代理,这样拉取镜像的速度就是自己服务器的速度了,如果服务器速度足够快,跑满自己的宽带速度都不是问题。
但是,相比于cloudflare,自己搭服务器是肯定有成本的,也就无法免费白嫖了。
准备资源
- 一台海外服务器,国内共有云厂商也都有提供海外服务器的服务,直接购买就可以了,新用户甚至可以白嫖,同时最重要的是需要有一定的带宽,否则,拉取速度也还是有限。
- 一个自己的域名 这里以docker.abc.com作为例子
- 域名对应的证书
部署
购买海外云服务器
这里就不做赘述了
安装系统环境
系统 | nginx版本 |
---|---|
ubuntu 22.04 | nginx/1.18.0 |
安装nginx
apt install nginx -y
配置
vim /etc/nginx/sites-enabled/default
server {
#同时监听80和443端口
listen 80;
listen 443 ssl;
server_name docker.abc.com;# 需要修改成自己的域名
charset utf-8;
if ( $scheme = 'http' ) {
return 302 https://docker.abc.com/;# 需要修改成自己的域名
}
#设置证书部分
ssl_certificate ssl/fullchain.pem;
ssl_certificate_key ssl/privkey.pem;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
location / {
# Docker hub 的官方镜像仓库
proxy_pass https://registry-1.docker.io;
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;
# 对 upstream 状态码检查,实现 error_page 错误重定向
proxy_intercept_errors on;
recursive_error_pages on;
# 根据状态码执行对应操作,以下为381、302、387状态码都会触发
error_page 301 302 307 = @handle_redirect;
}
location @handle_redirect {
resolver 1.1.1.1;
set $saved_redirect_location '$upstream_http_location';
proxy_pass $saved_redirect_location;
}
}
需要注意的是,证书存放在 /etc/nginx/ssl 文件夹中
解析域名
需要将域名解析成这个服务器的公网地址,并在防火墙上做对应的放通
重启服务
systemctl restart nginx
systemctl enable nginx.servic
测试拉取
例如 要拉取busybox的最新镜像
之前的方式是
docker pull busybox:latest
通过代理来访问,就需要修改成
docker pull docker.abc.com/library/busybox:latest
如果不希望这么麻烦
直接修改docker的配置文件
vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.abc.com"
],
}
然后重启docker
systemctl restart docker
最后该怎么拉取镜像还是怎么拉取。
本文来自博客园,作者:厚礼蝎,转载请注明原文链接:https://www.cnblogs.com/guangdelw/p/18253540