我有一个本地 Docker 群,其中有一个 Traefik 服务路由到使用 compose 文件创建的其他堆栈。虽然堆栈是使用 compose 创建的,但 Traefik 作为独立服务运行:
docker service create --name traefik \
-p 25:25 -p 80:80 -p 443:443 \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
--network traefik \
--constraint=node.role==manager \
traefik:latest \
--providers.docker=true \
--entrypoints.smtp.address=:25 \
--entrypoints.http.address=:80 \
--entrypoints.https.address=:443 \
--log.level=DEBUG
我只是想将 Mailcatcher 作为独立服务添加到群中。我不想使用撰写。
无论我尝试什么,Traefik 都坚持将 http 路由到 SMTP 端口(1025)而不是 HTTP 端口(1080)。来自 Traefik 日志:
msg="Creating load-balancer" entryPointName=http routerName=mailcatcher-1-a4m79pfmvp6ebj0ugv6qiiy7d@docker serviceName=mailcatcher-1-a4m79pfmvp6ebj0ugv6qiiy7d
msg="Creating server 0 http://10.0.0.75:1025" entryPointName=http routerName=mailcatcher-1-a4m79pfmvp6ebj0ugv6qiiy7d@docker serviceName=mailcatcher-1-ri25m46afg6kwmd5yw6yiek3y serverName=0
msg="child http://10.0.0.75:1025 now UP"
我最近尝试的方法是仅指定 http 端点,而不提及 smtp 或端口 1025:
docker service create --name mailcatcher --network traefik \
--label "traefik.enable=true" \
--label "traefik.http.routers.mailcatcher.rule=Host('mailcatcher.local')" \
--label "traefik.http.routers.mailcatcher.entrypoints=http" \
--label "traefik.http.services.mailcatcher.loadbalancer.server.port=1080" \
--label "traefik.docker.network=traefik" \
-p 1080 dockage/mailcatcher:0.9.0
Traefik 日志中的问题就摆在我面前:
msg="No entryPoint defined for this router, using the default one(s) instead: [http https smtp]" routerName=mailcatcher-1-ri25m46afg6kwmd5yw6yiek3y
我确信我错过了一些简单的事情。帮忙吗?
在 Traefik 服务上启用集群模式就可以了。
--providers.docker.swarmMode=true
更新了创建命令:
docker service create --name traefik \
-p 25:25 -p 80:80 -p 443:443 \
--mount type=bind,source=/var/run/docker.sock,destination=/var/run/docker.sock \
--network traefik \
--constraint=node.role==manager \
traefik:latest \
--providers.docker=true \
--providers.docker.swarmMode=true \
--entrypoints.smtp.address=:25 \
--entrypoints.http.address=:80 \
--entrypoints.https.address=:443 \
--log.level=DEBUG
现在 Traefik 正在做正确的事情:
msg="Creating server 0 http://10.0.8.76:1080" routerName=mailcatcher@docker serviceName=mailcatcher entryPointName=http serverName=0
当然,我还必须更新我的撰写服务的标签,以便它们位于部署密钥下(请参阅swarmMode 文档):
services:
app:
deploy:
labels:
- "traefik.enable=true"
- "traefik.http.routers.roth-mediator-app.rule=Host(`app.local`)"
- "traefik.http.services.app.loadbalancer.server.port=3000"
- "traefik.docker.network=traefik"