请注意,这是一个 Traefik V2 问题。我在 V1 上有一个解决方案,但 V2 是一个彻底的重整。
以上应该将http://whoami.mysite.com重定向到 http s ://whoami.mysite.com。
没有其他文件。一切都在这个 Docker-compose.yml 中,因为它是准备进一步部署的测试。
version: "3.3"
services:
traefik:
image: "traefik:v2.0"
container_name: "traefik"
command:
- "--log.level=DEBUG"
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.web-secure.address=:443"
- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge=true"
- "--certificatesresolvers.myhttpchallenge.acme.httpchallenge.entrypoint=web-secure"
#- "--certificatesresolvers.myhttpchallenge.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
- "--certificatesresolvers.myhttpchallenge.acme.email=me@mail.com"
- "--certificatesresolvers.myhttpchallenge.acme.storage=/letsencrypt/acme.json"
labels:
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- "./letsencrypt:/letsencrypt"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
whoami:
image: "containous/whoami"
container_name: "whoami"
labels:
- "traefik.enable=true"
- …Run Code Online (Sandbox Code Playgroud) 目标是使用Linux服务器和运行Docker For Windows的Windows 10计算机运行混合OS Docker swarm
目前,只要将--endpoint-mode标志设置为'dnsrr',Windows工作者理论上就支持混合操作系统群.这在这里解释.然而,尝试使用traefik路由到简单的码头工人图像stefanscherer/whoami图像失败.
// On (Linux) Manager Node:
docker swarm init --advertise-addr <hostaddress> --listen-addr <hostaddress>:2377
// On (Windows 10) Worker Node:
docker swarm join <jointoken>
// On Manager Node:
docker network create --driver=overlay traefik-net
docker service create \
--name traefik \
--constraint=node.role==manager \
--publish 80:80 --publish 8080:8080 \
--mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \
--network traefik-net \
traefik \
--docker \
--docker.swarmmode \
--docker.domain=traefik \
--docker.watch \
--web
docker service create \
--name whoami …Run Code Online (Sandbox Code Playgroud) 我有一个设置mailcow与traefik的问题,我遇到网关超时.我也有nextcloud的这个问题,所以我真的很感兴趣,是什么导致网关超时这些问题.
我想这与端口9000和php-fpm上游或者某事有关.
但我想知道,以及如何处理它.
我的traefik.toml:
debug = true
checkNewVersion = true
defaultEntryPoints = ["http", "https"]
[web]
address = ":8080"
[web.auth.basic]
users = ["admin:undecipherablestring"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[acme]
email = "email@address.com"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
[[acme.domains]]
main = "main.com"
sans = ["monitor.main.com", "ports.main.com", "git.main.com", "cloud.main.com", "mail.main.com"]
Run Code Online (Sandbox Code Playgroud)
我的traefik docker-compose.yml:
version: '2'
services:
proxy:
image: traefik
container_name: traefik
restart: always
command: |-
--docker
--docker.domain=docker.localhost
--logLevel=DEBUG …Run Code Online (Sandbox Code Playgroud) 我可以将Traefik用于网站,因为它们在连接时使用标题.但是我希望有多个不同的SQL Server实例通过docker运行,这些实例将在外部可用(在docker主机之外,可能在本地网络之外)
那么,是否有任何东西允许连接到在同一个docker实例上运行的不同sql server实例,而不必为它们提供不同的端口或外部ip地址,以便有人可以访问
sql01.docker.local,1433和sql02.docker.local,1433从SQL工具.
开始附加问题
由于一直没有回复也许有办法有不同的情况,如:sql.docker.local\instance1和sql.docker.local\instance2,虽然我想,也可能是不可能的
结束附加问题
这是我试图使用的docker-compose文件的一个例子(之前我意识到对sql server的查询不通过主机头发送 - 或者我错了吗?)
version: '2.1'
services:
traefik:
container_name: traefik
image: stefanscherer/traefik-windows
command: --docker.endpoint=tcp://172.28.80.1:2375 --logLevel=DEBUG
ports:
- "8080:8080"
- "80:80"
- "1433:1433"
volumes:
- ./runtest:C:/etc/traefik
- C:/Users/mvukomanovic.admin/.docker:C:/etc/ssl
networks:
- default
restart: unless-stopped
labels:
- "traefik.enable=false"
whoami:
image: stefanscherer/whoami
labels:
- "traefik.backend=whoami"
- "traefik.frontend.entryPoints=http"
- "traefik.port=8080"
- "traefik.frontend.rule=Host:whoami.docker.local"
networks:
- default
restart: unless-stopped
sql01:
image: microsoft/mssql-server-windows-developer
environment:
- ACCEPT_EULA=Y
hostname: sql01
domainname: sql01.local
networks:
- default …Run Code Online (Sandbox Code Playgroud) 我尝试在版本 2 中设置 Traefik,但DNS_PROBE_FINISHED_NXDOMAIN在我的浏览器中只收到“404 Page not found”或错误。
当我检查路由器的 API 端点时,我可以看到在 Traefik 中启用了我的两个容器并且规则是正确的。
curl http://localhost:8080/api/http/routers
[{"entryPoints":["web","secure"],"service":"gotify-gotify","rule":"Host(`sub2.example.org`)","tls":{"certResolver":"letsencrypt"},"status":"enabled","using":["secure","web"],"name":"gotify@docker","provider":"docker"},{"entryPoints":["web","secure"],"service":"nextcloud-cloud","rule":"Host(`sub.example.org`)","tls":{"certResolver":"letsencrypt"},"status":"enabled","using":["secure","web"],"name":"nextcloud@docker","provider":"docker"}]
Run Code Online (Sandbox Code Playgroud)
但是在“sub2”上我根本没有网站,在“sub”上我得到“404页面未找到”。我为“*”设置了 DNS 条目,因此所有子域都转到同一服务器。
我为 docker 容器设置了以下标签
labels:
traefik.enable: true
traefik.http.routers.nextcloud.rule: "Host(`sub.example.org`)"
traefik.http.routers.nextcloud.entrypoints: "web, secure"
traefik.http.routers.nextcloud.tls.certresolver: "letsencrypt"
Run Code Online (Sandbox Code Playgroud)
这是我的 Traefik 配置traefik.toml
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.secure]
address = ":443"
[providers.docker]
exposedByDefault = false
network = "traefik"
[certificatesResolvers.letsencrypt.acme]
email = "me@example.org"
storage = "acme.json"
[certificatesResolvers.letsencrypt.acme.httpChallenge]
entryPoint = "web"
[api]
insecure = true
debug = true
dashboard = false
Run Code Online (Sandbox Code Playgroud)
Traefik 本身作为 docker 容器运行。
version: …Run Code Online (Sandbox Code Playgroud) 我正在尝试配置Traefik,以便我可以通过域名访问服务,并且不必设置不同的端口。例如,两个 MongoDB 服务,都在默认端口上,但在不同的域中,example.localhost并且example2.localhost. 只有这个例子有效。我的意思是,其他情况可能有效,但我无法连接到它们,我不明白问题是什么。这可能甚至不是 Traefik 的问题。
我准备了一个包含一个有效示例的存储库。您只需要使用mkcert生成您自己的证书。页面example.localhost返回403 Forbidden错误,但您不必担心,因为此配置的目的是显示 SSL 正在工作(挂锁,绿色状态)。所以不要专注于403.
只有到mongo服务的 SSL 连接有效。我用Robo 3T程序对其进行了测试。选择 SSL 连接后,提供主机example.localhost并为自签名(或自己的)连接选择证书即可。这是唯一有效的方法。无论我是否提供证书,与redis(Redis 桌面管理器)和pgsql(PhpStorm、DBeaver、DbVisualizer)的连接都不起作用。我不将 SSL 转发到服务,我只连接到 Traefik。我花了很长时间在上面。我在互联网上搜索。我还没有找到答案。有没有人解决过这个问题?
附注。我在 Linux Mint 上工作,所以我的配置应该可以在这个环境中正常工作,没有任何问题。我会要求 Linux 的解决方案。
如果您不想浏览存储库,我附上最重要的文件:
docker-compose.yml
version: "3.7"
services:
traefik:
image: traefik:v2.0
ports:
- 80:80
- 443:443
- 8080:8080
- 6379:6379
- …Run Code Online (Sandbox Code Playgroud) 根据文档,你应该能够让Traefik使用以下方法执行302重定向:
traefik.ingress.kubernetes.io/redirect-regextraefik.ingress.kubernetes.io/redirect-replacement我的目标是简单地www.从地址中删除.
这是我尝试过的,但我找不到404服务.
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: www-redirect
namespace: public
annotations:
kubernetes.io/ingress.class: traefik
traefik.ingress.kubernetes.io/redirect-regex: ^https?://www.example.com/(.*)
traefik.ingress.kubernetes.io/redirect-replacement: https://example.com/$1
spec:
rules:
- host: www.example.com
Run Code Online (Sandbox Code Playgroud)
不幸的是,文档没有明确说明如何使用它们.在撰写本文时,唯一的谷歌就是文档(上图).
我目前的工作(假设它将有助于解释问题)是将www.流量路由到返回302的nginx.
server {
listen 80;
server_name www.example.com;
return 302 https://example.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)
这看起来有点矫枉过正.
你好我试着在kubernetes traefik ingress的注释中查看auth选项.我找不到任何可以配置前向身份验证的内容,如下所示:https://docs.traefik.io/configuration/entrypoints/#forward-authentication
我希望能够为每个入口资源配置转发身份验证.这在nginx入口控制器中是可能的.
目前是否支持?
我想访问互联网上而不是我的 docker 网络上的 Keycloak 服务器。我想将 Keycloak 服务器的域隐藏在我自己的域后面。因此,如果我访问 http://localhost/auth/ 那么应该显示来自 Keycloak 服务器的页面。我不想重定向到实际的 Keycloak 服务器。

我已经尝试过以下配置,但它不起作用。当我访问 http://localhost/auth 时,我收到“404 页面未找到”。我希望你可以帮助我。非常感谢您的帮助 :)
docker-compose.yml
version: "3.7"
services:
proxy:
image: traefik:v2.2
command:
- "--api.insecure=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--providers.file=true"
- "--providers.file.filename=/etc/traefik/rules.yml"
- "--entrypoints.web.address=:80"
ports:
- 80:80
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./rules.yml:/etc/traefik/rules.yml
website:
image: containous/whoami
labels:
- "traefik.enable=true"
- "traefik.http.routers.website.rule=Host(`localhost`)"
- "traefik.http.routers.website.entrypoints=web"
Run Code Online (Sandbox Code Playgroud)
规则.yml
http:
routers:
my-route:
rule: "Host(`localhost`) && PathPrefix(`/auth`)"
service: my-keycloak-server
services:
my-keycloak-server:
loadBalancer:
servers:
- url: "https://keycloak.domain.com/auth"
Run Code Online (Sandbox Code Playgroud) 所以我正在尝试使用traefik作为反向代理在docker swarm上建立一个gitlab-ce实例.
这是我的代理堆栈;
version: '3'
services:
traefik:
image: traefik:alpine
command: --entryPoints="Name:http Address::80 Redirect.EntryPoint:https" --entryPoints="Name:https Address::443 TLS" --defaultentrypoints="http,https" --acme --acme.acmelogging="true" --acme.email="freelyformd@gmail.com" --acme.entrypoint="https" --acme.storage="acme.json" --acme.onhostrule="true" --docker --docker.swarmmode --docker.domain="mydomain.com" --docker.watch --web
ports:
- 80:80
- 443:443
- 8080:8080
networks:
- traefik-net
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints:
- node.role == manager
networks:
traefik-net:
external: true
Run Code Online (Sandbox Code Playgroud)
还有我的gitlab堆栈
version: '3'
services:
omnibus:
image: 'gitlab/gitlab-ce:latest'
hostname: 'lab.mydomain.com'
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://lab.mydomain.com'
nginx['listen_port'] = 80
nginx['listen_https'] = false
registry_external_url 'https://registry.mydomain.com'
registry_nginx['listen_port'] = 80
registry_nginx['listen_https'] = false …Run Code Online (Sandbox Code Playgroud) traefik ×10
docker ×5
docker-swarm ×2
kubernetes ×2
bad-gateway ×1
fpm ×1
gitlab ×1
networking ×1
nextcloud ×1
postgresql ×1
sql-server ×1
ssl ×1
tcp ×1
tcp-ip ×1