Docker Registry的代理配置

需求及问题

奇葩需求真是各种各样啊。

Docker Registry用过好久了,见《docker实践入门之六:Registry》。用Nginx代理的用法以前也一直没什么问题。

这次的情况是安装Registry的服务器没有域名,所以没法配置HTTPS证书,就用了一个自签名的证书,然后用IP访问。另一个问题是服务器上的/v2路径已经被占用,只能改用别的路径给Registry。

还好客户端是另一个服务器,可以用Nginx把这个registry再次代理到本地HTTP并且把路径恢复成/v2。

但是实际使用时docker push/pull始终失败……报HTTP 405 Not Allowed错误,搜了半天也没有头绪……用一层nginx代理是正常的,加一层就不行了。

解决方案

查了官方文档对nginx代理的配置说明,严格按要求配置。

首先是registry服务器上的nginx配置:

# 全局配置部分
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
    '' 'registry/2.0';
}

# server配置部分
    location /regv2/ {
        add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

        proxy_pass http://localhost:5000/v2/;
        proxy_set_header  Host              $http_host;   # required for docker client's sake
        proxy_set_header  X-Real-IP         $http_x_real_ip; # pass on real client's IP
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $http_x_forwarded_proto;
        proxy_read_timeout                  900;
    }

其次是客户端nginx配置:

# 全局配置部分
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
    '' 'registry/2.0';
}

# server配置部分
server {
    listen       127.0.0.1:5001;
    server_name  _;
    root         /var/www/html;
    autoindex    off;

    error_log /dev/null;
    access_log off;

    location /v2/ {
        add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

        proxy_pass https://remote_ip/regv2/;
        proxy_set_header  Host              $http_host;   # required for docker client's sake
        proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }
}

跟服务端的nginx配置相比,除了路径不同以外,还有就是X-Real-IP和X-Forwarded-Proto不同,这边需要传实际的,而服务端传的是这边传过去的。

现在就可以操作了:

docker tag img localhost:5001/img
docker push localhost:5001/img

成功。

推送到[go4pro.org]