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-http
和whoami-https
用于路由器,whoami-http-service
和whoami-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的主要内容,如果未能解决你的问题,请参考以下文章