冒险岛079

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6|回复: 0

Docker与Traefik反向代理:自动HTTPS入门

[复制链接]

621

主题

13

回帖

1987

积分

管理员

积分
1987
发表于 昨天 08:46 | 显示全部楼层 |阅读模式
每次新上一个服务,就要打开 Nginx 配置文件,复制一段
  1. server
复制代码
块,改域名、改端口、改
  1. proxy_pass
复制代码
,再手动跑一遍 Certbot 签证书——这套流程你是不是已经重复了几十次?

Traefik 干的事情,就是让你再也不用碰这些。

它监听 Docker 的事件,容器一启动,路由自动生成,HTTPS 证书自动签发。你唯一要做的,是在
  1. docker-compose.yml
复制代码
里加几行标签。

━━━━━━━━━━━━━━━━━━━━

为什么选 Traefik 而不是 Nginx

先说清楚:Nginx 本身没毛病,性能强悍、生态成熟。但在 Docker 多服务场景下,它有一个根本性的痛点——它不认识 Docker

每新增一个服务,你需要:

  • 手动编写反向代理配置
  • 手动申请 / 续期 SSL 证书
  • 手动 reload 使配置生效

    Traefik 的核心优势在三个字:自动化

    | 对比项 | Nginx + Certbot | Traefik |
    |---|---|---|
    | 服务发现 | 手动配置 | 自动监听 Docker API |
    | HTTPS 证书 | 手动申请 + 定时续期 | Let's Encrypt 全自动 |
    | 新增服务 | 改配置 + reload | 加 Label 启动即生效 |
    | 配置方式 | 配置文件 | Docker Labels / 文件 / API |

    一句话总结:Nginx 是手动挡,Traefik 是自动挡。 城市通勤(频繁增删服务),自动挡省心太多。

    ━━━━━━━━━━━━━━━━━━━━

    Traefik 的核心概念

    在动手之前,花两分钟搞懂四个关键词,后面的配置就不会一头雾水。

    EntryPoints:流量入口

    就是 Traefik 监听的端口。最常见的配置是两个:
    1. 80
    复制代码
    (HTTP)和
    1. 443
    复制代码
    (HTTPS)。

    Routers:路由规则

    决定"什么样的请求,送到哪个服务"。比如域名是
    1. app.example.com
    复制代码
    的请求,路由到你的 Web 应用容器。

    Services:后端服务

    实际处理请求的目标,对应你的 Docker 容器。Traefik 会自动发现容器暴露的端口,把请求转发过去。

    Middlewares:中间件

    在请求到达服务之前做一些处理,比如 HTTP 跳转 HTTPS、添加请求头、限流、Basic Auth 等。

    整个流程就是:请求进入 EntryPoint → Router 匹配规则 → Middleware 预处理 → 转发到 Service。

    像一条流水线,每个环节各司其职。

    ━━━━━━━━━━━━━━━━━━━━

    实战:从零搭建 Traefik + 自动 HTTPS

    第一步:准备目录结构
    1. mkdir -p ~/traefik && cd ~/traefik
    2. touch docker-compose.yml
    3. touch acme.json
    4. chmod 600 acme.json
    复制代码
    1. acme.json
    复制代码
    用来存储 Let's Encrypt 颁发的证书,权限必须是 600,否则 Traefik 会拒绝启动。

    第二步:编写 Traefik 的 docker-compose.yml
    1. version: "3.8"
    2. services:
    3.   traefik:
    4.     image: traefik:v3.1
    5.     container_name: traefik
    6.     restart: unless-stopped
    7.     command:
    8.       - "--api.dashboard=true"
    9.       - "--providers.docker=true"
    10.       - "--providers.docker.exposedbydefault=false"
    11.       - "--entrypoints.web.address=:80"
    12.       - "--entrypoints.websecure.address=:443"
    13.       - "--certificatesresolvers.letsencrypt.acme.email=you@example.com"
    14.       - "--certificatesresolvers.letsencrypt.acme.storage=/acme.json"
    15.       - "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
    16.     ports:
    17.       - "80:80"
    18.       - "443:443"
    19.     volumes:
    20.       - /var/run/docker.sock:/var/run/docker.sock:ro
    21.       - ./acme.json:/acme.json
    22.     labels:
    23.       - "traefik.enable=true"
    24.       # Dashboard 路由(可选)
    25.       - "traefik.http.routers.dashboard.rule=Host(`traefik.example.com`)"
    26.       - "traefik.http.routers.dashboard.entrypoints=websecure"
    27.       - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
    28.       - "traefik.http.routers.dashboard.service=api@internal"
    29. networks:
    30.   default:
    31.     name: traefik-net
    32.     external: true
    复制代码

    几个关键配置解释一下:

    1. providers.docker=true
    复制代码
    :告诉 Traefik 从 Docker 自动发现服务
    1. exposedbydefault=false
    复制代码
    :不自动暴露所有容器,只有显式声明
    1. traefik.enable=true
    复制代码
    的才会被代理(安全最佳实践)
    1. httpchallenge.entrypoint=web
    复制代码
    :使用 HTTP-01 验证方式申请证书,Let's Encrypt 会访问你的 80 端口进行验证

    启动前先创建 Docker 网络:
    1. docker network create traefik-net
    复制代码

    然后启动 Traefik:
    1. docker compose up -d
    复制代码

    第三步:部署一个业务服务

    假设你有一个 Web 应用,想通过
    1. app.example.com
    复制代码
    访问。在项目目录下创建
    1. docker-compose.yml
    复制代码

    1. version: "3.8"
    2. services:
    3.   webapp:
    4.     image: your-app-image:latest
    5.     container_name: webapp
    6.     restart: unless-stopped
    7.     labels:
    8.       - "traefik.enable=true"
    9.       - "traefik.http.routers.webapp.rule=Host(`app.example.com`)"
    10.       - "traefik.http.routers.webapp.entrypoints=websecure"
    11.       - "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
    12.       - "traefik.http.services.webapp.loadbalancer.server.port=3000"
    13. networks:
    14.   default:
    15.     name: traefik-net
    16.     external: true
    复制代码

    注意两点

  • 业务容器必须加入
    1. traefik-net
    复制代码
    网络,否则 Traefik 无法转发请求
    1. loadbalancer.server.port
    复制代码
    指定容器内部监听的端口,不是宿主机映射端口

    执行
    1. docker compose up -d
    复制代码
    ,等待几秒钟,访问
    1. https://app.example.com
    复制代码
    ——证书已经自动签好了。

    没有改任何 Traefik 的配置文件。 这就是自动服务发现的魅力。

    ━━━━━━━━━━━━━━━━━━━━

    全局 HTTP 跳转 HTTPS

    现在访问
    1. http://app.example.com
    复制代码
    还是会停留在 HTTP。加一个全局中间件搞定:

    在 Traefik 的
    1. command
    复制代码
    中追加一行:
    1. - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
    复制代码

    重启 Traefik 后,所有 80 端口的请求会自动 301 跳转到 443。一行配置,全局生效。

    ━━━━━━━━━━━━━━━━━━━━

    常见问题排查

    证书申请失败

    90% 的原因是域名的 DNS 没有正确解析到服务器 IP。Let's Encrypt 的 HTTP-01 验证需要从公网访问你的 80 端口。

    排查清单

  • 域名 A 记录是否指向服务器公网 IP
  • 服务器防火墙是否放行 80 和 443 端口
    1. acme.json
    复制代码
    权限是否为 600

    容器启动了但访问 502

    Traefik 找到了路由规则,但无法连接到后端服务。通常是以下原因:

  • 业务容器和 Traefik 不在同一个 Docker 网络
    1. loadbalancer.server.port
    复制代码
    写的端口与容器实际监听的端口不一致

    Dashboard 无法访问

    确认 Dashboard 的域名已解析,并且 Labels 中的域名与你访问的一致。生产环境强烈建议给 Dashboard 加上 BasicAuth 中间件,否则任何人都能看到你的路由拓扑。

    ━━━━━━━━━━━━━━━━━━━━

    多服务扩展:加一个服务有多简单

    当你要部署第二个服务(比如
    1. api.example.com
    复制代码
    ),只需要:
    1. labels:
    2.   - "traefik.enable=true"
    3.   - "traefik.http.routers.api.rule=Host(`api.example.com`)"
    4.   - "traefik.http.routers.api.entrypoints=websecure"
    5.   - "traefik.http.routers.api.tls.certresolver=letsencrypt"
    6.   - "traefik.http.services.api.loadbalancer.server.port=8080"
    复制代码

    五行 Labels,启动容器,证书自动签发,路由自动生效。

    不改 Traefik 配置,不 reload 任何服务。

    如果同一个服务跑了多个副本(
    1. docker compose up --scale webapp=3
    复制代码
    ),Traefik 会自动对这三个容器做负载均衡,默认轮询策略,不需要额外配置。

    ━━━━━━━━━━━━━━━━━━━━

    写在最后

    Traefik 并不是要"取代" Nginx。如果你只有一两个静态站点,Nginx 依然简单好用。

    但当你的服务器上跑着 5 个、10 个甚至更多 Docker 服务,每个都需要独立域名和 HTTPS 证书时,Traefik 的自动化能力会帮你省下大量重复劳动。

    把时间花在写代码上,别花在写 Nginx 配置上。
    建议下一步:阅读 Traefik 官方文档中 Middlewares 章节,了解限流、IP 白名单、请求头重写等进阶用法——这些才是生产环境真正需要的安全加固手段。
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    果子博客
    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-3-25 04:17 , Processed in 0.114838 second(s), 19 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表