docker - 对 nginx 后面的 docker 私有注册表的请求由 HTTPS 虚拟主机处理
问题描述
我有一个 docker 私有注册表容器在 HTTP 中的 Nginx 后面提供服务。
在我添加 HTTPS 服务器配置之前,一切工作正常。docker pull
并且docker push
请求由这个 HTTPS 虚拟主机而不是 docker 注册表虚拟主机处理(访问日志打印在 HTTPS 域下,docker 注册表域什么也没有)。
所以,很明显,我得到了 404 错误。
删除此 HTTPS 配置使其再次工作。
这是我的 docker 注册表配置/etc/nginx/sites-enabled
:
server {
listen 80;
server_name docker-registry.my-domain.com;
access_log /data/log/nginx/$server_name.access.log;
client_max_body_size 0;
location ~ \.*$ {
proxy_pass http://localhost:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass_request_headers on;
}
}
和下的HTTPS虚拟主机/etc/nginx/sites-enabled
:
server {
listen 443 ssl;
server_name foobar.my-domain.com;
ssl_certificate /etc/nginx/certs/foobar.my-domain.com/crt;
ssl_certificate_key /etc/nginx/certs/foobar.my-domain.com/key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /data/log/nginx/$server_name.access.log;
location ~ \.*$ {
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass_request_headers on;
}
}
server {
listen 80;
server_name foobar.my-domain.com;
return 301 https://$server_name$request_uri;
}
当我使用<my-ip>:5000
asinsecure-registries
而不是 docker 注册表的域名时,一切正常。
当我使用 curl 向 发送请求时
http://docker-registry.my-domain.com/v2/<my-image>/manifests/latest
,docker 注册表的访问日志会401 Unauthorized
按预期打印。
我是否错误配置了 Nginx?
码头工人版本:
Client: Docker Engine - Community
Version: 18.09.0-ce-beta1
API version: 1.39
Go version: go1.10.4
Git commit: 78a6bdb
Built: Thu Sep 6 22:41:53 2018
OS/Arch: darwin/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 18.09.0-ce-beta1
API version: 1.39 (minimum version 1.12)
Go version: go1.10.3
Git commit: 78a6bdb
Built: Thu Sep 6 22:49:35 2018
OS/Arch: linux/amd64
Experimental: true
非常感谢!
- - - - - - - - 更新 - - - - - - - - - - - - - -
我发现如果我ssl
在侦听 HTTPS 配置后删除协议,它工作正常。
解决方案
最后我发现,如果ssl
也启用了docker-registry.my-domain.com
,一切正常。我不知道为什么,但它确实有效。
推荐阅读
- hibernate - 在关系表中自动填充数据
- python - BeautifulSoup 在网络抓取亚马逊时无法正常工作
- c++ - 有没有办法从文本文件中读取并将单个数据存储为不同的变量?
- php - Symfony Container Builder 的 `addObjectResource` 方法
- java - 一段时间后无限亚军滞后
- rust - 如何在结构中写入 KdTree 成员的类型?
- flutter - 使用颤振关闭应用程序时,是否可以运行类似“后台服务”的代码?
- regex - Regex if then without else in ripgrep
- azure-logic-apps - 如何检查Outlook文件夹是否有邮件
- r - boxr 包中的 box_dir_create() 函数未在 Box 中创建文件夹