Неправильный HTTP-ответ с частным реестром докера (v2) за прокси-сервером nginx
Я установил личный реестр Docker (v2) в окне CentOS 7, следуя их официальной документации: https://docs.docker.com/registry/deploying/
Я использую Docker 1.6.0 на Fedora 21.
Реестр работает на порту 5000 и использует ключ SSL, подписанный доверенным центром сертификации. Я установил запись DNS для 'docker-registry.example.com', чтобы он был внутренним IP-адресом сервера. Запустив 'docker pull docker-registry.example.com:5000/tag/image', он работает как положено.
Я устанавливаю сервер nginx, на котором запущена версия nginx: nginx/1.8.0, и устанавливаю запись dns для 'nginx-proxy.example.com', указывающую на сервер nginx, и настраиваю сайт. Вот конфиг:
server {
listen 443 ssl;
server_name nginx-proxy.example.com;
add_header Docker-Distribution-Api-Version: registry/2.0 always;
ssl on;
ssl_certificate /etc/ssl/certs/cert.crt;
ssl_certificate_key /etc/ssl/certs/key.key;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header Docker-Distribution-Api-Version registry/2.0;
location / {
proxy_pass http://docker-registry.example.com:5000;
}
}
Когда я пытаюсь запустить 'docker pull nginx-proxy.example.com/tag/image', я получаю следующую ошибку:
FATA[0001] Error response from daemon: v1 ping attempt failed with error: Get https://nginx-proxy.example.com/v1/_ping: malformed HTTP response "\x15\x03\x01\x00\x02\x02"
Мой вопрос двоякий.
- Почему докер-клиент ищет /v1_/ping?
- Почему я вижу "неправильный http ответ"
Если я запускаю 'curl -v nginx-proxy.example.com/v2', я вижу:
[root@alex amerenda] $ curl -v https://nginx-proxy.example.com/v2/
* Hostname was NOT found in DNS cache
* Trying 10.1.43.165...
* Connected to nginx-proxy.example.com (10.1.43.165) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
* SSL connection using TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
* subject: CN=*.example.com,O="example, Inc.",L=New York,ST=New York,C=US
* start date: Sep 15 00:00:00 2014 GMT
* expire date: Sep 15 23:59:59 2015 GMT
* common name: *.example.com
* issuer: CN=GeoTrust SSL CA - G2,O=GeoTrust Inc.,C=US
> GET /v2/ HTTP/1.1
> User-Agent: curl/7.37.0
> Host: nginx-proxy.example.com
> Accept: */*
> \x15\x03\x01\x00\x02\x02
Если я сделаю 'curl -v docker-registry.example.com', я получу ответ 200 OK. Поэтому nginx должен нести ответственность за это. У кого-нибудь есть идея, почему это происходит? Это сводит меня с ума!
1 ответ
proxy_pass http://docker-registry.example.com:5000;
вы передаете запрос с простым HTTP (т.е. без https)
\ X15\x03\x01\x00\x02\x02
И вы получаете ответ SSL обратно. Таким образом, похоже, что вы должны использовать https://, а не http:// для доступа к порту 5000. И вы даже знаете, что используете SSL:
Реестр работает на порту 5000 и использует ключ SSL, подписанный доверенным центром сертификации...
Кроме того: пожалуйста, используйте имена, зарезервированные для примеров, таких как example.com, и не используйте доменные имена в вашем примере, которые не принадлежат вам.