Docker hub镜像国内加速原理和nginx配置示例

在使用 Docker 拉取镜像时,有时会遇到速度慢或无法下载的情况,配置 Docker 镜像加速服务可以有效解决这些问题,以下是相关的docker镜像加速原理和nginx docker镜像加速的配置方法:

docker镜像加速原理:

docker镜像的加速原理为,每次拉取镜像的时候docker都会发送3个请求,他们分别是

GET /v2/

GET /token

HEAD /v2/

如果你想要配置一个自己的docker镜像加速服务的话,只需要再你的服务器上面对增加上面3个请求的响应配置即可。

这3个请求的示例如下:

bash 复制代码
"GET /v2/ HTTP/1.1" 401 87 "-" "docker/20.10.21 go/go1.18.7 git-commit/3056208 kernel/5.15.49-linuxkit os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.21 \x5C(darwin\x5C))" 

"GET /token?scope=repository%3Atekintian%2Falpine-mariadb%3Apull&service=registry.docker.io HTTP/1.1" 200 5450 "-" "docker/20.10.21 go/go1.18.7 git-commit/3056208 kernel/5.15.49-linuxkit os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.21 \x5C(darwin\x5C))"

"HEAD /v2/tekintian/alpine-mariadb/manifests/10.11 HTTP/1.1" 200 0 "-" "docker/20.10.21 go/go1.18.7 git-commit/3056208 kernel/5.15.49-linuxkit os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.21 \x5C(darwin\x5C))" 

从上面的请求示例中可以看出,第一个GET请求是切断服务是否可用,第二个是获取授权信息, 第三个是获取镜像头信息。

nginx docker镜像加速配置示例

Matlab 复制代码
server {
    listen 80 ;
    listen 443 ssl ;
    server_name hub.youname.com;
    index index.html index.htm default.htm default.html;
    access_log /www/hub.youname.com/log/access.log main;
    error_log /www/hub.youname.com/log/error.log;

    # ssl证书配置
    ssl_certificate /www/hub.youname.com/ssl/fullchain.pem;
    ssl_certificate_key /www/hub.youname.com/ssl/privkey.pem;
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
    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:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497 https://$host$request_uri;
    proxy_set_header X-Forwarded-Proto https;
    add_header Strict-Transport-Security "max-age=31536000";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $server_name;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    # 重定向http到https
    if ($scheme = http) {
        return 301 https://$host$request_uri;
    }
    # docker镜像加速配置
    location /v2/ {
        proxy_pass https://registry-1.docker.io;
        proxy_set_header Host registry-1.docker.io;
        # 这段是lua的auth配置,如果你的nginx不支持lua,删除即可
        header_filter_by_lua_block {
            local www_auth = ngx.var.upstream_http_www_authenticate
            if www_auth then
                local new_www_auth = string.gsub(www_auth, "auth.docker.io", "hub.youname.com")
                ngx.header['www-authenticate'] = new_www_auth
            end
        }
        # lua auth conf end

        # 异常处理
        proxy_intercept_errors on;
        recursive_error_pages on;
        error_page 301 302 307 = @handle_redirect;
    }

    location /token {
        proxy_pass https://auth.docker.io;
        proxy_set_header Host auth.docker.io;
    }
    # 异常处理 配置
    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }


}

测试你自己配置的加速镜像

经过上面的一番配置后你的镜像应该就可以使用了, 你可以通过这个url地址https://hub.youname.com/v2/tekintian/alpine-mariadb/manifests/latest来查看是否正常访问, 如果出现如下界面,表明你的docker镜像加速服务部署成功了。

在Docker里面使用你自己的加速镜像地址

打开你的docker,在Preferences --> Docker Engine 里面的 "registry-mirrors" 节点增加你的加速地址即可, 如下图所示:

这里的配置实际上就是对应的 daemon.json的配置, 在你自己的daemon.json配置的registry-mirrors里面增加也是一样的效果。

XML 复制代码
{
  "dns": [
    "8.8.8.8",
    "8.8.4.4"
  ],
  "registry-mirrors": [
    "https://ustc-edu-cn.mirror.aliyuncs.com",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub.youname.com"
  ]
}
相关推荐
neeef_se2 小时前
【Linux】WG-Easy:基于 Docker 和 Web 面板的异地组网
linux·前端·docker
前端康师傅4 小时前
前端开发使用nginx做web服务
nginx
A5rZ4 小时前
CTF: 在本地虚拟机内部署CTF题目docker
运维·网络安全·docker·容器
fragrans5 小时前
设置docker镜像加速器
运维·docker·容器
第八学期5 小时前
用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP)
linux·nginx·重构·架构·ansible·自动化运维
Karoku0666 小时前
【自动化部署】Ansible 基础命令行模块
运维·服务器·数据库·docker·容器·自动化·ansible
~菜鸟笔记~7 小时前
Docker学习笔记
学习·docker
weixin_425878237 小时前
Nginx 缓存那些事儿:原理、配置和最佳实践
运维·nginx·缓存
pcj_8888 小时前
配置Nginx自签名SSL证书,支持HTTPS
nginx·https
诡异森林。9 小时前
Docker--Docker Container(容器)
docker·容器·eureka