零基础搞定Traefik反向代理容器集群配置
Traefik 是一款现代反向代理与负载均衡工具,天然支持 Docker 容器自动发现。
很多朋友想用 Traefik 搭建容器集群的反向代理层,但面对一堆配置容易懵圈。
本文从零开始,用最直接的方式带你完成 Traefik 反向代理容器集群配置,每一步都附命令和配置文件,跟着操作就行。
动手前需要准备什么
- 一台装有 Docker 和 docker-compose 的 Linux 服务器(本文以 Ubuntu 22.04 为例)。
- 一个已经解析到服务器 IP 的域名(比如
traefik.example.com)。 - 开放服务器防火墙的 80 和 443 端口。
- 确保 Docker 服务运行正常:
systemctl status docker。
为了测试集群效果,我们会用两个简单的 Nginx 容器作为后端服务,再用一个 Traefik 容器做反向代理入口。
配置 Traefik 反向代理集群的完整步骤
1. 创建项目目录及配置文件
在服务器上执行:
mkdir -p ~/traefik-cluster && cd ~/traefik-cluster
新建 docker-compose.yml 文件:
version: '3'
services:
traefik:
image: traefik:v3.1
container_name: traefik
command:
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.email=your-email@example.com"
- "--certificatesresolvers.letsencrypt.acme.storage=./acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- "./acme.json:/acme.json"
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xxxxxxxxxxxxxxx"
networks:
- traefik-net
app1:
image: nginx:alpine
container_name: app1
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
- "traefik.http.services.app.loadbalancer.server.port=80"
- "traefik.http.services.app.loadbalancer.sticky.cookie=true"
networks:
- traefik-net
app2:
image: nginx:alpine
container_name: app2
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
- "traefik.http.services.app.loadbalancer.server.port=80"
- "traefik.http.services.app.loadbalancer.sticky.cookie=true"
networks:
- traefik-net
networks:
traefik-net:
driver: bridge
注意:将your-email@example.com替换为自己的邮箱,traefik.example.com替换为实际域名,并先生成 acme.json 文件(权限设为 600)
2. 初始化 acme.json 和密码
touch acme.json
chmod 600 acme.json
生成 Dashboard 的密码(使用 htpasswd 或在线工具),
将输出的加密字符串替换上面配置文件中的 $$apr1$$xxxxxxxxxxxxxxx 部分(注意 docker-compose 中 $ 需要转义为 $$)。
3. 启动集群
在 ~/traefik-cluster 目录下执行:
docker-compose up -d
等待几秒后,用 docker ps 查看三个容器是否都运行。
新手容易踩的坑
- acme.json 权限不对:LetsEncrypt 证书要求该文件权限不能高于 600,否则 Traefik 启动会报
permission denied。务必执行chmod 600 acme.json。 - Dashboard 密码配置错误:因为
docker-compose.yml里用了$$转义,如果直接复制明文密码,会报middleware auth error。建议先在外壳用echo $(htpasswd -nb admin 你的密码)获得完整字符串,再手动将$替换为$$。 - 后端服务标签重复:两个 app 容器使用相同的路由规则
Host(app.example.com)和相同的服务名app,这是正确的——Traefik 会自动合并为集群。但注意 不要在不同服务上使用相同路由规则却不同服务名,否则路由冲突。 - 网络问题:所有容器必须在同一个自定义网络中(本例为
traefik-net),否则 Traefik 无法发现后端。
如何验证配置是否成功
- 检查容器日志:
docker logs traefik --tail 20
应看到类似 Started 和 Adding route on app 的输出。
- 访问 Dashboard:
浏览器打开 https://traefik.example.com(记得先解析 DNS),输入配置的账号密码,能看到仪表盘里显示两个 HTTP 路由器和服务。
- 测试反向代理集群:
在本地编辑 hosts(或直接用域名访问 http:),
//app.example.com
多次刷新页面,
验证 Nginx 默认页来自不同的后端容器(可通过修改 Nginx 默认 index.html 加入主机名来区分)。
- HTTPS 自动证书:
访问 https://app.example.com,检查证书是否为 Let's Encrypt 颁发,并显示证书有效。
以上步骤完成后,你就拥有了一套带自动 HTTPS 的 Traefik 反向代理容器集群。
日常维护只需修改 docker-compose.yml 增减服务,Traefik 会自动感知更新。
遇到其他问题,优先看容器日志和中途提到的避坑点。