traefik在linux上以二进制或容器方式直接运行,需挂载/var/run/docker.sock实现自动服务发现;配置分静态(启动参数)和动态(docker标签)两层,缺一不可;--entrypoints和--providers必须显式声明,且docker compose中labels须正确嵌套于服务块内。

Traefik 在 Linux 上不是“安装”而是“运行”——它没有传统意义上的包管理安装流程,直接以二进制或容器方式启动即可;配置分静态(启动参数/TOML)和动态(Docker标签/YAML)两层,漏掉任何一层都会导致路由不生效。
用 Docker 运行 Traefik 时必须挂载 /var/run/docker.sock
这是 Traefik 自动发现容器服务的唯一通道。不挂载会导致 providers.docker 完全失效,所有带 traefik.enable=true 标签的容器都不会被识别。
- 挂载写法必须是
-v /var/run/docker.sock:/var/run/docker.sock,路径不能错、权限不能受限(宿主机 socket 文件需对容器内 traefik 用户可读) - 若用 rootless Docker,得改用
docker.sock的 rootless 路径,比如/run/user/1000/docker.sock,且需在command中加--providers.docker.host=unix:///run/user/1000/docker.sock - 常见错误现象:
level=error msg="Provider connection error: failed to list containers: Error response from daemon: client version 1.45 is too new..."——说明 Docker API 版本不匹配,降级 Traefik 镜像版本(如用v2.10而非v3.x)或升级宿主机 Docker
--entrypoints 和 --providers 是启动必设项
没定义 entrypoint,Traefik 就不知道监听哪个端口;没启用 provider,它就看不到任何后端服务。这两项哪怕只写默认值,也必须显式声明。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 最简可用命令示例:
--entrypoints.web.address=:80 --providers.docker=true;如果还要 HTTPS,必须额外加--entrypoints.websecure.address=:443并配证书解析器 - 注意
--providers.docker.exposedbydefault=false是安全推荐项,但启用后所有容器默认不暴露,必须显式加traefik.enable=true标签才生效 - 别把
--api.insecure=true用在生产环境:它开放未鉴权的 Dashboard(端口 8080),会直接暴露全部路由和服务信息
Docker Compose 中的 labels 必须写在服务块里,且层级不能错
Traefik 只读取容器本身的 labels,不是 compose 文件顶层或 network/block 的 labels。写错位置等于没写。
- 正确结构示例(针对后端服务):
services: myapp: image: httpd labels: - "traefik.enable=true" - "traefik.http.routers.myapp.rule=Host(`app.local`)" - "traefik.http.routers.myapp.entrypoints=web" - 常见手误:
traefik.http.routers.myapp.rule=Path(`/api`)却没配entryPoints,结果请求 80 端口时 404——因为 router 没绑定到任何入口点 - 调试技巧:访问
http://localhost:8080/api/http/routers(Dashboard 关闭时也可用),看返回 JSON 里有没有你定义的 router;没有就说明 label 解析失败或 provider 未生效
Let’s Encrypt 自动证书需要 acme.json 文件持久化且权限为 600
Traefik 写入 ACME 私钥时强制检查文件权限,权限不对会静默失败,日志只报 "Unable to obtain ACME certificate",不提示具体原因。
- 必须用 volume 挂载一个宿主机文件(如
./acme.json:/acme.json),且首次运行前执行touch acme.json && chmod 600 acme.json - 若用
httpChallenge,确保entryPoints.web已监听 80 端口,且公网能直连——内网部署 + 无公网 IP 时,dnsChallenge是唯一可行方案 - 证书存储路径写错会导致反复申请:
storage值必须和 volume 挂载的目标路径一致,比如storage: "/acme.json"对应挂载/acme.json,不是/etc/traefik/acme.json
最常被忽略的是:Traefik v2+ 默认不启用 Docker provider 的 Swarm 模式,如果你用的是 Docker Compose v2+(非 Swarm mode),必须确认 --providers.docker.swarmmode=false(默认值),否则会尝试连接不存在的 Swarm API 导致启动卡住。










