一、架构设计思路
- 核心组件:
- Traefik v2.x:作为反向代理和入口控制器,负责动态路由、SSL 自动化、服务发现。
- Docker 容器化:将
dvwa
和ljk
应用分别容器化,通过标签声明路由规则。 - 共享网络:所有容器接入同一 Docker 网络(如
traefik-public
),确保 Traefik 能发现后端服务。
- Docker 容器化:将
- 优势:
- 自动 SSL:通过 Let’s Encrypt 自动申请和续期 HTTPS 证书。
- 动态配置:无需重启服务,通过容器标签动态更新路由规则。
- 统一入口:所有子域名(
*.liujh168.com
)通过 Traefik 统一管理。
二、部署步骤
1. 安装 Docker 和 Docker Compose
确保宿主机已安装 Docker 及 Docker Compose:
sudo apt update && sudo apt install docker.io docker-compose sudo systemctl enable --now docker
2. 部署 Traefik 反向代理
创建 traefik/docker-compose.yml
:
version: '3' services: traefik: image: traefik:v2.10 command: - --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=/letsencrypt/acme.json - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web ports: - "80:80" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./letsencrypt:/letsencrypt networks: - traefik-public networks: traefik-public: external: true # 创建外部网络(若不存在需先执行 `docker network create traefik-public`)
3. 部署 DVWA 应用
version: '3' services: dvwa: image: vulnerables/web-dvwa labels: - "traefik.enable=true" - "traefik.http.routers.dvwa.rule=Host(`dvwa.liujh168.com`)" - "traefik.http.routers.dvwa.entrypoints=websecure" - "traefik.http.routers.dvwa.tls.certresolver=letsencrypt" networks: - traefik-public networks: traefik-public: external: true
4. 部署 LJK 应用
version: '3' services: ljk: image: your-ljk-image # 替换为实际镜像 labels: - "traefik.enable=true" - "traefik.http.routers.ljk.rule=Host(`ljk.liujh168.com`)" - "traefik.http.routers.ljk.entrypoints=websecure" - "traefik.http.routers.ljk.tls.certresolver=letsencrypt" networks: - traefik-public networks: traefik-public: external: true
三、关键配置说明
- Traefik 标签解析:
traefik.enable=true
:允许 Traefik 发现此服务。traefik.http.routers.<name>.rule=Host(...)
:定义域名路由规则。tls.certresolver=letsencrypt
:启用 SSL 并指定证书解析器。
- 网络配置:
- 所有服务共享
traefik-public
网络,确保 Traefik 能访问后端容器。 - 执行
docker network create traefik-public
创建网络(若尚未存在)。
- 所有服务共享
- SSL 自动化:
- Traefik 自动通过 HTTP Challenge 验证域名所有权,并为
*.liujh168.com
申请证书。 - 证书存储在
letsencrypt/acme.json
中,需确保目录可写。
- Traefik 自动通过 HTTP Challenge 验证域名所有权,并为
四、验证与测试
- 启动所有服务:bash复制下载docker-compose -f traefik/docker-compose.yml up -d docker-compose -f dvwa/docker-compose.yml up -d docker-compose -f ljk/docker-compose.yml up -d
- 检查 Traefik Dashboard:
- 访问
http://traefik.liujh168.com:8080
(需额外配置 Dashboard 路由)。 - 确认所有路由和后端服务状态正常。
- 访问
- 验证 HTTPS:
- 访问
https://dvwa.liujh168.com
和https://ljk.liujh168.com
,检查证书有效性及应用响应。
- 访问
五、常见问题处理
- 证书申请失败:检查域名解析是否正确、防火墙是否开放 80/443 端口、ACME 邮箱配置。
- 路由不生效:确认容器标签是否正确、网络是否共享、Traefik 日志是否有错误。
- 性能优化:启用 Traefik 中间件(压缩、缓存)、调整 Docker 资源限制。
六、扩展建议
- 集中化日志:集成 ELK 或 Loki 收集容器日志。
- 监控告警:通过 Prometheus + Grafana 监控 Traefik 及容器状态。
- CI/CD 集成:使用 GitLab CI 或 GitHub Actions 实现自动化构建和部署。