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 ;

# 重定向所有HTTP请求到HTTPS

return 301 https://$server_name$request_uri;

}

server {

listen 443 ssl http2;

listen [::]:443 ssl http2;

server_name ;

ssl_certificate "";

ssl_certificate_key "";

# 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 ;

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

热门