Traefik反向代理容器多站点统一入口配置教程
当你用Docker运行多个网站(比如博客、企业站、API服务),每个容器都要暴露一个端口,管理起来很麻烦。
Traefik就是专门解决这个问题的反向代理工具:它能自动发现你启动的容器,根据标签生成路由规则,还能自动申请和续签Let's Encrypt HTTPS证书。
本文一步步带你实现Traefik反向代理容器多站点统一入口,所有操作都在一台服务器上完成。
准备工作:环境和域名
- 一台安装了Docker和Docker Compose的Linux服务器(推荐Ubuntu 20.04以上)。
- 至少一个域名(比如 example.com),并把它解析到服务器IP。
- 两个测试用的子域名:
app1.example.com和app2.example.com,也解析到同一个IP。 - 确保服务器80和443端口没有被其他程序占用。
用Docker Compose启动Traefik
在你的服务器上创建一个目录,比如 ~/traefik,里面新建 docker-compose.yml,写入以下内容:
version: '3'
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/traefik.yml
- ./acme.json:/acme.json
networks:
- web
networks:
web:
external: true
注意:这里把Docker socket挂载进去,Traefik才能监听容器启动事件。
还需要创建一个名为 web 的overlay网络(后面所有服务都连到这个网络)。
创建网络命令:docker network create web。
接着创建 traefik.yml 配置文件:
api:
dashboard: true
insecure: false
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
certificatesResolvers:
letsencrypt:
acme:
email: you@example.com
storage: /acme.json
httpChallenge:
entryPoint: web
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
同时创建一个空文件 acme.json 并设置600权限:touch acme.json && chmod 600 acme.json。
启动Traefik:docker-compose up -d。
添加第一个站点:Nginx静态页
在 ~/traefik 同级目录下新建 app1 文件夹,里面创建 docker-compose.yml:
version: '3'
services:
app1:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.app1.rule=Host(`app1.example.com`)"
- "traefik.http.routers.app1.entrypoints=websecure"
- "traefik.http.routers.app1.tls.certresolver=letsencrypt"
- "traefik.http.services.app1.loadbalancer.server.port=80"
networks:
- web
networks:
web:
external: true
在 app1 目录下执行 docker-compose up -d。
Traefik会自动发现这个容器,并为 app1.example.com 生成路由,同时向Let's Encrypt申请证书。
几分钟后,访问 https://app1.example.com 就能看到Nginx默认页面。
添加第二个站点:WordPress
用同样的方式部署WordPress,只需修改域名标签。
在 app2 目录下配置WordPress的 docker-compose,标签改为:
- "traefik.http.routers.app2.rule=Host(`app2.example.com`)"
- "traefik.http.routers.app2.entrypoints=websecure"
- "traefik.http.routers.app2.tls.certresolver=letsencrypt"
- "traefik.http.services.app2.loadbalancer.server.port=80"
启动后,https://app2.example.com 也能正常访问。
所有站点的HTTPS证书都由Traefik统一管理,无需单独配置。
常见问题与避坑说明
- Dashboard安全:上面未开启Dashboard外部访问(
insecure: false),建议通过内网或增加认证访问。如需开放,可添加一个带Basic Auth的路由。 - 证书申请失败:检查域名解析是否生效,80端口是否可公网访问。Let's Encrypt的HTTP验证需要能访问到
/.well-known/acme-challenge/。 - 容器未显示在路由中:确保容器标签
traefik.enable=true且网络是web。另外Traefik默认不会暴露未被明确enable的容器。 - 端口冲突:如果服务器上已有Nginx或Apache占用了80/443,请先停止它们,或修改Traefik的端口映射。
效果验证
访问 http://app1.example.com 会自动跳转到HTTPS。
查看Traefik Dashboard(通过SSH隧道或内网访问 http://localhost:8080)能看到两个路由都显示为绿色,证书信息正常。
至此,你已搭建好Traefik反向代理容器多站点统一入口。
以后新增站点只需写一个带标签的docker-compose文件,启动后Traefik自动接入,省去手动配置Nginx的繁琐。
遇到异常时,先回到本文的避坑部分排查,大部分问题都能解决。