16

docker コンテナーで独自の docker-registry をホストしています。基本認証を追加するために、別のコンテナーで実行されている nginx が前面にあります。_ping ルートを確認すると、nginx が適切にルーティングされていることがわかります。docker loginboot2docker (Mac OSX 上) から呼び出すと、次のエラーが発生します。

FATA [0003] デーモンからのエラー応答: 無効なレジストリエンドポイントです権限。このプライベート レジストリが未知の CA 証明書を使用する HTTP または HTTPS のみをサポートする場合は--insecure-registry www.example.com:8080、デーモンの引数に追加してください。HTTPS の場合、レジストリの CA 証明書にアクセスできる場合、フラグは必要ありません。CA 証明書を /etc/docker/certs.d/www.example.com:8080/ca.crt に配置するだけです。

これは奇妙なことです - それは有効な CA SSL 証明書だからです。--insecure-registry次の手順に従って EXTRA-ARGS を追加しようとしました: https://github.com/boot2docker/boot2docker#insecure-registryしかし、最初は「プロファイル」ファイルが存在しません。作成して追加すると

EXTRA_ARGS="--insecure-registry www.example.com:8080"

改善が見られません。私は例を分離したかったのでdocker login、ubuntu VM (boot2docker ではありません) から試しました。今、私は別のエラーが発生します:

Error response from daemon: 

docker レジストリは、パブリック ハブから直接実行されます。

docker run -d -p 5000:5000 registry

(nginx は 8080 から 5000 にルーティングすることに注意してください)。これをデバッグするのに役立つヘルプやリソースは大歓迎です。

アップデート

この問題を包括的に解決するのに役立つガイドを探していました。具体的には:

  • 非公開レジストリを作成する
  • 基本認証でレジストリを保護する
  • boot2docker のレジストリを使用する

レジストリを作成し、ローカルでテストしましたが、動作します。基本認証を追加するnginxでレジストリを保護しました。

問題は、実際には次の 2 種類のクライアントのレジストリを使用することです。

1) 非 boot2docker クライアント。以下の回答の1つがこれに役立ちました。/etc/default/docker のオプションに --insecure-registry フラグを追加したところ、リモートの Docker レジストリと通信できるようになりました。ただし、docker login でエラーが発生するため、これは auth と互換性がありません。

2015/01/15 21:33:57 HTTP code 401, Docker will not send auth headers over HTTP.

したがって、auth を使用する場合は、HTTPS を使用する必要があります。このサーバーは既に HTTPS 経由でサービスを提供していますが、--insecure-registry を設定すると機能しません。証明書の信頼の問題があるようですが、boot2docker 以外で解決できると確信していますが..

2) boot2docker クライアントの場合、 --insecure-registry を機能させたり、証明書を信頼したりできませんか?

更新 2

このスタック交換の質問に続いて、ca を ubuntu VM に追加することができ、boot2docker 以外のクライアントから使用できるようになりました。ただし、まだ多くの奇妙な動作があります。

現在のユーザーは docker グループのメンバーですが (sudo を使用する必要はありません)、sudo を使用する必要があります。ログインまたはプライベート レジストリからプルしようとすると、次のエラーが発生します。

user@ubuntu:~$ docker login example.com:8080
WARNING: open /home/parallels/.dockercfg: permission denied

parallels@ubuntu:~$ docker pull example.com:8080/hw:1
WARNING: open /home/parallels/.dockercfg: permission denied

また、プライベート レジストリから取得したコンテナーを初めて実行するときは、コンテナーの名前ではなく、イメージ ID でコンテナーを指定する必要があります。

4

7 に答える 7

6

ドッカーファイルを編集する

sudo vim /etc/default/docker

追加DOCKER_OPTS

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"

Docker サービスの再起動

sudo service docker restart
于 2015-01-16T03:29:17.770 に答える
2
  1. https://letsencrypt.org/から SSL キーを登録します。さらに手順が必要な場合は、このリンクを参照してください。

  2. nginx の SSL を有効にします。以下のコードの SSL 部分に注意してください。SSL キーを登録した後、それを nginx で使用して SSL を有効にしますfullchain.pemprivkey.pemdhparam.pem

`

server {
    listen 443;
    server_name docker.mydomain.com;

    # SSL
    ssl on;
    ssl_certificate /etc/nginx/conf.d/fullchain.pem;
    ssl_certificate_key /etc/nginx/conf.d/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/nginx/conf.d/dhparam.pem;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;


    # disable any limits to avoid HTTP 413 for large image uploads
    client_max_body_size 0;

    # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
    chunked_transfer_encoding on;

    location /v2/ {
        # Do not allow connections from docker 1.5 and earlier
        # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
        if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
            return 404;
        }

        # To add basic authentication to v2 use auth_basic setting plus add_header
        auth_basic "registry.localhost";
        auth_basic_user_file /etc/nginx/conf.d/registry.password;
        add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;

        proxy_pass                          http://docker-registry;
        proxy_set_header  Host              $http_host;   # required for docker client's sake
        proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }
}

それは私の問題を解決します。

于 2016-05-21T06:23:43.177 に答える
2

Docker バージョン 1.3.1 の時点で、レジストリが HTTPS をサポートしていない場合は、安全でないレジストリとして追加する必要があります。boot2docker の場合、これは通常よりも少し複雑です。参照: https://github.com/boot2docker/boot2docker#insecure-registry

関連するコマンドは次のとおりです。

$ boot2docker init
$ boot2docker up
$ boot2docker ssh
$ echo 'EXTRA_ARGS="--insecure-registry <YOUR INSECURE HOST>"' | sudo tee -a /var/lib/boot2docker/profile
$ sudo /etc/init.d/docker restart

SSL 証明書を boot2docker インスタンスに追加する場合は、似たようなものになります (boot2docker ssh の後に sudo)。

于 2015-02-13T23:51:37.367 に答える
2

ubuntu の場合、ファイル /etc/default/docker を変更してください

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=10.27.19.230:5000"

rehl の場合、ファイル /etc/sysconfig/docker を変更してください

other_args="--insecure-registry 10.27.19.230:5000"
于 2015-05-27T09:27:52.027 に答える
1

次の引数を指定してデーモンを実行してみてください。

docker -d --insecure-registry="www.example.com:8080"

設定する代わりにEXTRA_ARGS

于 2015-01-13T12:01:02.087 に答える