我正在尝试使用自托管的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
答案 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