一. 介绍

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