Traefik 结合 Docker 快速入门:用 Docker Compose 部署网关、暴露 Dashboard 并验证容器路由
Traefik 结合 Docker 快速入门用 Docker Compose 部署网关、暴露 Dashboard 并验证容器路由【免费下载链接】traefikThe Cloud Native Application Proxy项目地址: https://gitcode.com/GitHub_Trending/tr/traefik本文基于 Traefik 官方 Quick Start 指南docs/content/getting-started/docker.md讲解如何用 Docker / Docker Compose 安装 Traefik v3.7、开启仪表盘、通过容器 Label 暴露一个示例服务并验证路由生效。读完本篇你不仅能复现一套最小可用的 Traefik Docker 环境还能从源码层面理解--providers.dockertrue背后 Docker provider 是如何监听容器事件、解析 Label 并生成动态路由配置的。前置条件开始之前宿主机需要安装DockerDocker Compose可选若你打算直接用docker run部署可省略整个流程只依赖这两样。Traefik 自身以官方镜像traefik:v3.7运行Docker 是 Traefik 的“一等公民” provider它对 Docker 容器和服务提供原生支持。安装 Traefik方式一使用 Docker Compose创建一个 Docker Compose 文件如下所示# docker-compose.yml services: traefik: image: traefik:v3.7 command: - --api.insecuretrue - --providers.dockertrue - --entrypoints.web.address:80 ports: - 80:80 - 8080:8080 volumes: - /var/run/docker.sock:/var/run/docker.sock这份配置做了四件事配置项作用端口80/808080 用于普通 Web 流量由--entrypoints.web.address:80定义8080 用于仪表盘访问因为启用了--api.insecuretrue仅限开发环境--api.insecuretrue让 API 与 Dashboard 直接在名为traefik的默认入口点上无认证暴露。从源码 pkg/config/static/static_config.go 可以看到API.Insecure的官方描述即为“Activate API directly on the entryPoint named traefik”且Dashboard默认为true默认入口点地址为:8080--providers.dockertrue启用 Docker provider使 Traefik 能自动发现本机 Docker 容器挂载/var/run/docker.sock让 Traefik 容器可以访问 Docker API从而完成容器发现。注意 Docker 默认 Unix socket 正是 provider 的默认 endpointpkg/provider/docker/pdocker.go 中SetDefaults()将Endpoint设为unix:///var/run/docker.sock启动 Traefikdocker-compose up -d方式二使用 Docker CLI也可以直接用 Docker CLI 运行。先创建配置文件# traefik.yml api: insecure: true entryPoints: web: address: :80 providers: docker: {}然后启动docker run -d \ -p 80:80 \ -p 8080:8080 \ -v $PWD/traefik.yml:/etc/traefik/traefik.yml \ -v /var/run/docker.sock:/var/run/docker.sock \ traefik:v3.7该命令与 Compose 示例的配置语义完全一致暴露 80/8080 两个端口、挂载静态配置文件与 Docker socket。区别仅在于静态配置由命令行参数改为挂载的traefik.yml。暴露 Dashboard由于显式启用了 insecure 模式仪表盘 可以在无需任何认证的情况下通过 8080 端口访问。请勿在生产环境启用该标志--api.insecuretrue。在浏览器中访问http://localhost:8080/dashboard/生产环境中应使用--apitrue配合独立的traefik入口点并结合 Basic Auth、OIDC 或 JWT 等手段保护 API相关文档见 API Dashboard 参考。部署一个示例应用创建一个whoami服务Traefik 官方的请求回显容器并通过 Label 声明路由规则# whoami.yml services: whoami: image: traefik/whoami labels: - traefik.http.routers.whoami.ruleHost(whoami.localhost)这里的 Label 遵循traefik.http.routers.name.rule的命名约定当请求Host头为whoami.localhost时命中名为whoami的 HTTP Router。应用配置docker-compose -f whoami.yml up -d容器启动后Docker provider 会立即感知到该容器并将其路由配置推送给 Traefik——这一步无需重启 Traefik是 provider 的实时事件监听机制带来的能力原理见下文“源码视角”一节。验证部署使用 curl 验证应用是否被正确暴露curl http://whoami.localhost Hostname: 068c0a29a8b7 IP: 127.0.0.1 IP: ::1 IP: 192.168.147.3 RemoteAddr: 192.168.147.2:56006 GET / HTTP/1.1 Host: whoami.localhost User-Agent: curl/8.7.1 Accept: */* Accept-Encoding: gzip X-Forwarded-For: 192.168.147.1 X-Forwarded-Host: whoami.localhost X-Forwarded-Port: 80 X-Forwarded-Proto: http X-Forwarded-Server: 9232cdd4fd6c X-Real-Ip: 192.168.147.1返回体中的X-Forwarded-*/X-Real-Ip头由 Traefik 反向代理层注入说明请求确实经过了 Traefik 转发。你也可以在浏览器中打开 http://whoami.localhost 得到同样的回显接着打开 Traefik 仪表盘的HTTP Routers区域可以看到whoami.localhost这条路由由 Docker provider 管理至此你已成功部署 Traefik 并在 Docker 中完成了第一条路由配置。源码视角Docker provider 如何把容器变成路由上述“启动 whoami 后路由立即出现”并非魔法可以从源码中理清其完整链路位于 pkg/provider/docker/ 目录建立连接与初始发现。Provider.Provide()pkg/provider/docker/pdocker.go在独立协程中创建 Docker API client调用ServerVersion确认连通然后listContainers拉取全部容器交给DynConfBuilder.build()生成一份dynamic.Configuration通过configurationChan通道推给主进程。事件监听实现热更新。默认Watch trueSetDefaults()中设定pkg/provider/docker/pdocker.go。当启用 watch 时provider 通过dockerClient.Events()订阅容器事件只关心三类 actionstart、die以及以health_status开头的事件pkg/provider/docker/pdocker.go。每收到一次事件就重新列出容器、重建配置并再次写入通道——这就是 whoami 容器一启动、路由就出现在仪表盘上的原因。若整个流程出错provider 会使用指数退避backoff.RetryNotify持续重试而不是直接崩溃。Label 解码与配置构建。build()pkg/provider/docker/config.go对每个容器依次调用keepContainer()判断容器是否应被纳入受exposedByDefault/traefik.enable控制默认ExposedByDefault true即不写 Label 的容器也会被暴露用label.DecodeConfiguration()把traefik.http.*、traefik.tcp.*、traefik.udp.*等 Label 解码为结构化配置先处理 TCP/UDP 服务与路由再构建 HTTP 服务配置最后调用provider.BuildRouterConfiguration()将容器名作为 service 名、配合defaultRuleTpl模板完成 Router 与 Rule 的绑定。defaultRule 兜底。如果容器没有通过 Label 定义 ruleprovider 会套用默认规则。该模板在 pkg/provider/docker/shared.go 中定义为const DefaultTemplateRule Host({{ normalize .Name }})即默认按“归一化后的容器名作为 Host”生成规则。你还可以通过--providers.docker.defaultRule用 Go template支持 sprig 函数可访问.Name、.ContainerName、.Labels自定义兜底规则例如Host(\{{ .Name }}.example.com)。端口探测。Traefik 从 Docker API 获取容器的私有 IP 与端口容器只暴露一个端口时直接使用该端口暴露多个端口时取最小端口如同时暴露 80 与 8080 则用 80未暴露端口时需通过traefik.http.services.name.loadbalancer.server.portLabel 手动指定。以上规则与endpoint支持unix://、tcp://、ssh://、http://等 Docker API 接入方式、useBindPortIP、constraints、exposedByDefault等全部配置项说明可参考官方 provider 文档 docs/content/reference/install-configuration/providers/docker.md。安全提示挂载 docker.sock 的风险快速入门中挂载/var/run/docker.sock是为了让 Traefik 能“看到”容器但官方文档明确指出不受限制地访问 Docker API 是安全隐患——一旦 Traefik 被攻破攻击者可能借此控制宿主机Docker daemon 等价于 root 权限入口。生产环境可考虑以下缓解手段详见 Docker provider 文档的 Docker API Access 章节通过 TCP/SSH 暴露 Docker socket 而非 Unix socket配合客户端证书认证provider 的tls.ca/tls.cert/tls.key选项即为此设计用 socket proxy 类工具对 socket 的调用做鉴权与白名单过滤借助--providers.docker.constraints或exposedByDefaultfalsetraefik.enabletrue收窄 provider 的暴露范围将 socket 只暴露给 Traefik 所在的私有网络。下一步部署完成后建议按以下顺序继续深入对应官方文档路径配置 TLSdocs/content/reference/routing-configuration/http/tls/overview.md使用中间件docs/content/reference/routing-configuration/http/middlewares/overview.md启用指标采集docs/content/reference/install-configuration/observability/metrics.md深入 Docker providerdocs/content/reference/install-configuration/providers/docker.md【免费下载链接】traefikThe Cloud Native Application Proxy项目地址: https://gitcode.com/GitHub_Trending/tr/traefik创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →