docker - 通过 websockets 使用 traefik 进行 docker 内部流量
问题描述
我在集群模式下使用 docker 来处理我的应用程序中的服务,并使用 traefik 来处理流量。我的目标是为我的应用程序具有的每个 API 部分创建一个单独的服务(例如,domain.com/api/foo_api
转到foo_api
服务的请求和domain.com/api/bar_api
转到服务的请求bar_api
。
现在,使用 traefik,这一切都非常简单。但是,我还将 API 服务与与 API 无关的其他内部服务一起使用。他们使用到内部 docker URL 的 websocket 连接,所以目前它是ws://api:api_port/ws
. 但是,如果我拆分 API 部分,我需要类似的东西ws://foo_api:foo_api_port/ws
,显然让服务只能访问foo_api
,而不是其他所有的。
所以我的问题是:我可以用 traefik 路由这个 websocket 流量,类似于我在外部如何做,但在 docker 网络内部?
解决方案
Traefik 是一个南北反向代理。历史上,传统基础设施中的大多数人会使用 NGINX 或 Apache 来解决入站问题——很高兴看到您使用更现代的工具。您所描述的是 traefik 后面的防火墙内的东西向通信模式(假设您通过 traefik 控制所有入口)。
您是否考虑过通过 Hashicorp Consul - https://consul.io等工具使用服务发现和注册功能?
拥有服务发现的想法是,可以通过注册表发现和提供集群中的容器/服务,并通过名称相互引用,而无需在构建和维护复杂的名称-IP-查找时进行人工劳动. 大多数人在历史上都在 DNS SRV 后面的更持久的模型中理解这一点,该模型需要外部查询。Consul 仍然可以支持传统的参考集成。
该站点可能会帮助您:https ://attx-project.github.io/Consul-for-Service-Discovery-on-Docker-Swarm.html
他们似乎已经解决了与您类似的案例。并且通过一些调整,这项工作很可能可以重复使用。
推荐阅读
- kubernetes - kubectl apply -f 适用于 PC,但不适用于 Gitlab Runner
- shell - 通过 shell 或 linux 命令增加文件名编号
- tomcat - k8s pod启动时启动tomcat后运行脚本
- java - 无法更改 Webview 语言
- mongodb - mongo获取月份和年份范围内的数据
- python - Django Rest - 序列化器:必须是创建时的实例
- mysql - 每月统计客户无法起诉 Laravel 查询生成器
- windows - 在 Windows 10 中以高对比度的暗模式使用 Visual Studio 2019
- rancher - Rancher CLI 登录错误 - 状态 [401 未授权]。正文:[message=clusterID 不匹配]
- c# - 如何从 Windows 窗体应用程序写入文本文件