侧边栏壁纸
博主头像
Ivan Zhang

所谓更牛,就是换个罪受

  • 累计撰写 48 篇文章
  • 累计创建 54 个标签
  • 累计收到 6 条评论

目 录CONTENT

文章目录

通过 Nginx 代理拉取 Docker 镜像配置指南

Ivan Zhang
2025-07-09 / 0 评论 / 2 点赞 / 71 阅读 / 1,759 字
温馨提示:
本文最后更新于 ,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
有什么问题或观点欢迎评论留言,或者 交流。
如果觉得文章对您有所帮助,可以给博主打赏鼓励一下。

前情提要:
内部服务器环境,网络管理部门只给开了一个服务器访问 nexus 私服的网络权限,导致其他应用服务器无法直接拉取 docker 镜像,申请网络权限也不知道猴年马月才能下来,或者可能根本下不来。
内部服务器之间互访也有防火墙,相互间 ssh 的端口也被卡死了,想要 ssh -> save -> scp -> load 简单处理的路子也不通了。
然而正如《圣经》所言:你们祈求,就给你们;寻找,就寻见;叩门,就给你们开门。(马太福音7:7),正好开通的这个服务器是 nginx 服务器,那就用它做个代理转发吧。
如是,有以下解决方案。

一、核心配置

1. Nginx 代理配置

server {
    listen       80;
    server_name  localhost;

    # 定义后端服务变量(这里为示例ip,根据实际修改)
    set $backend_registry "http://10.147.10.147:8084";

    # 这里一定要配置为 /v2/,否则 docker pull 的时候无法正确解析,这是最坑的地方
    location ^~ /v2/ {
        # 基础配置
        resolver 8.8.8.8;
        proxy_pass $backend_registry;  # 必须去掉末尾的 /,即保持匹配路径 /v2/

        # 关键:重写Token服务地址为代理地址
        proxy_redirect $backend_registry/ http://$host/;

        # 头部处理
        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;

        # 认证透传
        proxy_set_header       Authorization $http_authorization;
        proxy_pass_header      Authorization;

        # 性能优化
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_buffering off;
        proxy_ssl_server_name on;

        # 超时控制
        proxy_connect_timeout 60s;
        proxy_read_timeout 600s;
        proxy_send_timeout 600s;

        # 错误处理
        proxy_next_upstream error timeout invalid_header;

        # 日志记录(可选)
        access_log /var/log/nginx/docker-proxy-access.log;
        error_log  /var/log/nginx/docker-proxy-error.log;
    }
}

2. Docker 客户端配置

配置文件 /etc/docker/daemon.jsonyour-registry-domain.com即 nginx 服务器的 ip 地址。

{
    "insecure-registries": ["your-registry-domain.com:80"]
}
# 重新加载配置
sudo systemctl daemon-reload
# 重启Docker服务
sudo systemctl restart docker

3. 拉取镜像

docker pull your-registry-domain.com:80/image_name:tag

常见问题

  • 通过 nginx 代理,路由匹配规则必须以 /v2/ 作为前缀,否则 docker pull 时无法正确解析路径
  • 必须添加重定向 proxy_redirect $backend_registry/ http://$host/; 确保重定向后的访问资源仍然使用代理的主机信息,同时必须开启认证透传配置
  • proxy_pass $backend_registry; 路径末尾不能带 /,确保路由匹配的路径能被原样保留
  • proxy_redirect $backend_registry/ http://$host/; 路径为末必须带 /,避免路径误匹配
  • 注意 location 优先级,避免路由被其他规则无匹配导致无法正常转发
2

评论区