web-dev-qa-db-ja.com

Dockerでホストされているプラ​​イベートレジストリの使用

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

FATA [0003]デーモンからのエラー応答:無効なレジストリエンドポイント https://www.example.com:8080/v1/ :Get https://www.example.com:8080/v1/_ping :x509:不明な機関によって署名された証明書。このプライベートレジストリが不明なCA証明書でHTTPまたはHTTPSのみをサポートする場合は、デーモンの引数に--insecure-registry www.example.com:8080を追加してください。 HTTPSの場合、レジストリのCA証明書にアクセスできれば、フラグは不要です。 /etc/docker/certs.d/www.example.com:8080/ca.crtにCA証明書を配置するだけです

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

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

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

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ログインでエラーが発生するため、これはauthと互換性がありません。

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

したがって、認証を使用する場合は、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で指定する必要があります。

16
ConfusedNoob

Dockerファイルを編集する

Sudo vim /etc/default/docker

DOCKER_OPTS

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

Dockerサービスの再起動

Sudo service docker restart
6
anish

次のコマンドを実行します。

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE Host>\"' | Sudo tee -a /var/lib/boot2docker/profile && Sudo /etc/init.d/docker restart"
3
JaTo

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"
2
Xiaokun

Dockerバージョン> 1.3.1は、Dockerレジストリに接続するときにデフォルトでHTTPSを介して通信します

Dockerレジストリが待機しているポート5000へのproxy_passにNginxを使用している場合、webserver/LB(この場合はNginx)のdockerレジストリへのdockerクライアントのSSL接続を終了する必要があります。 NginxがSSL接続を適切に終了しているかどうかを確認するには、cURL https://www.example.com:8081/something を使用します。8081は、SSL証明書をテストするために設定された別のポートです。

DockerクライアントがHTTPSではなくHTTP経由でレジストリに接続するかどうかを気にしない場合は、

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

/ etc/sysconfig/docker(または他のディストリビューションの同等のもの)で、dockerサービスを再起動します。

それが役に立てば幸い。

2
farshidlk
  1. https://letsencrypt.org/ からSSLキーを登録します。さらに手順が必要な場合は、 このリンク を参照してください。

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

`

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;
    }
}

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

2
Finn

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)。

2
scjody

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

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

EXTRA_ARGSを設定する代わりに

1
Miguel Marques