docker在使用v2时正在使用v1注册表api

时间:2015-06-12 14:51:47

标签: docker coreos docker-registry

我正在尝试使用自托管的docker注册表v2。我应该能够推送一个docker镜像,它在运行注册表v2容器的主机服务器(coreos)上本地工作。但是,当我尝试推送到注册表时,在单独的机器(也是coreos,相同版本)上,它尝试推送到v1,给出了这个错误:

Error response from daemon: v1 ping attempt failed with error: Get 
https://172.22.22.11:5000/v1/_ping: dial tcp 172.22.22.11:5000: i/o timeout. 
If this private registry supports only HTTP or HTTPS with an unknown CA 
certificate, please add `--insecure-registry 172.22.22.11:5000` to the 
daemon's arguments. In the case of HTTPS, if you have access to the registry's 
CA certificate, no need for the flag; simply place the CA certificate at 
/etc/docker/certs.d/172.22.22.11:5000/ca.crt 

这两台机器的docker可执行文件是v1.6.2。为什么一个工作并推动v2但另一个是v1?

以下是注册表的回购:https://github.com/docker/distribution

3 个答案:

答案 0 :(得分:2)

您需要先保护注册表,然后才能远程访问它,或明确允许所有Docker守护程序访问不安全的注册表。

要保护注册表,最简单的选择是为您的服务器购买SSL证书,但您也可以自行签署证书并分发给客户。

要允许不安全的访问,请将参数--insecure-registry myregistrydomain.com:5000添加到需要访问注册表的所有守护程序。 (显然用你的域名和端口替换)。

完整说明(包括错误消息示例)位于:https://github.com/docker/distribution/blob/master/docs/deploying.md

关于错误消息,我 Docker首先尝试使用v2,因安全问题而失败,然后尝试v1并再次失败。

答案 1 :(得分:0)

这可能是由于设置了env变量。当使用具有此env变量集的系统时,我遇到了非常相似的问题。

export DOCKER_HOST="tcp://hostname:5000"

运行docker登录http://hostname:5000无效,并且具有相同的v1行为。我没想到env变量优先于直接传递给命令的参数。

答案 2 :(得分:0)

转到 /etc/docker/daemon.json 。如果文件不存在,请创建一个文件并添加以下内容

{
    "insecure-registries": ["hosted-registry-IP:port"]
}

之后,通过以下方式重启docker服务

service docker restart