16

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

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 证书。我已尝试--insecure-registry按照以下说明添加 EXTRA-ARGS:https ://github.com/boot2docker/boot2docker#insecure-registry但最初“配置文件”文件不存在。如果我创建它并添加

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

我看没有改善。我想隔离该示例,因此尝试docker login使用 ubuntu VM(不是 boot2docker)。现在我得到一个不同的错误:

Error response from daemon: 

docker 注册表直接从公共集线器运行,例如

docker run -d -p 5000:5000 registry

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

更新

我正在寻找一个指南来帮助全面解决这个问题。具体来说:

  • 创建私有注册表
  • 使用基本身份验证保护注册表
  • 使用 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.

所以,如果我想使用身份验证,我需要使用 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 指定它们 - 而不是它们的名称。

4

7 回答 7

6

编辑泊坞窗文件

sudo vim /etc/default/docker

添加DOCKER_OPTS

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

重启 docker 服务

sudo service docker restart
于 2015-01-16T03:29:17.770 回答
3

运行以下命令:

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE HOST>\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
于 2015-06-10T19:15:02.680 回答
2

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

如果您使用 Nginx 将代理传递到 docker 注册表正在侦听的端口 5000,您将需要终止 docker 客户端与 webserver/LB 上的 docker 注册表的 SSL 连接(在本例中为 Nginx)。要验证 Nginx 是否能够很好地终止 SSL 连接,请使用 cURL https://www.example.com:8081/something,其中 8081 是为测试 SSL 证书而设置的另一个端口。

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

选项="--insecure-registry www.example.com:8080"

在 /etc/sysconfig/docker (或其他发行版中的等效项)中并重新启动 docker 服务。

希望能帮助到你。

于 2015-01-16T03:59:52.193 回答
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)。

于 2015-02-13T23:51:37.367 回答
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"
于 2015-05-27T09:27:52.027 回答
2
  1. 从https://letsencrypt.org/注册 SSL 密钥如果您需要更多说明,请参阅此链接

  2. 为 nginx 启用 SSL。注意下面代码中的 SSL 部分,注册 SSL key 后,你就有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;
    }
}

解决了我的问题,希望对你有帮助。

于 2016-05-21T06:23:43.177 回答
1

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

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

而不是设置EXTRA_ARGS

于 2015-01-13T12:01:02.087 回答