Docker CE не сохраняет порт при получении токена Docker
При подключении к нашему личному реестру Docker от клиентов запросы, для которых требуется токен, перенаправляются на /v2/token
приобрести токен. Проблема в том, что эти запросы не учитывают порт, который прослушивает реестр докеров, а вместо этого подключаются к 443
вместо 5000
:
172.0.0.1 - - [19/Jun/2018:14:33:19 +1000] (docker-registry.example.com:5000 -> 127.0.0.1:5001) "GET /v2/ HTTP/1.1" 401 113 "-" "docker/18.03.0-ce go/go1.9.4 git-commit/0520e24 kernel/3.10.0-693.17.1.el7.x86_64 os/linux arch/amd64 UpstreamClient(Docker-Client/18.03.0-ce \x5C(linux\x5C))" "-"
172.0.0.1 - - [19/Jun/2018:14:33:19 +1000] (docker-registry.example.com:443 -> 127.0.0.1:8081) "GET /v2/token?scope=repository%3Acentos%3Apush%2Cpull&service=https%3A%2F%2Fdocker-registry.example.com%2Fv2%2Ftoken HTTP/1.1" 404 2013 "-" "docker/18.03.0-ce go/go1.9.4 git-commit/0520e24 kernel/3.10.0-693.17.1.el7.x86_64 os/linux arch/amd64 UpstreamClient(Docker-Client/18.03.0-ce \x5C(linux\x5C))" "-"
172.0.0.1 - - [19/Jun/2018:14:33:19 +1000] (docker-registry.example.com:443 -> 127.0.0.1:8081) "GET /v2/token?scope=repository%3Acentos%3Apush%2Cpull&service=https%3A%2F%2Fdocker-registry.example.com%2Fv2%2Ftoken HTTP/1.1" 404 2013 "-" "docker/18.03.0-ce go/go1.9.4 git-commit/0520e24 kernel/3.10.0-693.17.1.el7.x86_64 os/linux arch/amd64 UpstreamClient(Docker-Client/18.03.0-ce \x5C(linux\x5C))" "-"
Подключение к этому адресу вручную через curl
успешно, как и ожидалось:
172.0.0.1 - - [19/Jun/2018:14:34:17 +1000] (docker-registry.example.com:5000 -> 127.0.0.1:5001) "GET /v2/token?scope=repository%3Acentos%3Apush%2Cpull&service=https%3A%2F%2Fdocker-registry.example.com%2Fv2%2Ftoken HTTP/1.1" 200 60 "-" "curl/7.29.0" "-"
Наша сетевая настройка такова:
+---------------+
+----> Nexus |
+--------+ +---------+ | +---------------+
| | | | |
| Client +---------> Nginx +------+
| | | | |
+--------+ +---------+ | +---------------+
+---->Docker registry|
+---------------+
С сопоставлениями обратного прокси:
- Nexus:
0.0.0.0:443 -> localhost:8081
- Реестр Docker:
0.0.0.0:5000 -> localhost:5051
Наш конфиг nginx:
upstream docker {
server 127.0.0.1:5001;
}
server {
listen 5000 ssl;
server_name docker-registry.example.com;
ssl_certificate /etc/nginx/ssl/docker_nexus.crt;
ssl_certificate_key /etc/nginx/ssl/docker_nexus.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://docker;
}
}
upstream nexus {
server 127.0.0.1:8081;
}
server {
listen 443 ssl;
server_name docker-registry.example.com;
ssl_certificate /etc/nginx/ssl/docker_nexus.crt;
ssl_certificate_key /etc/nginx/ssl/docker_nexus.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://nexus;
}
}
Это ожидаемое поведение или в нашей конфигурации есть ошибка, которую мы пропустили?