2016-09-15 11 views
2

Я хотел бы запустить приватный, безопасный, аутентифицированный реестр докеров на самоисцеляющем кластере AWS ECS. Настройка кластера выполняется и работает правильно, но я изо всех сил пытался запустить registry:latest. Проблема заключалась в том, что каждый раз, когда я нажимаю изображение, нажатие blobs терпит неудачу и переходит в цикл повтора, если я не получаю таймаут.Зачем отказываться от приватного, защищенного реестра докеров?

Чтобы убедиться, что моя установка ECS не является блокировщиком, я попытался настроить все локально с помощью Docker4Mac 1.12.0-a.

Во-первых, очень простая настройка работает. Я создал свою собственную версию образа реестра, где я поместил свой комплект сертификатов TLS и ключ, а также необходимый файл htpasswd прямо в изображение. [Я знаю, это небезопасно, я просто делаю это для целей тестирования]. Так вот мой Dockerfile:

FROM registry:latest 

COPY htpasswd /etc/docker 
COPY server_bundle.pem /etc/docker 
COPY server_key.pem /etc/docker 

server_bundle.pem имеет сертификат в подстановочные для моего домена mydomain.com (CN = * mydomain.com.), Как и первый, за которым следуют промежуточные сертификаты CA, так что клиенты должны быть счастливы , Мой файл htpasswd был создан с помощью рекомендованного подхода:

docker run --entrypoint htpasswd registry:2 -Bbn heyitsme mysupersecurepassword > htpasswd 

Я строй своего имиджа:

docker build -t heyitsme/registry . 

, а потом я бег очень простой версии без TLS и аутентификация:

docker run --restart=always -p 5000:5000 heyitsme/registry 

, и я могу на самом деле потянуть, пометить и повторно нажать изображение:

docker pull alpine 
docker tag alpine localhost:5000/alpine 
docker push localhost:5000/alpine 

Это работает. Далее я делаю TLS и базовой аутентификации работу с помощью переменных окружения:

docker run -h registry.mydomain.com --name registry --restart=always -p 5000:5000 \ 
    -e REGISTRY_HTTP_HOST=http://registry.mydomain.com:5000 \ 
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/docker/server_bundle.pem \ 
    -e REGISTRY_HTTP_TLS_KEY=/etc/docker/server_key.pem \ 
    -e REGISTRY_AUTH=htpasswd \ 
    -e REGISTRY_AUTH_HTPASSWD_REALM=Registry-Realm \ 
    -e REGISTRY_AUTH_HTPASSWD_PATH=/etc/docker/htpasswd heyitsme/registry 

В настоящее время я создаю запись в /etc/hosts, который говорит:

127.0.0.1 registry.mydomain.com 

И тогда я Логин:

docker login registry.mydomain.com:5000 
Username: heyitsme 
Password: *********** 
Login Succeeded 

Итак, давайте поместим изображение и нажмите здесь:

docker tag alpine registry.mydomain.com:5000/alpine 
docker push registry.mydomain.com:5000/alpine 

The push refers to a repository [registry.mydomain.com:5000/alpine] 
4fe15f8d0ae6: Retrying in 4 seconds 

Что происходит, так это то, что клиенты-докеры пытаются вытолкнуть фрагменты и терпят неудачу. Затем он повторяет попытку и терпит неудачу, пока не получу тайм-аут. Так следующая проверка, работает ли V2 API правильно:

curl -i -XGET https://registry.mydomain.com:5000/v2/ 
HTTP/1.1 401 Unauthorized 
Content-Type: application/json; charset=utf-8 
Docker-Distribution-Api-Version: registry/2.0 
Www-Authenticate: Basic realm="Registry-Realm" 
X-Content-Type-Options: nosniff 
Date: Thu, 15 Sep 2016 10:06:04 GMT 
Content-Length: 87 

{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]} 

Хорошо, как и ожидалось. Итак, давайте авторизуем следующий раз:

curl -i -XGET https://heyitsme:[email protected]:5000/v2/ 
HTTP/1.1 200 OK 
Content-Length: 2 
Content-Type: application/json; charset=utf-8 
Docker-Distribution-Api-Version: registry/2.0 
X-Content-Type-Options: nosniff 
Date: Thu, 15 Sep 2016 10:06:16 GMT 

{}% 

Работы. Но толкание все еще терпит неудачу.

Журналы говорят:

time="2016-09-15T10:24:34Z" level=warning msg="error authorizing context: basic authentication challenge for realm \"Registry-Realm\": invalid authorization credential" go.version=go1.6.3 http.request.host="registry.mydomain.com:5000" http.request.id=6d2ec080-6824-4bf7-aac2-5af31db44877 http.request.method=GET http.request.remoteaddr="172.17.0.1:40878" http.request.uri="/v2/" http.request.useragent="docker/1.12.0 go/go1.6.3 git-commit/8eab29e kernel/4.4.15-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.0 \\(darwin\\))" instance.id=be3a8877-de64-4574-b47a-70ab036e7b79 version=v2.5.1 
172.17.0.1 - - [15/Sep/2016:10:24:34 +0000] "GET /v2/ HTTP/1.1" 401 87 "" "docker/1.12.0 go/go1.6.3 git-commit/8eab29e kernel/4.4.15-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.0 \\(darwin\\))" 
time="2016-09-15T10:24:34Z" level=info msg="response completed" go.version=go1.6.3 http.request.host="registry.mydomain.com:5000" http.request.id=8f81b455-d592-431d-b67d-0bc34155ddbf http.request.method=POST http.request.remoteaddr="172.17.0.1:40882" http.request.uri="/v2/alpine/blobs/uploads/" http.request.useragent="docker/1.12.0 go/go1.6.3 git-commit/8eab29e kernel/4.4.15-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.0 \\(darwin\\))" http.response.duration=30.515131ms http.response.status=202 http.response.written=0 instance.id=be3a8877-de64-4574-b47a-70ab036e7b79 version=v2.5.1 
172.17.0.1 - - [15/Sep/2016:10:24:34 +0000] "POST /v2/alpine/blobs/uploads/ HTTP/1.1" 202 0 "" "docker/1.12.0 go/go1.6.3 git-commit/8eab29e kernel/4.4.15-moby os/linux arch/amd64 UpstreamClient(Docker-Client/1.12.0 \\(darwin\\))" 
2016/09/15 10:24:34 http: TLS handshake error from 172.17.0.1:40886: tls: first record does not look like a TLS handshake 

Я также протестировал различные версии оригинальных registry изображений, особенно несколько версий выше 2. Все они дают ту же ошибку. Если кто-то может помочь мне в этом вопросе, это будет потрясающе.

ответ

3

Решено:

-e REGISTRY_HTTP_HOST=https://registry.mydomain.com:5000 \ 

как переменные среды сделали клеща. Только предыдущее использование http вместо https привело к сбою соединения.