5

セルフヒーリング AWS ECS クラスターで、プライベートで安全な、認証済みの Docker レジストリを実行したいと考えています。クラスターのセットアップは完了し、正常に動作しますが、実行するのに苦労しましたregistry:latest。問題は、イメージをプッシュするたびにブロブのプッシュが失敗し、タイムアウトしない限り再試行サイクルに入ることでした。

私の 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最初の証明書として私のドメイン(CN=*.mydomain.com)のワイルドカード証明書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

何が起こるかというと、docker クライアントがフラグメントをプッシュしようとして失敗します。その後、タイムアウトになるまで再試行して失敗します。次に、V2API が適切に動作するかどうかを確認します。

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:mysupersecretpassword@registry.mydomain.com: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。すべて同じエラーが発生します。誰かがその問題について私を助けることができれば、それは素晴らしいことです.

4

2 に答える 2

9

解決済み:

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

環境変数がダニをしたように。http代わりにを以前に使用しただけでhttps、接続が失敗しました。

于 2016-09-19T08:04:44.713 に答える