我将自己的 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 指定它们 - 而不是它们的名称。