【问题标题】:How to manage multiple ports exposed on port 80 with docker?如何使用 docker 管理 80 端口上暴露的多个端口?
【发布时间】:2019-09-21 18:03:25
【问题描述】:

我有以下设置:

version: '3'

services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    ports:
      - 80:80
    command:
      - --api.debug=true
      - --api.insecure=true
      - --providers.docker=true
      - --entrypoints.web.address=:80
      - --providers.docker.exposedByDefault=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - traefik.http.routers.traefik.service=api@internal
      - traefik.http.routers.traefik.rule=Host(`monitor.domain.org`)
      - traefik.http.routers.traefik.entrypoints=web
    networks:
      - web
  db:
    image: registry.domain.com/repo/db:latest
    container_name: db
    restart: always
    networks:
      - internal
  api:
    image: registry.domain.com/repo/api:latest
    container_name: api
    ports:
      - 80:3001
    volumes:
      - /root/rsa.pem:/root/certs/rsa.pem
      - /root/rsa_pub.pem:/root/certs/rsa_pub.pem
    restart: always
    depends_on:
      - db
    environment:
      - MAIL_ADDRESS=${MAIL_ADDRESS}
      - MAIL_PASSWORD=${MAIL_PASSWORD}
      - MAIL_HOST=${MAIL_HOST}
    labels:
      - traefik.http.routers.api.rule=Host(`api.domain.org`)
      - traefik.http.routers.api.entrypoints=web
    networks:
      - internal
      - web
  app:
    image: registry.domain.com/repo/app:latest
    container_name: app
    restart: always
    depends_on:
      - api
      - db
    labels:
      - traefik.http.routers.app.rule=Host(`domain.org`,`www.domain.org`)
      - traefik.http.routers.app.entrypoints=web
    networks:
      - web

networks:
  web:
    external: true
  internal:
    external: false

显然,我从 docker 那里得到一个错误,说 Bind for 0.0.0.0:80 failed: port is already allocated。单独暴露traefik 服务的port 80api 服务都可以完美地工作。如果我没有在这两个服务上公开port 80,它对它们都不起作用。在 Nginx 上运行的app 服务无需无缝暴露port 80。如何让apitraefik 服务同时在port 80 上运行?

【问题讨论】:

    标签: docker-compose port traefik


    【解决方案1】:

    实际上,您需要为 api 执行与应用程序相同的操作,通过 traefik 公开它。

    一般来说,您通常想要通过 traefik(或任何其他反向代理)公开所有集群内部服务,因此只有 traefik 应该公开给主机端口。您的所有其他服务将只注册到至少一个 traefik 的entrypoint 以获取请求。

    因此,您只需从您的 api 服务中删除 ports: - 80:3001

    将会发生的情况是,traefik 只会监听端口 80,所有具有domain.orgwww.domain.org 的 http 主机头的 traefik 将被路由到应用服务,尽管所有带有 api.domain.org 的请求都将被路由到你的 api 服务。

    如果您已完成上述操作,但无法向您的 api 服务发送请求,请分享您服务的一些日志以检查大多数情况下的错误,一些标头需要传播到后端服务才能正常工作。

    附言。您正在使用最新的 v2.0 版本的 traefik,显然将服务注册到入口点足以让 traefik 将请求路由到该服务。在以前的版本中,您应该将标签traefik.port 添加到服务中,以便宣传您的服务正在侦听的位置,这对正在发生的事情更加明确。 docs

    【讨论】:

    • 感谢您的快速答复。没错,我不需要撰写文件中的端口。 Traefik 在同时处理两个不同的网络时也遇到了问题:P
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2018-09-03
    • 2019-10-24
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多