traefik - 同一主机的多个端口绑定 V2

Posted

技术标签:

【中文标题】traefik - 同一主机的多个端口绑定 V2【英文标题】:traefik - multiple port bindings for the same host V2 【发布时间】:2020-05-06 21:31:53 【问题描述】:

我不知道如何在本地主机上通过 http 和 https 访问一个简单的服务。这是我目前的设置,我使用的是 traefik V2.xxx。

我希望能够同时使用 https/http 协议访问该站点(仅出于开发机器上的原因)。 https 工作得很好,但 http 不行。我需要添加/删除/更改哪些标签?

http://whoami.localhost:8000/https://whoami.localhost:8443/

docker-compose.yml

version: "3.7"

services:

  whoami:
    image: containous/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.rule=Host(`whoami.localhost`)
      - traefik.http.routers.whoami.entrypoints=web,web-secure
      - traefik.http.routers.whoami.tls=true
      - traefik.protocol=http,https

  reverse-proxy:
    depends_on:
      - whoami
    image: traefik:v2.1.1
    ports:
      - 8000:80
      - 8443:443
      - 8001:8080
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik:/etc/traefik:ro

traefik/traefik.toml

[log]
  level = "DEBUG"

[accessLog]
  filePath = "/logs/access.log"
  bufferingSize = 20

[docker]
  exposedbydefault = false

[api]
  dashboard = true
  insecure = true

[providers]
  [providers.file]
    filename = "/etc/traefik/traefik.toml"
    watch = true

  [providers.docker]
    exposedbydefault = false

[[tls.certificates]]
  certFile = "/etc/traefik/certs/localhost-cert.pem"
  keyFile = "/etc/traefik/certs/localhost-key.pem"

[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.web-secure]
    address = ":443"

C:\Windows\System32\drivers\etc\hosts

127.0.0.1 whoami.localhost

【问题讨论】:

【参考方案1】:

我就是这样做的,从我的 Docker Compose 文件开始:

# docker-compose.yml

version: '3.7'

services:
  whoami:
    image: containous/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.entryPoints=web
      - traefik.http.routers.whoami.rule=Host(`localhost`)
      - traefik.http.routers.whoami-secured.entryPoints=web-secure
      - traefik.http.routers.whoami-secured.rule=Host(`localhost`)
      - traefik.http.routers.whoami-secured.tls=true

  proxy:
    image: traefik:2.4
    ports:
      - '80:80'
      - '443:443'
      - '8080:8080'
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./docker/proxy/traefik.yml:/etc/traefik/traefik.yml
      - ./docker/proxy/dynamic_config.yml:/etc/traefik/dynamic_config.yml
      - ./docker/proxy/certs/server.crt:/etc/ssl/server.crt
      - ./docker/proxy/certs/server.key:/etc/ssl/server.key

接下来是我的静态配置文件,我在其中定义了我的入口点(除其他外):

# ./docker/proxy/traefik.yml

api:
  insecure: true

entryPoints:
  web:
    address: :80
    http:
      redirections:
        entryPoint:
          to: web-secure
          scheme: https

  web-secure:
    address: :443

log:
  level: INFO

providers:
  docker:
    exposedByDefault: false

  file:
    filename: /etc/traefik/dynamic_config.yml

动态配置文件是我配置 SSL 证书的地方。 (它们是自签名证书。):

# ./docker/proxy/dynamic_config.yml

tls:
  certificates:
    - certFile: /etc/ssl/server.crt
      keyFile: /etc/ssl/server.key

我曾经使用中间件来处理安全重定向(我在这个文件中也有),直到我偶然发现上面的配置将其设置为入口点的一部分。

【讨论】:

【参考方案2】:

实际上,您只需要 3 个标签,只要您将 websecure 入口点默认为 tls。

docker-compose.yml

version: "3.7"

services:

  whoami:
    image: containous/whoami
    labels:
      - traefik.enable=true
      - traefik.http.routers.whoami.rule=Host(`whoami.localhost`)
      - traefik.http.services.whoami.loadbalancer.port=80

  reverse-proxy:
    image: traefik:v2.1.1
    ports:
      - 8000:80
      - 8443:443
      - 8001:8080
    command: --entrypoints.web-secure.http.tls=true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik:/etc/traefik:ro

【讨论】:

【参考方案3】:

终于搞定了。 traefik 文档在某些主题上完全处于深奥领域,鉴于最近的主要 2.0 版本,还没有很多示例。

这是我的工作 docker-compose.yml 文件,现在使用同一主机“whomai.localhost”在端口 8000 (http) 和 8443 (https) 上公开应用程序。

version: "3.7"

services:

    whoami:
    image: containous/whoami
    labels:
        - traefik.enable=true
        - traefik.http.routers.whoami-http.rule=Host(`whoami.localhost`)
        - traefik.http.routers.whoami-http.entrypoints=web
        - traefik.http.routers.whoami-http.service=whoami-http-service
        - traefik.http.services.whoami-http-service.loadbalancer.server.port=80

        - traefik.http.routers.whoami-https.rule=Host(`whoami.localhost`)
        - traefik.http.routers.whoami-https.entrypoints=web-secure
        - traefik.http.routers.whoami-https.service=whoami-https-service
        - traefik.http.services.whoami-https-service.loadbalancer.server.port=80
        - traefik.http.routers.whoami-https.tls=true

    reverse-proxy:
    depends_on:
        - whoami
    image: traefik:v2.1.1
    ports:
        - 8000:80
        - 8443:443
        - 8001:8080
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
        - ./traefik:/etc/traefik:ro

trafik 2.x 中的路由器和服务可以使用 docker 标签使用任何您想要的命名约定动态创建。在这个设置中,我只称它们为whoami-httpwhoami-https 用于路由器,whoami-http-servicewhoami-https-service 用于服务。由于我动态创建自己的路由器/服务而不是使用默认值,因此必须明确告知每个服务的负载均衡器目标应用程序的服务器端口。由于 whoami 应用程序只公开了 80 端口本身,并且 TLS 在 traefik 终止,因此这被定义为 http 和 https 服务的端口 80。

上面显示的所有标签都是必需的,对于此类自定义路由器/服务设置,不能省略。

如果您想知道,我在 Windows 10 上使用 mkcert 获取有效的本地证书。

mkcert -install

mkcert -key-file traefik\certs\localhost-key.pem -cert-file traefik\certs\localhost-cert.pem whoami.localhost localhost 127.0.0.1 ::1

【讨论】:

如果尝试为 Docker Compose 服务配置 Traefik,该服务(内部)在同一网络地址上公开两个端口,并且希望正确连接公共网络地址上的两个入口点,则此示例特别有用到由一个 Docker 服务操作的这两个端口。这两个端口提供了两个不同的应用程序。在这里,这不是关于将 HTTP 映射到 HTTPS。没有找到其他示例配置正确地通知 Traefik 在不同端口情况下将多个端口合并到一个服务中。所以...谢谢。

以上是关于traefik - 同一主机的多个端口绑定 V2的主要内容,如果未能解决你的问题,请参考以下文章

如果在一个服务器上绑定多个域名?

socket中bind函数绑定的IP是啥

将(子)域绑定到 traefik 仪表板出现 503 错误

43.apache虚拟主机的使用

nginx配置虚拟主机-端口号区分

Nginx反代,后端一个IP绑定多个SSL证书,导致连接失败之解决方法:HTTPS和SNI扩展