使用 Traefik v2.x 实现容器化部署

一、架构设计思路

  1. 核心组件
  2. Traefik v2.x:作为反向代理和入口控制器,负责动态路由、SSL 自动化、服务发现。
    • Docker 容器化:将 dvwa 和 ljk 应用分别容器化,通过标签声明路由规则。
    • 共享网络:所有容器接入同一 Docker 网络(如 traefik-public),确保 Traefik 能发现后端服务。
  3. 优势
    • 自动 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

三、关键配置说明

  1. Traefik 标签解析
    • traefik.enable=true:允许 Traefik 发现此服务。
    • traefik.http.routers.<name>.rule=Host(...):定义域名路由规则。
    • tls.certresolver=letsencrypt:启用 SSL 并指定证书解析器。
  2. 网络配置
    • 所有服务共享 traefik-public 网络,确保 Traefik 能访问后端容器。
    • 执行 docker network create traefik-public 创建网络(若尚未存在)。
  3. SSL 自动化
    • Traefik 自动通过 HTTP Challenge 验证域名所有权,并为 *.liujh168.com 申请证书。
    • 证书存储在 letsencrypt/acme.json 中,需确保目录可写。

四、验证与测试

  1. 启动所有服务: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
  2. 检查 Traefik Dashboard
    • 访问 http://traefik.liujh168.com:8080(需额外配置 Dashboard 路由)。
    • 确认所有路由和后端服务状态正常。
  3. 验证 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 实现自动化构建和部署。

作者: cavalier

能源行业从业者,业余爱好象棋、C++还有二胡、乒乓也很喜欢

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注