前情提要:
内部服务器环境,网络管理部门只给开了一个服务器访问 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.json,your-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
优先级,避免路由被其他规则无匹配导致无法正常转发
评论区