使用托pipe在docker上的私有registry

我在Docker容器中托pipe我自己的dockerregistry。 它由运行在单独容器中的nginx来添加基本身份validation。 检查_ping路由我可以看到,nginx是适当的路由。 当从boot2docker(在Mac OSX上)调用docker docker login ,出现以下错误:

 FATA[0003] Error response from daemon: Invalid registry endpoint https://www.example.com:8080/v1/: Get https://www.example.com:8080/v1/_ping: x509: certificate signed by unknown authority. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry www.example.com:8080` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/www.example.com:8080/ca.crt 

这很奇怪,因为这是一个有效的CA SSL证书。 我已经尝试在EXTRA-ARGS中添加–insecure-registry,按照以下说明操作: https : //github.com/boot2docker/boot2docker#insecure-registry,但最初“configuration文件”文件不存在。 如果我创build它,并添加

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

我看不出有什么改进。 我想孤立的例子,所以尝试从Ubuntu的VM(不是boot2docker) docker login 。 现在我得到一个不同的错误:

 Error response from daemon: 

dockerregistry直接从公共中心运行,例如

docker运行-d -p 5000:5000registry

(注意从8080到5000的nginx路由)。 任何帮助和/或资源来帮助debugging,将不胜感激。

UPDATE

我期待着一个指导,帮助全面解决这个问题。 特别:

  • 创build一个私人registry
  • 使用基本身份validation来保护registry
  • 从boot2docker使用registry

我已经创build了registry并进行了本地testing,它的工作原理 我已经通过添加基本身份validation的nginx获得了registry。

麻烦现在实际上是从两种types的客户端使用registry:

1)非boot2docker客户端。 下面的答案之一帮助了这一点。 我添加了–insecure-registry标志到/ etc / default / docker中的选项,现在我可以和我的远程dockerregistry交谈了。 但是,这与validation不兼容,因为dockerlogin出现错误:

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

所以,如果我想使用身份validation,我需要使用HTTPS。 我已经有这台服务器通过HTTPS服务,但如果我设置–insecureregistry不起作用。 似乎有一个证书信任问题,我相信我可以在非boot2docker上解决,但..

2)对于一个boot2docker客户端,我不能让–insecure-registry工作或证书被信任?

更新2

在这个堆栈交换问题之后,我设法将ca添加到我的ubuntu虚拟机,现在我可以使用非boot2docker客户端。 但是,还是有很多奇怪的行为。

即使我目前的用户是docker组的成员(所以我不必使用sudo),我现在必须使用sudo,或者在尝试login或从我的私有registry中拔出时出现以下错误

 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 

而当第一次从我的私人registry中运行容器时,我必须通过图像ID指定它们 – 而不是它们的名称。

编辑docker文件

 sudo vim /etc/default/docker 

添加DOCKER_OPTS

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

重新启动泊坞窗服务

 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" 

Docker版本> 1.3.1在连接到dockerregistry时默认通过HTTPS进行通信

如果您正在使用Nginx将proxy_pass传送到dockerregistry正在监听的端口5000,则需要将docker客户端的SSL连接终止到webserver / LB(本例中为Nginx)的dockerregistry。 要validationNginx是否正在终止SSL连接,请使用cURL https://www.example.com:8081/something其中8081是设置用于testingSSL证书的另一个端口&#x3002;

如果你不关心你的docker客户端通过HTTP连接到registry,而不是HTTPS,添加

OPTIONS =“ – insecure-registry http://www.example.com:8080&#x201D;

在/ etc / sysconfig / docker(或其他发行版中的等价物)中,然后重新启动docker服务。

希望能帮助到你。

从Docker版本1.3.1开始,如果您的registry不支持HTTPS,则必须将其添加为不安全的registry。 对于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)。

对于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" 
  1. https://letsencrypt.org/注册SSL密钥。如果您需要更多说明,请参阅此链&#x63A5; 。

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

它解决了我的问题,希望它能帮助你。

尝试使用args运行守护进程:

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

而不是设置EXTRA_ARGS