自分の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にルーティングすることに注意してください)。これをデバッグするのに役立つヘルプやリソースがあれば、大歓迎です。
[〜#〜]更新[〜#〜]
この問題を包括的に解決するためのガイドを探していました。具体的には:
レジストリを作成してローカルでテストしましたが、動作します。 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で指定する必要があります。
Dockerファイルを編集する
Sudo vim /etc/default/docker
DOCKER_OPTS
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"
Dockerサービスの再起動
Sudo service docker restart
次のコマンドを実行します。
boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE Host>\"' | Sudo tee -a /var/lib/boot2docker/profile && Sudo /etc/init.d/docker restart"
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"
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サービスを再起動します。
それが役に立てば幸い。
https://letsencrypt.org/ からSSLキーを登録します。さらに手順が必要な場合は、 このリンク を参照してください。
NginxのSSLを有効にします。以下のコードのSSL部分に注意してください。SSLキーを登録すると、fullchain.pem
、privkey.pem
、dhparam.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;
}
}
それは私の問題を解決します。
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)。
引数を指定してデーモンを実行してみてください:
docker -d --insecure-registry="www.example.com:8080"
EXTRA_ARGS
を設定する代わりに