ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

阿里云上用 Docker-compose 部署 Traefik 代理服务器:从安装到配置的完整实践

阿里云上用 Docker-compose 部署 Traefik 代理服务器:从安装到配置的完整实践 1. 阿里云 ECS 上为什么值得用 Docker-compose 跑 Traefik 反向代理如果你在阿里云 ECS 上跑过几个 Web 服务大概率遇到过这种局面80 端口被 Nginx 占着每加一个站点就要改一次配置文件、reload 一次想上 HTTPS 又得手动申请证书、配 certbot 定时任务容器重启后 IP 变了Nginx 里的 upstream 还得跟着改。服务一多配置文件就成了没人敢动的祖传代码。Traefik 解决的就是这个问题。它是一款云原生边缘路由器本质是一个反向代理服务器但它和 Nginx 最大的区别在于它能直接监听 Docker 事件容器一起来路由规则自动生效容器一销毁路由自动摘除。你不需要手动维护 upstream 列表也不用 reload。对于在阿里云 ECS 上用 Docker 部署多个服务的场景这套机制能省掉大量重复劳动。这篇要交付的东西很具体在阿里云 ECS 上用 Docker-compose 从零搭一套 Traefik 反向代理包含 Docker 与 Compose 最新版的安装、目录结构规划、静态配置与动态配置的拆分、路由规则编写、阿里云 DNS 证书自动签发最后用 curl 验证整条链路跑通。适合已经在阿里云买了 ECS、会用基本 Linux 命令、想把手上一堆容器服务统一收口到一个入口的读者。全程命令可直接复制配置骨架可直接改域名使用。我试过在一台 2 核 4G 的 ECS 上同时挂 Traefik 加五六个后端服务内存占用稳定在 200MB 出头对个人项目和小团队来说完全够用。下面按实际操作顺序展开。2. 前置准备阿里云 ECS 安全组、Docker 与 Compose 最新版安装动手之前先把地基打好。这一节的三件事缺一不可安全组放行端口、装 Docker、把 docker-compose 升到最新版。很多人卡在最后一步因为系统自带的 compose 版本太老语法和字段都不支持。2.1 阿里云安全组放行 80 和 443Traefik 要对外提供 HTTP 和 HTTPS 服务ECS 的安全组入方向必须放行 80 和 443。登录阿里云控制台进入 ECS 实例详情找到「安全组」→「配置规则」→「入方向」添加两条规则协议类型端口范围授权对象说明TCP80/800.0.0.0/0HTTP 入口TCP443/4430.0.0.0/0HTTPS 入口注意安全组规则是 ECS 层面的防火墙和系统内的 firewalld/ufw 是两回事。两个都要放行只改一个照样连不上。如果你系统里开了 firewalld记得firewall-cmd --add-port80/tcp --permanent和443一起加然后 reload。2.2 安装 Docker阿里云 ECS 的 CentOS/Alibaba Cloud Linux 可以用官方脚本装也可以用系统包管理器。推荐用官方脚本版本新且省事curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun装完启动并设置开机自启systemctl enable docker systemctl start docker docker versiondocker version能同时看到 Client 和 Server 两段信息说明 Docker 守护进程正常。如果只显示 Client说明服务没起来回去看systemctl status docker。2.3 把 docker-compose 升级到最新版这一步是重点。系统源里装的 docker-compose 经常是 1.x 的老版本而 Traefik 的 compose 文件里用到的external: true网络、部分字段在旧版上会报错。先看当前版本docker-compose --version如果输出是docker-compose version 1.25.x这种就得换。docker-compose 本质是个二进制文件早期是 Python 脚本直接下载最新的替换掉旧的即可。去 GitHub 的 docker/compose 仓库 releases 页面找docker-compose-linux-x86_64这个文件下载后上传到服务器或者直接在服务器上用 curl 拉curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose chmod x /usr/local/bin/docker-compose如果你服务器访问 GitHub 慢就在本地下载好再通过 scp 上传放到/usr/local/bin/docker-compose同样赋权。验证docker-compose --version看到Docker Compose version v2.x.x就对了。注意新版命令是docker compose带空格和docker-compose带横杠都能用本文统一用带横杠的写法兼容性更好。提示如果你之前用whereis docker-compose查到旧文件在/usr/bin/docker-compose新文件放到了/usr/local/bin/PATH 里/usr/local/bin通常优先级更高所以会优先用新版。保险起见可以把旧的删掉或改名。3. 可复制配置docker-compose.yml 与 traefik.yml 目录结构骨架地基打完进入核心配置环节。这一节给出完整的目录结构、docker-compose.yml、traefik.yml 静态配置以及阿里云 DNS 证书所需的 env 文件。所有内容可直接复制只需替换成你自己的域名和 AccessKey。3.1 目录结构规划先把目录建好配置和数据卷分开存放方便备份和迁移mkdir -p /root/traefik cd /root/traefik mkdir -p config touch config/traefik.yml touch .alidns.env touch docker-compose.yml最终结构是这样/root/traefik/ ├── docker-compose.yml ├── .alidns.env └── config/ └── traefik.yml3.2 创建外部桥接网络Traefik 和它代理的后端容器必须在同一个 Docker 网络里才能互相发现。单独建一个名为 proxy 的桥接网络docker network create proxy docker network lsdocker network ls里能看到 proxy 就成功了。后面所有需要被 Traefik 代理的服务都要在 compose 里声明加入这个网络。3.3 docker-compose.yml 完整内容这是主文件注意把域名、邮箱、AccessKey 换成你自己的version: 3.8 networks: proxy: external: true volumes: acme: services: traefik: image: traefik:v2.11 container_name: traefik restart: always networks: - proxy ports: - 80:80 - 443:443 volumes: - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./config/traefik.yml:/etc/traefik/traefik.yml:ro - acme:/etc/acme env_file: - ./.alidns.env labels: - traefik.enabletrue - traefik.http.routers.dashboard.entrypointsweb,websecure - traefik.http.routers.dashboard.ruleHost(proxy.example.com) - traefik.http.routers.dashboard.serviceapiinternal - traefik.http.routers.dashboard.tlstrue - traefik.http.routers.dashboard.tls.certresolverali几个关键点说明。/var/run/docker.sock挂进去Traefik 才能监听 Docker 事件自动发现服务加:ro只读更安全。acme卷用来持久化证书容器重建证书不丢。apiinternal是 Traefik 自带的 Dashboard 服务通过它可以在浏览器里看路由状态。3.4 traefik.yml 静态配置把静态配置从命令行参数里抽出来单独放文件更清晰api: dashboard: true insecure: false entryPoints: web: address: :80 http: redirections: entryPoint: to: websecure scheme: https permanent: true websecure: address: :443 providers: docker: endpoint: unix:///var/run/docker.sock exposedByDefault: false network: proxy certificatesResolvers: ali: acme: email: your-emailexample.com storage: /etc/acme/acme.json dnschallenge: provider: alidnsexposedByDefault: false很重要意思是容器默认不被 Traefik 暴露只有显式打了traefik.enabletrue标签的才生效避免误暴露内部服务。web入口的 redirections 配置把 80 的请求永久重定向到 443省得每个服务单独写。3.5 阿里云 DNS 证书环境变量文件用 DNS 挑战方式签发证书不需要公网能访问到你的服务器适合内网或端口受限场景。.alidns.env内容ALICLOUD_ACCESS_KEYLTAI5txxxxxxxxxxxxxxxx ALICLOUD_SECRET_KEYjZWRG3EgQBF7U9yxxxxxxxxxxxxAccessKey 在阿里云控制台右上角头像 →「AccessKey 管理」里创建。建议用 RAM 子账号只授予 AliyunDNSFullAccess 权限别用主账号的 Key。注意.alidns.env里是明文密钥务必设置文件权限chmod 600 .alidns.env并且不要提交到任何 Git 仓库。生产环境更推荐用 RAM 角色或密钥管理服务。配置齐了启动cd /root/traefik docker-compose up -d docker-compose logs -f traefik日志里看到Configuration loaded和证书签发相关输出就说明起来了。4. 验证请求curl 测试路由、HTTPS 跳转与证书签发结果配置写完不算完得实际发请求验证。这一节用 curl 从几个角度确认 Traefik 工作正常Dashboard 能访问、HTTP 自动跳 HTTPS、证书签发成功、后端服务能被正确路由。4.1 验证 Dashboard 可访问先在本地 hosts 或 DNS 里把proxy.example.com解析到 ECS 公网 IP。然后curl -I https://proxy.example.com预期返回HTTP/2 200并且能看到server: Traefik之类的响应头。如果返回 404检查 labels 里的 rule 域名是否和请求的 Host 一致。4.2 验证 HTTP 到 HTTPS 的跳转curl -I http://proxy.example.com预期返回301 Moved PermanentlyLocation头指向https://proxy.example.com。这说明 web 入口的重定向配置生效了。4.3 验证证书签发echo | openssl s_client -connect proxy.example.com:443 -servername proxy.example.com 2/dev/null | openssl x509 -noout -issuer -subject -dates输出里issuer应该是 Lets Encrypt 相关字段subject是你的域名notAfter是三个月后的日期。如果证书是 Traefik 默认的自签证书说明 ACME 挑战没成功去日志里找acme关键字排查。4.4 部署一个后端服务验证路由光有 Dashboard 不够得验证真实后端路由。起一个 whoami 容器services: whoami: image: traefik/whoami container_name: whoami restart: always networks: - proxy labels: - traefik.enabletrue - traefik.http.routers.whoami.entrypointswebsecure - traefik.http.routers.whoami.ruleHost(whoami.example.com) - traefik.http.routers.whoami.tlstrue - traefik.http.routers.whoami.tls.certresolverali - traefik.http.services.whoami.loadbalancer.server.port80docker-compose up -d后curl https://whoami.example.com返回里能看到请求头、容器主机名等信息说明 Traefik 把请求正确转发到了 whoami 容器。注意loadbalancer.server.port指的是容器内部端口不是宿主机端口whoami 容器内部监听 80。4.5 查看路由状态Dashboard 里能看到所有已注册的 router 和 service状态是绿色 enabled。也可以用 API 查curl -s http://127.0.0.1:8080/api/http/routers | head不过默认 Dashboard 走的是apiinternal需要认证保护生产环境别裸奔后面排障章节会说怎么加 basicAuth。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照配置过程中最容易踩的坑集中在这几类报错。逐个对照排查基本能覆盖 90% 的问题。5.1 401 Unauthorized 或 Dashboard 打不开如果访问 Dashboard 返回 401通常是加了 basicAuth 中间件但密码没配对。如果返回 404检查api.insecure和 labels 里的 rule。Traefik v2 里 Dashboard 默认不暴露必须显式配 router 指向apiinternal。另外api.insecure: true会开一个 8080 的裸端口生产环境应该设 false走 labels 路由。5.2 local proxy failed 或 connection refused这个报错一般出现在后端服务路由上。Traefik 找不到后端容器的 IP常见原因有三个后端容器没加入 proxy 网络loadbalancer.server.port写错后端容器本身没起来。用docker network inspect proxy看容器是否在列表里用docker exec traefik ping 后端容器名测连通性。5.3 reading choices 或 ACME 证书签发失败日志里出现error reading choices或acme: error presenting token多半是 DNS 挑战的 AccessKey 权限不够或域名不在该账号下。确认三点AccessKey 对应的 RAM 用户有 AliyunDNSFullAccess域名在阿里云 DNS 解析列表里.alidns.env变量名拼写正确是ALICLOUD_ACCESS_KEY不是ALIYUN_。另外 acme.json 权限必须是 600否则 Traefik 拒绝写入docker-compose exec traefik chmod 600 /etc/acme/acme.json5.4 OAuth 或 TLS 握手失败如果浏览器报 TLS 错误先确认证书是否签发成功见 4.3。如果证书没问题但握手失败检查 ECS 安全组 443 是否放行、系统防火墙是否拦截。还有一种情况是域名解析还没生效用dig whoami.example.com确认解析到的是 ECS 公网 IP。5.5 容器重启后路由丢失如果 Traefik 重启后路由没了检查/var/run/docker.sock挂载是否正确。socket 没挂进去Traefik 就监听不到 Docker 事件只能靠静态配置。另外providers.docker.exposedByDefault如果设成 true所有容器都会被暴露容易出乱子建议保持 false。5.6 配置三件套对照表无论用哪种方式接入后端Base URL、Key、Model ID 这三件套的逻辑要清楚。以接入一个需要鉴权的 API 服务为例配置项作用示例Base URL请求入口地址https://api.example.comKey身份鉴权凭证sk-xxxxxxxxModel ID指定调用的模型claude-sonnet-4-5在 Traefik 里Base URL 对应 router 的 Host 规则Key 通过中间件注入请求头Model ID 由后端服务自己解析。三者缺一请求就会 401 或 404。6. 语义一致 CTA把 Traefik 接入流程沉淀成可复用能力Traefik 跑通之后你会发现它真正的价值不在于替代 Nginx而在于把「服务发现 路由 证书」这三件事自动化了。每加一个新服务只需要在 compose 里打几个 label剩下的 Traefik 全包。这套模式在阿里云 ECS 上尤其顺手因为安全组和 DNS 都在同一个控制台证书签发用阿里云 DNS 挑战几乎零配置。如果你后续要把这套代理能力接到大模型 API 或编码工具上思路是一样的统一入口、统一鉴权、统一证书。TaoToken 提供的就是这类统一接入能力模型对话、API Key 管理、编码计划都有对应的控制台入口。具体可以看这几个地址模型对话体验https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_modelsAPI Key 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_keys接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_doc长期编码计划https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_plan控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_consoleAPI 入口统一是 https://taotoken.net/api官网是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_home。如果你在用 Claude Code 这类工具Anthropic 兼容入口在 https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contenttraefik_cc。最后留一个实操建议Traefik 的配置文件改完后用docker-compose config先校验语法再up -d能省掉很多重启排查的时间。证书签发第一次可能要等一两分钟别急着反复重启看日志比瞎试快。
返回列表