使用docker上托管的私有注册表

时间:2015-01-06 06:04:29

标签: docker boot2docker docker-registry

我在docker容器中托管我自己的docker-registry。它是由nginx在一个单独的容器中运行来添加基本身份验证的。检查_ping路由我可以看到nginx正确路由。从boot2docker(在Mac OSX上)调用docker login时出现此错误:

  

FATA [0003]来自守护程序的错误响应:无效的注册表端点https://www.example.com:8080/v1/:获取https://www.example.com:8080/v1/_ping:x509:由未知权限签名的证书。如果此私有注册表仅支持具有未知CA证书的HTTP或HTTPS,请将--insecure-registry www.example.com:8080添加到守护程序的参数中。对于HTTPS,如果您可以访问注册表的CA证书,则不需要该标志;只需将CA证书放在/etc/docker/certs.d/www.example.com:8080/ca.crt

这很奇怪 - 因为它是有效的CA SSL证书。我已尝试按照以下说明在EXTRA-ARGS中添加--insecure-registryhttps://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)。任何帮助和/或资源来帮助调试这将非常感激。

更新

我正在寻找帮助全面解决此问题的指南。具体做法是:

  • 创建私人注册表
  • 使用基本的Auth
  • 保护注册表
  • 使用boot2docker
  • 中的注册表

我已经创建了注册表并在本地进行了测试,但它确实有效。我已经使用nginx添加基本身份验证来保护注册表。

麻烦现在实际上是使用两种类型客户端的注册表:

1)非boot2docker客户端。 下面的答案之一有助于此。我在/ etc / default / docker中为选项添加了--insecure-registry标志,现在我可以与远程docker注册表进行通信了。 但是,这与auth不兼容,因为docker login收到错误:

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

this stack exchange问题后,我设法将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指定它们 - 而不是它们的名称。

7 个答案:

答案 0 :(得分:6)

编辑泊坞窗文件

sudo vim /etc/default/docker

添加DOCKER_OPTS

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

重新启动泊坞窗服务

sudo service docker restart

答案 1 :(得分:3)

运行以下命令:

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

答案 2 :(得分:2)

Docker版本&gt; 1.3.1连接到docker registry

时默认通过HTTPS进行通信

如果您使用Nginx将proxy_pass发送到端口5000,其中docker注册表正在侦听,则需要终止docker客户端与webserver / LB(本例中为Nginx)的docker注册表的SSL连接。要验证Nginx是否正在终止SSL连接,请使用cURL https://www.example.com:8081/something,其中8081是另一个用于测试SSL证书的端口。

如果您不关心Docker客户端是通过HTTP连接到注册表而不是HTTPS,请添加

OPTIONS =&#34; - insecure-registry www.example.com:8080"

在/ etc / sysconfig / docker(或其他发行版中的等价物)并重启docker service。

希望它有所帮助。

答案 3 :(得分: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)。

答案 4 :(得分: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"

答案 5 :(得分:2)

  1. https://letsencrypt.org/注册SSL密钥如果您需要更多说明,请参阅this link

  2. 为nginx启用SSL。注意下面代码中的SSL部分,在注册SSL密钥之后,您使用fullchain.pemprivkey.pemdhparam.pem将其用于nginx以启用SSL。

  3. `

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

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

答案 6 :(得分:1)

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

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

而不是设置EXTRA_ARGS

相关问题