如何将 Docker、Traefik 和 Portainer 集成到一个完整的技术栈中

最后更新: 五月7 ,2026
  • Traefik 充当动态反向代理并解析 TLS 证书,而 Portainer 提供用于管理 Docker 和 Swarm 的图形界面。
  • traefik.yml、dynamic.yml 和 docker-compose.yml 的组合允许您定义入口点、安全中间件和基于标签的 HTTP/HTTPS 路由。
  • 在 Docker 独立部署或 Swarm 部署场景中,只需将服务加入代理网络并标记它们,以便 Traefik 可以安全地发现和公开它们。
  • 控制面板上使用 Let's Encrypt、专用网络和基本身份验证,为在单个服务器上部署多个应用程序构建了一个强大的环境。

Docker Portainer Traefik

使用Docker、Traefik 和 Portainer搭建现代化技术栈,是目前在单台服务器上管理容器并通过 HTTPS 公开多个服务的最简便方法之一,而且无需繁琐的配置。其优势在于,Traefik 充当动态反向代理,而 Portainer 则提供了一个非常简洁的 Web 界面来管理 Docker,如果需要,还可以管理 Swarm。

本文将向您展示如何 将 Traefik 用作 Portainer 前面的反向代理 在“经典”Docker(独立)场景和Docker Swarm集群中,如何集成TLS(自签名或Let's Encrypt),以及需要哪些配置文件(traefik.yml, dynamic.yml y docker-compose.yml)以及 Traefik 中中间件、网络和典型标签问题的一些常用技巧。

Docker、Traefik 和 Portainer 在架构中分别扮演什么角色?

在这种设置中,Docker是容器运行的基础层,Traefik 充当反向代理和负载均衡器,接收端口 80 和 443 上的所有 HTTP/HTTPS 请求,并将它们发送到相应的容器,而Portainer 提供了一个图形界面来管理镜像、容器、卷、网络以及 Docker 或 Swarm 堆栈。

其思路是使用一台运行 Docker 的主机,其中 Traefik位于“门户”处:在入口处倾听 web (80)Y websecure (443)解析 TLS 证书(通常使用 Let's Encrypt),并且由于与 Docker 提供商的集成,通过向容器添加标签自动发现您公开的服务。

另一方面,Portainer 的运行方式与另一个容器类似,但它是通过某种方式暴露出来的。 例如,一个特定的子域。 portainer.tudominio.com受 TLS 保护,并且如果需要,还可以通过 Portainer 自身登录之外的额外身份验证中间件进行保护。所有这些都由一个……协调。 泊坞窗,撰写 它定义了 Traefik、Portainer 和通用网络 proxy.

这种方法的一个明显优势是,只需向容器添加标签即可部署新服务:Traefik 会检测 Docker 中的变化,动态创建路由器、服务和中间件,几秒钟内即可启动并运行新的子域或路由,而无需手动修改静态配置文件。

Traefik 静态配置:traefik.yml

Traefik 的静态配置通常存储在类似这样的文件中。 traefik.yml它安装在容器内部。这里定义了它。 仪表板、入口点、提供程序和证书解析器 以及其他一些工具,例如 Let's Encrypt。

典型的 YAML 配置首先使用类似这样的命令激活 API 和控制面板。 api: dashboard: true这样就可以访问 Web 界面,查看路由器、服务和中间件。默认情况下,此面板未进行身份验证,因此我们稍后将介绍如何通过动态配置使用基本身份验证来保护它。

接下来,定义入口点。通常情况下,有…… 入口 web 在 80 号港口 和别的 websecure 在443中。 在 web 通常配置自动重定向。 websecure这样,所有HTTP访问都会重定向到HTTPS:

典型的大纲将包含以下部分 http.redirections.entryPoint.to: websecure 强制重定向并将所有加密流量集中在安全入口点。

websecure 提示应使用 TLS,并提供了链接。 证书解析器 (例如: letsencrypt它将负责自动管理证书。所有这些都由 ACME这是 Let's Encrypt 用于颁发和续订证书的协议。

在街区 供应商 Docker 提供程序已配置,指向套接字 unix:///var/run/docker.sock其中一个关键选项: exposedByDefault: false因此,Traefik 默认情况下不会发布所有容器;只会发布那些带有标签的容器。 traefik.enable=true您还可以配置文件提供程序(file)加载额外的动态配置,例如,从以下位置加载: /configurations/dynamic.yml.

最后,静态文件通常包含以下部分 certificatesResolversACME解析器定义位置:注册邮箱、存储文件(通常 acme.json),键类型(例如 EC384)以及验证方法(例如 httpChallenge 在入口处 web这一点很重要 设置一个真实的电子邮件 本节中,Let's Encrypt 使用它进行通知和续订;如果您留下虚拟值或格式错误的值,则在启动 Traefik 容器时可能会遇到错误。

  Windows 任务管理器:完整实用指南

除了这种 YAML 配置之外,还有一些部署方式使用 TOML 格式(traefik.toml)但逻辑是一样的:它们对解析器证书进行分段(例如) [certificatesResolvers.main.acme]),定义挑战(例如 dnsChallengeprovider = "route53")并添加默认的TLS选项,例如: 力量 minVersion = "VersionTLS13" 或者配置一个列表 cipherSuites 允许。

Docker 架构 Traefik Portainer

动态配置:中间件、TLS 和安全

Traefik 的动态部分通常放在一个类似这样的文件中: dynamic.yml由文件提供程序加载。在此处定义 中间件和 TLS 选项 无需重启 Traefik 容器即可进行修改,这对于动态调整安全性非常有用。

一个典型的例子是创建头部中间件,例如 secureHeaders它会添加与 HSTS 和强制使用 HTTPS 相关的策略。在 YAML 文件中,您可能会找到如下参数: sslRedirect: true, forceSTSHeader: true, stsIncludeSubdomains: true, stsPreload: truestsSeconds 极高(例如,一年只需几秒钟)。这从浏览器端加强了流量安全性。

另一个常见的中间件是用于基本身份验证的中间件,例如 user-auth 类型 basicAuth其中,用户列表以如下格式声明: usuario:hash哈希值通常是用以下方式生成的: htpasswd 并嵌入在文件中。此中间件通常与 Traefik 控制面板路由器关联,因此除了 HTTPS 访问外,还需要用户名和密码。

在相同的动态配置中,通常会看到一个块。 tls.options 使用默认配置文件(default例如,其中设置了支持的密码套件和最低 TLS 版本。 VersionTLS12在某些部署中,定义了多个选项(例如,一个名为“配置文件”的选项)。 tls12 和别的 default) 必要时根据不同服务调整安全级别。

在需要使用环境中 TLS 内部也 Traefik 与后端服务(例如 Portainer)之间可能会出现问题,例如这些服务没有被公共 CA 认可的证书。这时就需要用到这个选项了。 insecureSkipVerify,其配置如下 providers.http.tls 或者,在适当的 TLS 选项中,它允许 Traefik 绕过后端证书验证。这对于实验室环境或内部自签名证书非常有用,但应谨慎使用,因为它放宽了验证要求。

一个实际细节:文件 dynamic.yml 可以随时编辑。Traefik 无需重启即可重新加载动态配置,因此您可以添加或删除中间件、更改安全标头或修改基本身份验证,而不会影响代理的可用性。

在 Docker 独立容器中使用 docker-compose、Traefik 和 Portainer

在不使用 Swarm 的纯 Docker 场景下,最常见的操作是启动 Traefik 和 Portainer 均有单条 docker-compose.yml 它定义了服务和一个名为(例如)的共享桥接型网络 proxy.

该服务 特拉菲克 它通常使用官方图片,例如 traefik:latest 或者某个特定版本,例如 traefik:v3.4端口已映射。 80和443 用于网络流量,在某些情况下,还会使用端口 8080 在内部暴露控制面板。此外,还添加了该选项。 restart: unless-stopped 安全得到加强 security_opt: - no-new-privileges:true 降低容器内权限提升的风险。

关于卷,Traefik 需要挂载只读的 Docker 套接字(/var/run/docker.sock:/var/run/docker.sock:ro)为了发现容器,静态文件 traefik.yml 以及动态配置将保存的目录(./traefik-data/configurations:/configurations文件也已挂载。 acme.json这是 Traefik 存储 Let's Encrypt 颁发的证书的位置。该文件在主机上创建并赋予相应权限。 600 这样只有相应的用户才能读取和写入;如果将其设置为 644,Traefik 通常会发出警告。

特拉菲克施展魔法的关键在于 服务标签除此之外,您还会发现: traefik.enable=true (以便 Docker 提供商公开此服务), traefik.docker.network=proxy (指示 Traefik 应该使用哪个网络与容器通信),以及类似这样的路由器 traefik.http.routers.traefik-secure带有定义其入口点的标签(websecure),主机规则(例如 Host(`traefik.tudominio.com`)),相关服务(api@internal)和身份验证中间件(user-auth@file).

  最小化 Linux 安装:完整指南、用途和优势

服务 波特纳 在同一 docker-compose.yml 一般使用 portainer/portainer-ce:latest (或者如果您有许可证,则为企业版)。挂载的卷类似:Docker 套接字、数据文件夹(./portainer-data:/data)而且通常也是 /etc/localtime 这样它就能继承主机的时区。

Portainer的标签已在Traefik注册: traefik.enable=true, traefik.docker.network=proxy一款路由器 traefik.http.routers.portainer-secure 入口点 websecure 以及类似这样的主机规则 Host(`portainer.tudominio.com`)此外,还定义了 Traefik 应使用的服务,指向 Portainer 的内部端口,例如: traefik.http.services.portainer.loadbalancer.server.port=9000.

在这一切进行的同时,启动之后 docker compose up -d 在堆栈目录中,Traefik 下载镜像并创建网络。 proxy 如果它被声明为外部面板,并且在配置的子域中公开两个面板,则 借助 Let's Encrypt,实现自动 HTTPS 加密从那时起,添加新服务就变成了克隆你的项目,添加一些 Traefik 标签,然后将其连接到网络。 proxy.

Docker Swarm 场景:集群中的 Portainer 和 Traefik

启用Docker Swarm 后,情况会略有不同,因为服务会以堆栈的形式部署,网络通常基于覆盖网络。不过,Traefik 和 Portainer 的底层逻辑非常相似:Traefik 继续充当反向代理和动态服务发现器,而 Portainer 既可以独立运行,也可以在Portainer + 代理模式下运行,以管理集群中的远程节点。

在典型的 Swarm 部署中,堆栈是在应用之前创建的。 两个叠加网络 Traefik 将使用该卷在节点之间路由流量。此外,还会创建一个卷来持久化 Portainer 数据(例如)。 portainer_data)而且,如果你需要的话,还有一个 acme.json 或者 Traefik 存储证书和配置的目录。

El docker-compose.yml (然后展开) docker stack deploy 例如,使用 -c portainer.yml通常定义两种服务: Portainer代理商以模式运行 global 在所有 Linux 节点上,以及主 Portainer 服务(CE 或 EE),通常保持复制模式,但仅限于在管理器上运行。

Portainer代理挂载Docker套接字和卷目录(/var/lib/docker/volumes为了能够检查资源,它会连接到它将与 Traefik 共享的覆盖网络,例如 traefik_public主 Portainer 服务可以配置为通过 TCP 与代理通信(tcp://tasks.agent:9001事实上,在某些示例中,该命令显示为: --tlsskipverify 建议必要时跳过 TLS 验证。

无论在同一个堆栈还是另一个堆栈上,Traefik 都会以 Swarm 模式启动 Docker 提供程序 (swarmMode = true 在 TOML 或标志中的等效选项中),观察已标记的服务。其配置包括: certificatesResolvers.main.acme 对于 Let's Encrypt 来说, dnsChallenge 与这样的供应商 Route53的 如果您想通过 DNS 验证证书,并且需要一块…… tls.options 例如,在某些情况下,它是被迫的。 minVersion = "VersionTLS13" 对于默认配置文件,定义了一个显式列表。 cipherSuites 适用于 TLS 1.2 配置文件。

Portainer在Swarm旗下的品牌也遵循同样的理念: traefik.enable=true类似路由器 traefik.http.routers.portainerHost(`portainer.midominio.com`), traefik.http.routers.portainer.entrypoints=https (o websecure (根据命名规则) traefik.http.routers.portainer.tls=true 在该路由器上启用 TLS。此外,您还可以指定 证书解析器traefik.http.routers.portainer.tls.certresolver=main 如果服务内部使用 HTTPS 通信,则需要后端架构。 traefik.http.services.portainer.loadbalancer.server.scheme=https.

在 Swarm 的 Traefik 调试日志中,您将看到生成的配置:类似这样的路由器。 api y portainer已发现的服务(例如) portainer en http://10.0.1.12:9000 和服务 traefik (指向仪表盘的 8080 端口),并且,如果标签定义不明确导致问题,则会显示如下消息: “无法为路由器定义服务名称:服务过多”这通常表明路由器相关的服务存在冲突或重复。

最小示例:使用 Traefik 执行 whoami、路由和 TLS 操作

在引入 Portainer 之前,使用像图中这样非常简单的后端来尝试 Traefik 是非常实用的。 traefik/whoami它会返回有关请求的信息。这有助于您验证 Traefik 是否配置正确以及路由规则是否正常工作。

Un docker-compose.yml 基本服务可能包括 traefik 与图像 traefik:v3.4挂载 Docker 套接字并定义启动标志 --providers.docker=true, --providers.docker.exposedbydefault=false, --providers.docker.network=proxy 以及入口点 --entryPoints.web.address=:80主机上通告端口 80 和 8080,并创建了一个网络。 proxy 它还将使用该容器 whoami.

该服务 whoami 它从同一网络启动,并标记为 traefik.enable=true然后,使用标签定义一个路由器。 traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`) 并且表明您的入口点是 web如果你提出请求 curl -H "Host: whoami.docker.localhost" http://localhost/您将看到包含主机名、IP 地址、标头等信息的响应,这证实了 Traefik 路由正确。

  QNAP 安全中心抵御勒索软件:为您的 NAS 提供最高级别的保护。

从那以后,就很简单了。 按路径添加路由例如,您可以创建另一项服务。 whoami-api 使用相同的图像,在同一个网络上,并为其添加以下类型的规则: Host(`whoami.docker.localhost`) && PathPrefix(`/api`)因此,根 /whoami 原始请求 /api 将为他们服务 whoami-api您可以通过向以下地址发出请求来验证这一点: //api 与同一主机相同。

激活 TLS 在这种本地环境下,一种方法是为该域名生成自签名证书。 *.docker.localhostopenssl您创建了一个目录 certs,您生成 local.key y local.crt然后,您可以添加一个动态文件(例如)。 dynamic/tls.yml)与该部分 tls: 以及这些路线 certFile y keyFile 指向这些文件。

接下来,您需要更新 Traefik 服务定义。 docker-compose.yml 挂载文件夹 ./certs 和文件夹 ./dynamic 在容器内部,您可以使用以下方式激活安全 API: --api.dashboard=true你创建了入口点 websecure (--entryPoints.websecure.address=:443)并在那里启用 TLS --entryPoints.websecure.http.tls=true你还需要给仪表盘路由器和路由器贴上标签。 whoami 供他们使用 websecure 并有 tls=true.

一旦上线,您就可以访问了。 https://whoami.docker.localhost/ 然后使用自签名证书连接到 Traefik 面板,并接受浏览器的安全警告。这种体验与您之后在生产环境中使用 Let's Encrypt 的体验非常相似,但无需依赖公共 DNS 服务器。

最佳实践、应用部署和解决常见问题

所有这些例子中反复出现的一个模式是: Traefik 大大简化了新应用程序的部署。一旦你有了基础堆栈(Traefik + Portainer + 网络) proxy (加上证书),添加新服务通常可以归结为:

克隆项目或复制您的 docker-compose.yml 向服务器发送请求,使用以下方式将子域名指向主机的 IP 地址: 记录A 例如,在您的 DNS 中 app.tudominio.com),然后将键标签添加到服务中: traefik.enable=true, traefik.docker.network=proxy 以及一个路由器,该路由器为该子域配置了一条主机规则,指定了安全入口点。 websecure使用正确的内部端口提供服务.

例如,许多教程会演示如何部署一个小型应用程序。 FastAPI 已分离:添加了四个标签,确保其加入网络。 proxy 在该部分 networksdocker-compose.yml做完之后 docker compose up -d 该应用会自动出现在 Traefik 控制面板上,并启用 TLS。Traefik 的自动发现功能意味着您甚至无需调整其静态设置。

为确保一切顺利进行,需要注意一些细节: 请勿重复使用相同的路由器标识符 在各种应用程序中,检查每个路由器是否只关联一个服务(避免出现“服务过多”错误),使用一致的网络名称(例如, proxy 在所有你想公开的堆栈上),并且,如果你使用 Let's Encrypt,请确保 acme.json 它拥有 600 权限,并且配置的电子邮件有效。

在 Swarm 环境中,还要检查 Traefik 配置是否包含 Docker 提供程序。 swarmMode=true y watch=true以及服务的限制(例如) node.role == manager (对于 Portainer 而言)不会与 Traefik 的部署位置冲突。调试日志非常详细,但对于定位路由或 TLS 问题至关重要。

结合Docker、Traefik 和 Portainer,您可以在单个服务器上设置一个完整的轻量级编排环境,该环境具有图形化仪表板、自动证书和非常快速的部署流程,其中添加、更新或删除服务只需调整几行 YAML,然后让 Traefik 完成反向代理和 TLS 等繁琐工作即可。