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

我在一个单独的容器中运行的nginx前面添加基本身份验证的'm hosting my own docker-registry in a docker container. It' . 检查_ping路由我可以看到nginx正确路由 . 从boot2docker(在Mac OSX上)调用 docker login 时出现此错误:

FATA来自守护程序的错误响应:无效的注册表 endpoints 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

这是奇怪的 - 因为's a valid CA SSL cert. I'已尝试按照这些说明在EXTRA-ARGS中添加 --insecure-registryhttps://github.com/boot2docker/boot2docker#insecure-registry但最初'profile'文件不存在 . 如果我创建它,并添加

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) . 任何帮助和/或资源来帮助调试这将非常感激 .

UPDATE

我正在寻找一个帮助全面解决这个问题的指南 . 特别:

  • 创建一个私人注册表

  • 使用基本身份验证保护注册表

  • 使用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工作或证书被信任?

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

2 years ago

编辑docker文件

sudo vim /etc/default/docker

添加 DOCKER_OPTS

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

重新启动docker服务

sudo service docker restart

2 years ago

运行以下命令:

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

2 years ago

当连接到docker注册表时,Docker版本> 1.3.1默认通过HTTPS进行通信

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

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

OPTIONS =“ - insecure-registry www.example.com:8080”

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

希望能帮助到你 .

2 years ago

从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 years ago

对于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 years ago

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

  • 为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 years ago

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

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

而不是设置 EXTRA_ARGS