我正在运行一个自托管的gitlab docker实例,但在遇到错误时配置注册表遇到了一些问题
Error response from daemon: Get https://example.com:4567/v2/: dial tcp <IP>:4567: connect: connection refused
用于执行docker login example.com:4567
。
所以看来我不得不以某种方式公开端口4567
。
(更好的)替代方案是为注册表配置第二个域,例如registry.example.com
。如下所示,我正在为gitlab实例使用letencrypt证书。但是如何获得注册表的第二份证书?
这就是我的docker-compose的样子-我正在使用jwilder/nginx-proxy
作为反向代理。
docker-compose.yml
gitlab:
image: gitlab/gitlab-ce:11.9.0-ce.0
container_name: gitlab
networks:
- reverse-proxy
restart: unless-stopped
ports:
- '50022:22'
volumes:
- /opt/gitlab/config:/etc/gitlab
- /opt/gitlab/logs:/var/log/gitlab
- /opt/gitlab/data:/var/opt/gitlab
- /opt/nginx/conf.d:/etc/nginx/conf.d
- /opt/nginx/certs:/etc/nginx/certs:ro
environment:
VIRTUAL_HOST: example.com
VIRTUAL_PROTO: https
VIRTUAL_PORT: 443
LETSENCRYPT_HOST: example.com
LETSENCRYPT_EMAIL: certs@example.com
gitlab.rb
external_url 'https://example.com'
nginx['redirect_http_to_https'] = true
nginx['ssl_certificate'] = '/etc/nginx/certs/example.com/fullchain.pem'
nginx['ssl_certificate_key'] = '/etc/nginx/certs/example.com/key.pem'
gitlab_rails['backup_keep_time'] = 604800
gitlab_rails['backup_path'] = '/backups'
gitlab_rails['registry_enabled'] = true
registry_external_url 'https://example.com:4567'
registry_nginx['ssl_certificate'] = "/etc/nginx/certs/example.com/fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/nginx/certs/example.com/key.pem"
第二种选择是:
registry_external_url 'https://registry.example.com'
registry_nginx['ssl_certificate'] = "/etc/nginx/certs/registry.example.com/fullchain.pem"
registry_nginx['ssl_certificate_key'] = "/etc/nginx/certs/registry.example.com/key.pem"
但是我该如何在docker-compose中进行设置?
更新
我只是通过jwilder软件包配置nginx,而无需更改任何内容。所以我的docker-compose.yml文件的这一部分看起来像这样:
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
networks:
- reverse-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /opt/nginx-proxy/vhost.d:/etc/nginx/vhost.d:rw
- /opt/nginx/certs:/etc/nginx/certs:ro
- html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
nginx-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: nginx-letsencrypt
networks:
- reverse-proxy
depends_on:
- nginx-proxy
volumes:
- /opt/nginx-proxy/vhost.d:/etc/nginx/vhost.d:rw
- html:/usr/share/nginx/html
- /opt/nginx/certs:/etc/nginx/certs:rw
- /var/run/docker.sock:/var/run/docker.sock:rw
environment:
NGINX_PROXY_CONTAINER: "nginx-proxy"
答案 0 :(得分:3)
TL; DR:
所以看来我必须以某种方式公开端口4567。
是的,但是jwilder/nginx-proxy
不支持每个虚拟主机一个以上的端口,并且端口443
已经公开。该功能有一个pull request,但尚未合并。您需要以其他方式公开此端口(请参见下文)
您正在使用jwilder/nginx-proxy
作为反向代理来访问容器中的Gitlab实例,但是在当前配置下,仅公开了端口443
:
environment:
VIRTUAL_HOST: example.com
VIRTUAL_PROTO: https
VIRTUAL_PORT: 443
所有其他Gitlab服务(包括端口4567
上的注册表)均未被代理,因此无法通过example.com
访问。
不幸的是,还不能 使用jwilder/nginx-proxy
在单个主机名上公开多个端口。该用例有一个pull request开放,但尚未合并(您不是唯一遇到这种问题的人)。
(更好的)替代方案是为注册表配置第二个域
如果您继续使用jwilder/nginx-proxy
,即使您更改了registry_external_url
,这仍然行不通,您仍然会遇到端口问题,并且无法将同一端口分配给两个不同的服务。
您可以做什么:
VIRTUAL_HOST=example.com:443,example.com:4567
之类的东西配置您的撰写内容nginx
容器,或者专门使用此配置,或者不使用重新配置整个代理方案jwilder 图片我知道这并不能提供有限的解决方案,但希望对您有所帮助。