在docker中公开端口,以撰写或配置第二个Letencrypt证书

时间:2019-03-24 00:59:11

标签: docker docker-compose gitlab lets-encrypt

我正在运行一个自托管的gitlab docker实例,但在遇到错误时配置注册表遇到了一些问题

Error response from daemon: Get https://example.com:4567/v2/: dial tcp <IP>:4567: connect: connection refused

用于执行docker login example.com:4567

  1. 所以看来我不得不以某种方式公开端口4567

  2. (更好的)替代方案是为注册表配置第二个域,例如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"

1 个答案:

答案 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,这仍然行不通,您仍然会遇到端口问题,并且无法将同一端口分配给两个不同的服务。

您可以做什么:

  • 对要合并的PR进行投票和评论:)
  • 尝试从提到的pull request's fork构建Docker映像,并使用VIRTUAL_HOST=example.com:443,example.com:4567之类的东西配置您的撰写内容
  • 手动配置端口4567的反向代理-您可以在当前配置的基础上附加一个普通的nginx容器,或者专门使用此配置,或者不使用重新配置整个代理方案jwilder 图片
  • 更新您的配置以暴露example.com:4567而不是example.com:443,但您将失去HTTPS访问权限。 (尽管可能不是您要找的东西)

我知道这并不能提供有限的解决方案,但希望对您有所帮助。