新闻详情

新闻详情

首页 / 资讯中心 / 详情

Traefik on Docker Swarm 基础实战:使用服务标签暴露 HTTP 服务、路径路由与自签名 TLS 全流程

发布时间:2026/9/8 20:53:06来源:尧图网络
Traefik on Docker Swarm 基础实战:使用服务标签暴露 HTTP 服务、路径路由与自签名 TLS 全流程
Traefik on Docker Swarm 基础实战使用服务标签暴露 HTTP 服务、路径路由与自签名 TLS 全流程【免费下载链接】traefikThe Cloud Native Application Proxy项目地址: https://gitcode.com/GitHub_Trending/tr/traefik导读本文以 Traefik 官方文档docs/content/expose/swarm/basic.md为主线完整演示如何在 Docker Swarm 集群中通过 Traefik Proxy 暴露后端服务先用traefik/whoami打通首条 HTTP 路由并验证请求流转再基于 URL 路径实现不同服务间的分流最后用自签名证书为服务启用 HTTPS。读完本文你将掌握 Swarm 模式下“以服务service为单位、以deploy.labels为载体”的 Traefik 配置方式并能独立搭建一套可本地联调的多服务 Swarm 网关。相关源码与参考文档可继续深入 swarm provider 参考、Docker Swarm 部署指南 与本系列进阶篇 Traefik on Docker Swarm 进阶指南。前置条件在开始之前请确保环境满足已初始化 Docker Swarm 集群docker swarm init具备基本的 Docker Swarm 概念服务、任务、overlay 网络已按 Traefik Docker Swarm 部署指南 将 Traefik 部署为 Swarm 服务且静态配置中已定义web:80与websecure:443两个 entrypoint。Swarm 模式与 Docker 模式的配置差异建议先理解Traefik 通过 provider 发现后端并读取其路由配置。需要特别注意的是在 Swarm 模式下Traefik 读取的是“服务”上的标签而不是单个容器上的标签。因此使用 compose 文件部署时标签必须写在服务的deploy.labels段中而不能写在普通的labels段那是给容器用的。从源码看Traefik 的 Swarm 集成实现在 pkg/provider/docker/pswarm.go其与共享标签逻辑共用 pkg/provider/docker/shared_labels.go 中的标签解码函数分别识别traefik.enable、traefik.docker.*与traefik.swarm.*前缀的标签其中traefik.docker.*在 Swarm provider 下已标记为废弃应改用traefik.swarm.*。这也解释了为何本文与部署指南中的标签都形如traefik.enabletrue、traefik.http.routers.whoami.rule...——前者是总开关后者属于traefik.http.*动态路由命名空间与具体 provider 无关。此外Swarm API 只暴露在 manager 节点上Traefik 通常应通过deploy.placement.constraints限定运行在 manager 节点并以只读方式挂载/var/run/docker.sock具体做法见 部署指南。暴露第一个 HTTP 服务我们使用 traefik/whoami 作为演示后端。它会将收到的 HTTP 请求原样回显主机名、IP、请求头等非常适合验证 Traefik 的路由结果。如果你还没有 compose 文件请新建docker-compose.yml如果已有例如部署指南中创建的docker-compose-swarm.yaml则在其基础上补充服务services: whoami: image: traefik/whoami networks: - traefik_proxy deploy: replicas: 3 labels: - traefik.enabletrue - traefik.http.routers.whoami.ruleHost(whoami.swarm.localhost) - traefik.http.routers.whoami.entrypointsweb,websecure这里每一条标签的作用标签含义traefik.enabletrue显式允许该服务被 Traefik 发现。建议在 Traefik 静态配置中同时设置exposedbydefaultfalse让“只有打了traefik.enabletrue的服务”才会被纳入路由见 exposedByDefault 说明traefik.http.routers.whoami.ruleHost(\whoami.swarm.localhost)| 定义路由器whoami的匹配规则仅当请求 Host 为whoami.swarm.localhost 时命中traefik.http.routers.whoami.entrypointsweb,websecure将该路由器挂到已定义的 HTTP(web) 与 HTTPS(websecure) 两个入口点上其中 rule 中反引号包裹的是 Traefik 规则表达式与 Go template、正则均无关Host(...)是内建匹配函数之一。Swarm 模式下服务可多副本这里replicas: 3Traefik 会自动把该服务的多个任务放入同一个负载均衡集合中分发流量。部署栈docker stack deploy -c docker-compose.yml traefik若使用的是部署指南中的docker-compose-swarm.yaml执行docker stack deploy -c docker-compose-swarm.yaml traefik并把本文示例合入对应文件。首次部署前确保 overlay 网络traefik_proxy已创建docker network create --driver overlay --attachable traefik_proxy并且 Traefik 服务与业务服务都挂在该网络上Traefik 才能解析到各服务的地址。关于“路由器没有显式绑定 service”这一点当 Swarm 中该服务只对应一个服务即 Traefik 为该服务自动生成的服务且路由器未指定 service 时Traefik 会把唯一的服务自动关联到该路由器规则细节参见 service-by-label 说明。如果希望显式且可控可在标签中补充traefik.http.services.whoami.loadbalancer.server.port80Swarm provider 不提供端口自动探测明确端口是官方推荐做法见 Port Detection。验证服务是否可达服务暴露后即可通过whoami.swarm.localhost访问。由于本地没有对应 DNS 解析直接让 curl 携带 Host 头打到localhost即可curl -H Host: whoami.swarm.localhost http://localhost/正常响应类似Hostname: whoami.1.7c8f7tr56q3p949rscxrkp80e IP: 127.0.0.1 IP: ::1 IP: 10.0.1.8 IP: fe80::215:5dff:fe00:c9e RemoteAddr: 10.0.1.2:45098 GET / HTTP/1.1 Host: whoami.swarm.localhost User-Agent: curl/7.68.0 Accept: */* Accept-Encoding: gzip X-Forwarded-For: 10.0.1.1 X-Forwarded-Host: whoami.swarm.localhost X-Forwarded-Port: 80 X-Forwarded-Proto: http X-Forwarded-Server: 5789f594e7d5 X-Real-Ip: 10.0.1.1这份回显正是“Traefik 已成功把请求路由到 whoami 后端”的直接证据Hostname形如whoami.1.task-id说明请求落到了 Swarm 中的某个 whoami 任务副本X-Forwarded-For/X-Real-Ip表明 Traefik 在转发前按约定补充了代理头X-Forwarded-Proto: http说明请求确实经由 HTTP entrypoint 进入后续启用 TLS 后可对比看到https多次请求应看到不同Hostname不同副本被轮询直观感受 Swarm 的负载均衡。添加基于路径的路由规则单个 Host 只能服务一个入口实际部署常需要把同一域名下的流量按 URL 路径分发到不同后端典型场景包括API 版本化、前后端分离、微服务按路径拆分等。Traefik 通过PathPrefix/Path/PathRegexp等匹配函数支持这一能力完整语法参见 规则文档中的 Path、PathPrefix 与 PathRegexp 一节。继续编辑docker-compose.yml追加一个带路径规则的服务# ... # New service whoami-api: image: traefik/whoami networks: - traefik_proxy environment: - WHOAMI_NAMEAPI Service deploy: replicas: 2 labels: - traefik.enabletrue # Path-based routing - traefik.http.routers.whoami-api.ruleHost(whoami.swarm.localhost) PathPrefix(/api) - traefik.http.routers.whoami-api.entrypointsweb,websecure - traefik.http.routers.whoami-api.servicewhoami-api-svc - traefik.http.services.whoami-api-svc.loadbalancer.server.port80各标签要点路由规则升级为复合规则Host(\whoami.swarm.localhost) PathPrefix(/api)即“域名匹配且路径以/api 开头”两个条件同时满足才命中traefik.http.routers.whoami-api.servicewhoami-api-svc显式把路由器绑定到一个自定义命名的 servicetraefik.http.services.whoami-api-svc.loadbalancer.server.port80声明后端端口。这里为whoami-api显式声明 service 与端口与首例依赖“自动关联”的方式互补也演示了命名必须两端一致的规则通过环境变量WHOAMI_NAMEAPI Service给该后端打上业务标识whoami 会把它回显在响应里便于区分后端来自哪个服务。应用变更Swarm 会对既有服务做滚动更新而不是重建整个栈docker stack deploy -c docker-compose.yml traefik测试路径路由是否生效# Root path should go to the main whoami service curl -H Host: whoami.swarm.localhost http://localhost/ # /api path should go to the whoami-api service curl -H Host: whoami.swarm.localhost http://localhost/api访问/api时响应中应能看到与WHOAMI_NAMEAPI Service相关的环境变量信息API Service字样以此确认请求确实被分发到了whoami-api路径路由生效。补充说明路由优先级当Host(...)规则相同而 Path 规则不同时Traefik 会按规则长度自动计算优先级Path 规则更长、更具体则优先因此/api前缀请求会命中whoami-api其余路径回落到whoami具体计算规则见 Priority Calculation。启用 TLS自签名证书加密是网关的基本能力。本文先介绍面向本地开发的自签名证书方案下一进阶篇再介绍 Lets Encrypt 自动化签发。生成自签名证书与动态配置文件首先生成有效期一年的自签名证书覆盖*.swarm.localhost通配域名mkdir -p certs # key cert (valid for one year) openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout certs/local.key -out certs/local.crt \ -subj /CN*.swarm.localhost然后生成一段动态配置File provider告诉 Traefik 证书文件存放位置。这里把证书路径写为容器内的/certificates/# dynamic config that tells Traefik where the cert lives cat certs/tls.yml EOF tls: certificates: - certFile: /certificates/local.crt keyFile: /certificates/local.key EOFSwarm 中多个节点都要能读到证书文件比较干净的做法是使用Docker configSwarm 会把它作为只读文件分发给相应节点而非依赖每个节点本地都存在certs/目录docker config create swarm-cert.crt certs/local.crt docker config create swarm-cert.key certs/local.key docker config create swarm-tls.yml certs/tls.yml修改 Traefik 服务与 compose 根配置让 Traefik 把上面创建的 config 挂载为文件并开启 File provider 动态目录。在docker-compose.yml中做两处修改① Traefik 服务的command段追加开启 websecure entrypoint 的 TLS并声明动态配置文件目录command: # ... existing commands ... - --entryPoints.websecure.address:443 - --entryPoints.websecure.http.tlstrue - --providers.file.directory/etc/traefik/dynamic说明--providers.file.directory让 Traefik 监听该目录下的动态配置文件支持.yml/.yaml/.toml。部署指南中的 Traefik 服务使用的是.yaml后缀因此这里命名为tls.yml亦会被识别。若部署指南已通过--providers.file.filename/dynamic/tls.yaml挂载了证书动态配置则该段可与之等价不必重复。② compose 根层级声明 configs 来源configs: swarm-cert.crt: file: ./certs/local.crt swarm-cert.key: file: ./certs/local.key swarm-tls.yml: file: ./certs/tls.yml③ Traefik 服务的configs段把来源映射为容器内目标路径对应动态配置中写明的/certificates/路径configs: - source: swarm-cert.crt target: /certificates/local.crt - source: swarm-cert.key target: /certificates/local.key - source: swarm-tls.yml target: /etc/traefik/dynamic/tls.yml综合来看你的 Traefik 服务应同时具备只读的 Docker socket 挂载、web/websecure两个 entrypoint、上文的configs映射以及 manager 节点调度约束可参考 部署指南中的完整清单。重新部署并验证 HTTPSdocker stack deploy -c docker-compose.yml traefik部署完成后浏览器访问 https://whoami.swarm.localhost/ 即可看到 whoami 的回显。因为是自签名证书浏览器会弹出安全警告本地联调时接受该警告即可用 curl 验证时可加-k跳过证书校验curl -k https://whoami.swarm.localhost/对比 HTTP 与 HTTPS 两个入口观察回显中X-Forwarded-Proto从http变为https即证明请求确实经由 TLS 终止后转发到后端。小结与下一步至此你已完成 Swarm 下 Traefik 的三项基础能力服务发现与暴露通过deploy.labels让 Swarm 中的服务被 Traefik 识别并按Host规则路由基于路径的路由用 PathPrefix(...)复合规则把同一域名流量分流到不同后端TLS 加密以自签名证书 File provider 动态配置 Docker config 分发为本地 Swarm 提供 HTTPS 能力。在此基础上建议继续研读 Traefik on Docker Swarm 进阶指南那里将展开通过中间件Middleware注入安全响应头与 IP 白名单访问控制、用 Lets Encrypt 自动化签发与管理证书、为有状态应用配置会话粘滞sticky sessions、基于认证的父子路由器多层路由以及在服务层统一应用中间件等生产级话题。若需查阅 Swarm provider 的全部配置项轮询间隔、constraints、defaultRule、TLS 连接 Docker 等可直接对照 Swarm provider 官方参考文档。【免费下载链接】traefikThe Cloud Native Application Proxy项目地址: https://gitcode.com/GitHub_Trending/tr/traefik创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

antd Layout Sider 自定义折叠触发器完全指南:用 `trigger={null}` 隐藏默认触发器并接管收起/展开状态 2026/9/8 21:29:14

antd Layout Sider 自定义折叠触发器完全指南:用 `trigger={null}` 隐藏默认触发器并接管收起/展开状态

antd Layout Sider 自定义折叠触发器完全指南:用 trigger{null} 隐藏默认触发器并接管收起/展开状态 【免费下载链接】ant-design An enterprise-class UI design language and React UI library 项目地址: https://gitcode.com/GitHub_Trending/an/ant-design …

阅读更多 →
Kubernetes Windows 网络栈中的 hnslib:Host Network Service / HCN API 的 Go 接口层解析 2026/9/8 21:29:14

Kubernetes Windows 网络栈中的 hnslib:Host Network Service / HCN API 的 Go 接口层解析

Kubernetes Windows 网络栈中的 hnslib:Host Network Service / HCN API 的 Go 接口层解析 【免费下载链接】kubernetes Production-Grade Container Scheduling and Management 项目地址: https://gitcode.com/GitHub_Trending/kuber/kubernetes 本文以 Kube…

阅读更多 →
2026年跨境ERP对接平台多的有哪些?跨境电商ERP怎么选 2026/9/8 21:29:14

2026年跨境ERP对接平台多的有哪些?跨境电商ERP怎么选

判断跨境ERP"对接平台多不多",不能只看宣传数字,要看四个口径:电商平台、海关与保税仓、物流与海外仓、支付与独立站。以吉客云为例,其公开资料显示已对接超700家国内外电商、云仓及物流平台,并覆盖海关、保…

阅读更多 →
generative-ai-for-beginners 生成式 AI 应用安全防护指南:从环境变量到提示注入的加固实践 2026/9/8 21:29:14

generative-ai-for-beginners 生成式 AI 应用安全防护指南:从环境变量到提示注入的加固实践

generative-ai-for-beginners 生成式 AI 应用安全防护指南:从环境变量到提示注入的加固实践 【免费下载链接】generative-ai-for-beginners 21 Lessons, Get Started Building with Generative AI 项目地址: https://gitcode.com/GitHub_Trending/ge/generative-…

阅读更多 →
Ultralytics Hailo 推理后端 HailoBackend:HEF 模型加载与七任务主机端解码实现 2026/9/8 21:29:14

Ultralytics Hailo 推理后端 HailoBackend:HEF 模型加载与七任务主机端解码实现

Ultralytics Hailo 推理后端 HailoBackend:HEF 模型加载与七任务主机端解码实现 【免费下载链接】ultralytics Ultralytics YOLO26, YOLO11, YOLOv8 — object detection, instance segmentation, semantic segmentation, image classification, pose estimation, o…

阅读更多 →
水波透射系数仿真:散射矩阵级联与光学类比的Matlab实现 2026/9/8 21:26:13

水波透射系数仿真:散射矩阵级联与光学类比的Matlab实现

前一阵子我给学生演示怎么在Matlab里算水波碰到一排垂直薄板后的透射系数。这个题目在各种代码分享网站上挂了很久,很多人打开源码后根本不理解里面那堆传递矩阵是干什么的。更有意思的是它被挂在“光学”分类下,一开始我也觉得奇怪,等建模做…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞