【问题标题】:Expose port in docker-compose or configure second letsencrypt certificate在 docker-compose 中公开端口或配置第二个letsencrypt证书
【发布时间】:2019-08-14 15:10:49
【问题描述】:

我正在运行一个自托管的 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 实例使用letsencrypt证书。但是如何获得注册表的第二个证书?


这就是我的 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"

【问题讨论】:

  • 我知道您有一个域example.com 配置为指向您在Docker 中托管Gitlab 的机器和一个带有nginx 的反向代理,对吗?如果可以,能否上传相关的nginx配置?
  • @PierreB。我正在使用配置 nginx 的 jwilder 包。我不需要改变任何东西......
  • 那你的jwilder/nginx-proxy 配置是什么? (您配置了哪个主机?)这可能是代理配置的问题,它没有正确公开端口
  • @PierreB。刚刚更新了帖子以显示我如何运行 nginx 代理。我没有配置其他任何东西。只需在我的 ubuntu 服务器上运行 docker-compose 即可。一切都在注册表之外工作......
  • 感谢您提供详细信息,我试图在回答中提供一些线索

标签: docker docker-compose gitlab lets-encrypt


【解决方案1】:

TL;博士:

看来我必须以某种方式暴露端口 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 之类的内容配置您的 compose
  • 为端口 4567 手动配置反向代理 - 除了您当前专门执行此操作的配置外,您还可以使用普通的 nginx 容器,或者在不使用 jwilder 图片
  • 更新您的配置以公开 example.com:4567 而不是 example.com:443,但您将失去 HTTPS 访问权限。 (虽然它可能不是您想要的)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多