Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用docker上托管的私有注册表_Docker_Boot2docker_Docker Registry - Fatal编程技术网

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

使用docker上托管的私有注册表,docker,boot2docker,docker-registry,Docker,Boot2docker,Docker Registry,我将自己的docker注册表托管在docker容器中。它前面是运行在单独容器中的nginx,用于添加基本身份验证。通过检查ping路由,我可以看到nginx的路由是正确的。从boot2docker(在Mac OSX上)调用docker login时,我收到以下错误: 来自守护程序的FATA[0003]错误响应:无效注册表终结点:Get:x509:未知授权机构签署的证书。如果此专用注册表仅支持具有未知CA证书的HTTP或HTTPS,请将--不安全注册表www.example.com:8080添加到

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

来自守护程序的FATA[0003]错误响应:无效注册表终结点:Get:x509:未知授权机构签署的证书。如果此专用注册表仅支持具有未知CA证书的HTTP或HTTPS,请将
--不安全注册表www.example.com:8080
添加到守护进程的参数中。对于HTTPS,如果您可以访问注册表的CA证书,则无需使用该标志;只需将CA证书放在/etc/docker/certs.d/www.example.com:8080/CA.crt即可

这很奇怪-因为它是一个有效的CA SSL证书。我已经尝试按照这些说明在EXTRA-ARGS中添加
--不安全注册表
:但最初“profile”文件不存在。如果我创建它,并添加

EXTRA_ARGS="--insecure-registry www.example.com:8080"
我看不出有什么改进。我想隔离这个例子,所以尝试了从ubuntu虚拟机(而不是boot2docker)登录
docker
。现在我得到一个不同的错误:

Error response from daemon: 
docker注册表直接从公共中心运行,例如

docker run -d -p 5000:5000 registry
(请注意,nginx的路线从8080到5000)。任何帮助和/或资源,以帮助调试这将不胜感激

更新

我想找一个指南来帮助全面解决这个问题。具体而言:

  • 创建私有注册表
  • 使用基本身份验证保护注册表
  • 使用boot2docker中的注册表
我已经创建了注册表并在本地进行了测试,它可以正常工作。我已经用nginx添加了basic auth来保护注册表

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

1) 非boot2docker客户端。 下面的一个答案对此很有帮助。我在/etc/default/docker中的选项中添加了--unsecureregistry标志,现在我可以和我的远程docker注册表对话了。 但是,这与身份验证不兼容,因为docker login出现错误:

2015/01/15 21:33:57 HTTP code 401, Docker will not send auth headers over HTTP.
所以,如果我想使用auth,我需要使用HTTPS。我已经有了通过HTTPS提供服务的服务器,但如果我设置--unsecureregistry,它将无法工作。似乎存在一个证书信任问题,我相信我可以在非boot2docker上解决这个问题,但是

2) 对于boot2docker客户机,我无法使不安全的注册表正常工作,也无法使证书可信

更新2

下面的问题我设法将ca添加到我的ubuntu虚拟机中,现在我可以从非boot2docker客户端使用它了。然而,仍然有很多奇怪的行为

即使我的当前用户是docker组的成员(因此我不必使用sudo),我现在也必须使用sudo,否则在尝试登录或从我的私有注册表中提取时会出现以下错误


当第一次运行从我的私有注册表中提取的容器时,我必须通过映像ID来指定它们,而不是它们的名称。

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

docker -d --insecure-registry="www.example.com:8080"
编辑docker文件,而不是设置额外参数

sudo vim /etc/default/docker
添加
DOCKER\u选项

DOCKER_OPTS="$DOCKER_OPTS --insecure-registry=www.example.com:8080"
重新启动docker服务

sudo service docker restart

Docker version>1.3.1在连接到Docker注册表时默认通过HTTPS进行通信

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

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

OPTIONS=“--不安全注册表www.example.com:8080”

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


希望有帮助。

从Docker 1.3.1版开始,如果您的注册表不支持HTTPS,则必须将其添加为不安全的注册表。对于boot2docker来说,这比平常要复杂一些。见:

相关命令包括:

$ 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
$boot2docker init
$boot2docker up
$boot2docker-ssh
$echo'EXTRA_ARGS=“--unsecure registry””| sudo tee-a/var/lib/boot2docker/profile
$sudo/etc/init.d/docker重新启动

如果您想将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"

运行以下命令:

boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE HOST>\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
boot2docker-ssh“echo$'EXTRA_ARGS=\”--unsecureregistry\“'sudo-tee-a/var/lib/boot2docker/profile&&sudo/etc/init.d/docker-restart”
  • 从注册SSL密钥如果需要更多说明,请参阅

  • 为nginx启用SSL。请注意下面代码中的SSL部分,在注册SSL密钥后,您有
    fullchain.pem
    privkey.pem
    dhparam.pem
    将其用于nginx以启用SSL

  • `


    它解决了我的问题,希望对您有所帮助。

    您重新启动docker守护进程了吗?你可以试试。可能会显示boot2docker/var/lib/boot2docker/docker.logYep中的更多日志,并多次重新启动。在不同的系统上试过,很多。日志里没有什么有趣的东西。注意,它在非boot2docker实例上也不起作用。需要检查3个日志(docker守护程序/nginx/docker注册表)。首先使用curl命令进行调试以跳过docker守护程序,这些信息对其他人的帮助仍然有限。我建议尝试使用新版本的注册表:
    docker run-d-p 5000:5000注册表:2
    。不过有点不同,所以值得看一下文档,您需要使用v1.6客户端。如何为boot2docker执行此操作?在Mac OS X上使用boot2docker时,此文件在哪里?这是一个完美的解决方案。
    boot2docker ssh "echo $'EXTRA_ARGS=\"--insecure-registry <YOUR INSECURE HOST>\"' | sudo tee -a /var/lib/boot2docker/profile && sudo /etc/init.d/docker restart"
    
    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;
        }
    }