我正在尝试配置docker stack以立即运行我的一些应用程序 . 它将被部署到同一台机器上的多个客户,这有点复杂 - 3个API服务和两个网站 .

我想为每个客户创建堆栈以限制为新客户配置此应用程序所需的开销 - 由于堆栈我可以立即运行这些api和网站,提供环境变量 .

我的 生产环境 机器只有一个公共IP . 我有安装了swarm模式的docker(它需要使用堆栈) . Hovewer我的蜂群只是一台机器,我认为这是很长一段时间 - 我只是不需要更多的资源 .

简化的撰写文件(仅有2个服务)如下所示:

version: "3.2"
services:
  auth_api:
    image: my-registry/auth-api:latest
    stdin_open: true
    tty: true
    ports:
      - 8010:80
    deploy:
      mode: global
    environment:
      - some_var
    volumes:
      - /var/my-app/${INSTANCE_NAME}:/store
    secrets:
      - auth_certificate

  office_web:
    image: my-registry/office-web:latest
    stdin_open: true
    tty: true
    ports:
      - 8012:80
    deploy:
      mode: global

secrets:
  auth_certificate:
    external:
      name: ${INSTANCE_NAME}-auth-identity-certificate

创建此堆栈,我的应用程序在服务器公共IP上可用,端口8080和8081是不良行为 .

假设:我的Web服务器有一个公共IP: A.B.C.D 我配置DNS将两个子域指向我的Web服务器:

A.B.C.D api.example.com

A.B.C.D web.example.com

我想像这样配置整个堆栈和Web服务器:

  • service auth_api仅在端口80上使用主机名配置api.example.com在公共IP上公开

  • service office_web仅在端口80上使用主机名配置web.example.com在公共IP上公开

  • 两个服务都无法在公共IP上的已发布端口上访问 - 8080,8081

  • 当我为新客户创建新堆栈时我想't 1415079 (reverse proxy?) to automatically populate new public hostname bindings; I can provide them as labels/env variables when creating stack but I don' t想要在我的compose yaml文件旁边手动编辑别的东西

我怎样才能做到这一点?在没有swarm模式和堆栈的情况下,我使用了jwilder / nginx-proxy工作得很好但是这个伟大的docker镜像不支持堆栈(swarm模式) .

我不知道从哪里开始,在“非群集模式”中,我可以使用127.0.0.1:8080:80格式的端口配置,并且我的容器在公共IP上无法访问 . 我使用了jwilder / nginx-proxy,它自动填充容器IP并使用作为env变量传递的主机名将公共IP绑定到它 .

我怎样才能达到类似的效果?