Docker 镜像站自建 ,自己的工具自己做
一. 介绍
2024年06月07日,GFW正式DNS污染+SNI阻断了docker.com及其相关域名。从国内解析得到的IP地址为Twitter/Facebook的IP,符合大墙DNS污染的特征。而如果使用海外解析得到的正常IP地址从国内访问则会被SNI重置阻断链接。
与此同时,上交镜像站等一系列中国大陆公益镜像站点也“接上级主管部门通知,暂时关闭 Docker Hub 镜像缓存服务”。
通知信息如下:目前来看,南京大学、中科大、上海交大 目前明确停止 Docker 镜像
网易之前死了
腾讯云目前内网可用,微软据说内网可用
阿里登陆后就可以拿到子域名
百度好像也挂了
dockerproxy 境内网络也无法访问
对于程序员来说,想要快速部署一个开发环境,或是发布程序,Docker 似乎目前还是很重要的,因此,自己学会建设一个个人使用的 Docker镜像站变得十分重要。
二. 使用 Nginx 自建 Docker 镜像站
目前最方便的办法,就是在有对大陆线路优化的服务器上自建一个个人的镜像站。
因为 Docker Hub 官方的限制,未登录的 ip 镜像拉取次数是100次/6小时,但是对于开发者个人使用来说,基本上没有影响,本人亲测速度蛮快的,速度如图2-1所示:
图 2-1 拉取大体积镜像时的最高速度(可能受网络波动影响,以实际为准)
2.1 具体配置方法(以 Debian 12 为例)
1) 更新 apt 并安装 nginx:sudo apt update && sudo apt install nginx
2) 进入 nginx 的配置文件目录,并创建一个名为 proxy 的配置文件,内容如下:
## file_name proxy
## file_path /etc/nginx/sites-enabled
server {
listen 80;
server_name <write your domain>;
# 重定向所有HTTP请求到HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name <write your domain>;
ssl_certificate "<your 'domain.pem' path>";
ssl_certificate_key "<your 'domain.key' path>";
# ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers on;
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;
}
}
3) 编辑完按 ecs,并输入 :wq
保存并退出
4) 检查 nginx 的配置文件是否正确并重新加载 nginx 的配置:sudo nginx -t
回复 success ok 后重新加载 nginx 配置:sudo systemctl reload nginx
2.2 在 Docker 中配置加速镜像地址:
1) 找到Docker的配置文件:
Docker的配置文件通常位于
/etc/docker/daemon.json
。如果文件不存在,你需要创建它。
2) 编辑配置文件:
打开终端,输入以下命令来编辑
daemon.json
文件:sudo vim /etc/docker/daemon.json
在文件中添加以下内容:
{ "registry-mirrors": ["https://你的加速器地址"] }
3) 重启Docker服务:
保存并关闭文件后,重启Docker服务以使配置生效:
sudo systemctl restart docker
4) 验证配置:
可以通过以下命令来验证Docker是否已经使用了加速镜像:
sudo docker info
在输出的信息中,找到
Registry Mirrors
,如果显示了你配置的镜像地址,说明配置成功。
三. 使用 Reigistry 进行搭建
首先创建一个 docker-compose.yml 配置文件,自行寻找合适路径:sudo vim docker-compose.yml
配置文件内容如下:
#version: '3' #最新版本docker 不在需要此字段
services:
registry:
image: registry:2
ports:
- "15000:5000"
environment:
REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io # 上游源
REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR: inmemory # 内存缓存
volumes:
- ./data:/var/lib/registry
需要注意的是如果仅仅作为镜像源,需要把push功能ban掉,推荐使用nginx反代的时候禁止其他http method
## nginx 部分配置
# 端口, 域名 都改为自己的
server {
listen 80;
server_name <write your domain>;
location / {
# 仅允许 GET 请求
limit_except GET {
deny all;
}
proxy_pass http://localhost:5000; # 假设 Docker Registry 运行在本地的 5000 端口
proxy_set_header Host $host;
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;
}
}
done!然后具体使用方法见上方 2.2 在 Docker 中配置加速镜像地址
最后
最后分享几个目前可用的搭建的地址,且用且珍惜:
https://docker.s.letoy.xyz
https://docker-r.2002xin.cc