Gitlab CE:如何配置 Docker 注册表

Gitlab CE : how to configure Docker registry

我疯狂地尝试 运行 本地 Gitlab CE omnibus 实例及其 Docker 注册表和自签名证书。

我创建了证书、密钥、Docker 网络,并从 Docker 映像安装了 Gitlab,如下所示:

docker run --hostname gitlab \
           --name gitlab \
           --net-alias=gitlab \
           --detach \
           --restart always \
           --net gitlabnetwork \
           --ip 172.50.0.10 \
           --publish 4443:443 \
           --publish 5005:5005 \
           --volume /tmp/gitlabConfig/:/etc/gitlab \
           --volume /tmp/gitlabLogs/:/var/log/gitlab \
           --volume /tmp/gitlabData/:/var/opt/gitlab \
           gitlab/gitlab-ce

我在 /etc/hosts 中添加了一个条目,如下所示:

127.0.0.1 gitlab

Gitlab 似乎在 https://gitlab:4443 上运行良好,使用 GUI 一切正常。但我无法访问注册表。在登录期间 docker 错误消息如下:

$ docker login https://gitlab:5005
Error response from daemon: Get https://gitlab:5005/v2/: Get https://gitlab/jwt/auth?account=root&client_id=docker&offline_token=true&service=container_registry: dial tcp 127.0.0.0.1:443: connect: connection refused

与 docker 登录相同的结果 https://127.0.0.1:5005

gitlab_registry_access.log 记录:

172.50.0.1 - - [19/Sep/2019:15:41:17 +0000] "GET /v2/ HTTP/1.1" 401 87 "" "docker/18.09.7 go/go1.10.1 git-commit/2d0083d kernel/4.15.0-62-generic os/linux arch/amd64 UpstreamClient(Docker-Client/18.09.7 \x5C(linux\x5C))"

这里是文件的参数 gitlab.rb :

external_url 'https://gitlab'
registry_external_url 'https://gitlab:5005'
registry_nginx['enable'] = true
registry_nginx['ssl_certificate'] = '/etc/gitlab/ssl/gitlab.crt'
registry_nginx['ssl_certificate_key'] = '/etc/gitlab/ssl/gitlab.key'
registry_nginx['listen_port'] = '5005'
registry_nginx['listen_https'] = true

我已经阅读并重新阅读了该文档,但我不知道如何摆脱它。 欢迎任何帮助。

更新:

前进。我认为问题出在 /var/opt/gitlab/registry/config.yml 文件中的配置:

auth:
  token:
    realm: https://gitlab/jwt/auth
    ...

好像没有考虑自定义端口。我觉得应该是

   realm: https://gitlab:4443/jwt/auth

我尝试手动编辑它,但 gitlab-ctl reconfigure 覆盖了它...

问题可能是自签名证书

https://docs.docker.com/registry/insecure/#use-self-signed-certificates

您必须创建证书的副本才能让 Docker 信任它。将其复制到 Docker 主机上的 /etc/docker/certs.d/gitlab:5005/ca.crt。

我已经有一段时间没有这样做了,但我似乎记得在我们最终让它工作之前有点棘手。确保将正确的文件复制到正确的位置。

好的,解决了!

这里明确提到了问题:https://gitlab.com/gitlab-org/gitlab-foss/issues/22707 and here: Gitlab docker and external_url

问题是在注册表验证阶段使用的是内部地址。

在我的例子中,Docker 客户端试图在端口 443 上加入身份验证 API,由于容器可通过端口 4443(映射到 443)访问,因此无法访问。

结论:external_url端口和容器的监听端口必须一致

我这样修改了 gitlab.rb(不需要其他 registry_nginx 设置):

external_url "https://gitlab:4443
registry_external_url "https://gitlab:5005

关于容器的启动:

--publish 4443:4443