免责声明:我对 Docker 和 Traefik 的了解很少。我曾多次尝试遵循 Traefik 文档,但通常都会感到困惑,可能是因为我想解决的不仅仅是最简单的情况,而且我确信我缺少一些基础知识。
在我当前的设置中,我可以创建一个基于 Web(端口 80)的 Docker 服务,Traefik v2 会获取该服务,创建一个 LE 证书,从 http:80 重定向到 https:443 并公开。下面是我docker-compose.yml
为 Traefik 编写的,也是为一个可以运行的示例服务编写的。
但是,假设我的基于 Web 的服务确实想在 80 以外的端口上运行。例如,我想运行斯塔平,它在端口 8080 上运行。考虑到我目前的 SSL 设置,是否可以将它连接起来,以便我可以公开入口点http://statping.MYTLD并依赖 Traefik:1. 重定向到https://statping.MYTLD2. 获取证书,3. 公开我的 statping Docker 容器?即使底层服务未在端口 80 上运行,Traefik 是否可以处理 Acme http 挑战?我认为可以,因为我的工作示例甚至没有公开容器级别以外的端口。
注意:我最熟悉 Docker Compose,但也许对于像 statping 这样的服务,我需要弄清楚如何编写自己的 DOCKERFILE,以便我可以哄骗它在端口 80 而不是端口 8080 上运行?
谢谢您的见解!
Traefik docker-compose.yml
:
version: "3.3"
networks:
traefik:
external: true
services:
traefik:
image: "traefik:v2.3"
container_name: "traefik"
command:
#- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--entrypoints.web.http.redirections.entryPoint.to=websecure"
- "--entrypoints.web.http.redirections.entryPoint.scheme=https"
- "--entrypoints.web.http.redirections.entrypoint.permanent=true"
- "--certificatesresolvers.myresolver.acme.httpchallenge=true"
- "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
# FOR TESTING.
#- "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.myresolver.acme.email=craig@wereallconnected.ca"
- "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
样品服务docker-compose.yml
:
version: "3.3"
networks:
traefik:
external: true
services:
whoami2:
image: "traefik/whoami"
container_name: "simple-service2"
labels:
- "traefik.enable=true"
- "traefik.http.routers.whoami2.rule=Host(`whoami2.MYTLD`)"
- "traefik.http.routers.whoami2.entrypoints=websecure"
- "traefik.http.routers.whoami2.tls.certresolver=myresolver"
networks:
- traefik
restart: unless-stopped
答案1
来自traefik 文档:
如果容器公开多个端口,或者不公开任何端口,那么您必须使用标签手动指定 Traefik 应该使用哪个端口进行通信
traefik.http.services.<service_name>.loadbalancer.server.port
(在路由的专门部分中阅读有关此标签的更多信息)。
因此,如果 whoami 正在监听 8080 并且没有暴露一个端口,则应该指定标签:
"traefik.http.services.whoami2.loadbalancer.server.port=8080"