我在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-registry
:https://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)。任何帮助和/或资源来帮助调试这将非常感激。
更新
我正在寻找帮助全面解决此问题的指南。具体做法是:
我已经创建了注册表并在本地进行了测试,但它确实有效。我已经使用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指定它们 - 而不是它们的名称。
答案 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)
从https://letsencrypt.org/注册SSL密钥如果您需要更多说明,请参阅this link。
为nginx启用SSL。注意下面代码中的SSL部分,在注册SSL密钥之后,您使用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;
}
}
它解决了我的问题,希望它可以帮助你。
答案 6 :(得分:1)
尝试使用args运行守护程序:
docker -d --insecure-registry="www.example.com:8080"
而不是设置EXTRA_ARGS