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"
  ]
}
相关推荐
赵我说的做_life37 分钟前
基于Docker的Flask项目部署完整指南
docker·容器·flask
江畔独步2 小时前
docker容器监控&自动恢复
docker·容器·eureka
fxshy2 小时前
ai聊天流式响应,阻塞式和流式响应 nginx遇到的坑
运维·javascript·nginx
诡异森林。7 小时前
Docker--Docker网络原理
网络·docker·容器
ALex_zry7 小时前
Docker Macvlan网络配置实战:解决“network already exists“错误
网络·docker·php
IT小辉同学7 小时前
Docker如何更换镜像源提高拉取速度
spring cloud·docker·eureka
GnixAij9 小时前
Docker SSH端口转发
docker·ssh
angushine9 小时前
让Docker端口映射受Firewall管理而非iptables
运维·docker·容器
玄明Hanko10 小时前
生产环境到底能用Docker部署MySQL吗?
后端·mysql·docker
玄明Hanko10 小时前
Quarkus+Docker最全面完整教程:手把手搞定Java云原生
后端·docker·云原生