在 Ubuntu 上使用 Traefik Proxy 为 Docker 容器设置反向代理

简介

Traefik(发音为"traffic")是一个开源的反向代理和负载均衡器。它为微服务架构提供了网络入口,特别是在动态、服务密集的环境中(如容器、微服务架构)。由于其设计灵活且易于实施,Traefik 成为了DevOps工程师和云原生应用开发者的热门选择🔥。

Traefik有什么用? 🛠️

  • 自动化的服务发现: Traefik 可以自动发现并管理网络路由配置。无论是在Kubernetes、Docker还是其他任何"服务发现"兼容的环境中,当你部署新服务时,Traefik 会自动检测并配置路由,无需任何人工干预👀。

  • 无缝的负载均衡: Traefik 支持多种负载均衡算法,包括轮询、IP哈希等。这样可以确保用户请求被平均且有效地分配到后端服务上,优化资源利用并提高响应速度💨。

  • 自动HTTPS: 利用Let's Encrypt,Traefik 可以自动为你的服务生成和续订SSL证书,保证数据传输的安全🔒。

  • 可观测性和监控: Traefik 提供实时的监控和度量,支持与Prometheus, Grafana等工具集成。这让开发者和运维团队能够实时监控应用的状态和性能📊。

  • 中间件支持: Traefik 允许开发者使用中间件来修改请求和响应,实现诸如限流、认证、请求头修改等高级功能🔧。

接下来,我将开始介绍如何进行部署 Traefik Proxy。

准备工作

服务器准备

必要前提:

  • 一个充满求知欲的大脑。
  • 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。本文将以雨云为例进行演示。
  • 服务器上已安装 Docker 和 Docker Compose。
  • 拥有一个域名,并将其 A 记录指向服务器的公共 IP 地址。例如,app.example.com

我将以 雨云 为例,带大家创建一台自己的云服务器,以便尝试本篇文章的内容。

注册链接: https://rainyun.ivwv.site

创建雨云服务器

以下步骤仅供参考,请根据实际需求选择配置。

点击 云产品云服务器立即购买

选择距离你较近的区域,以保证低延迟。

按照自己需求选择配置。

选择 Ubuntu 22.04 版本,勾选预装 Docker。

最后点击 立即购买,并按照提示进行购买。购买后等待机器部署完毕,点击购买的服务器,进入管理面板,找到远程连接相关信息。

使用 PowerShell 进行远程连接。

输入 ssh root@你的服务器IP 例如 ssh root@154.9.227.239 回车后,首次需要输入 yes,再次回车后即可登录服务器。

到此为止,我们的云服务器就创建好了。

开始部署

设置防火墙规则

确保防火墙允许 Traefik 路由传入的 HTTP 和 HTTPS 连接请求。

允许端口 80 上的 HTTP 连接:

bash 复制代码
sudo ufw allow 80/tcp

允许端口 443 上的 HTTPS 连接:

bash 复制代码
sudo ufw allow 443/tcp

查看 UFW 状态并验证新连接规则是否处于活动状态:

bash 复制代码
sudo ufw status

使用 Docker Compose 部署 Traefik

Traefik 使用 Docker 标签自动发现和路由流量到容器化应用程序。Docker Compose 允许你定义和运行带有多个标签的多容器应用程序,以使用 Traefik 定义路由路径。

创建一个新的 docker-compose.yml 文件:

bash 复制代码
sudo nano docker-compose.yml

添加以下配置到文件中:

yaml 复制代码
services:
  traefik:
    image: "traefik:latest"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entryPoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"

以上配置创建一个使用 Traefik 镜像的新容器化应用程序,该应用程序接受 HTTP 端口 80 上的传入流量,并在端口 8080 上公开 Web 管理控制面板。

在后台启动 Traefik:

bash 复制代码
docker compose up -d

查看所有正在运行的 Docker 容器,并验证 Traefik 容器状态是否为 up

bash 复制代码
docker compose ps

使用 Web 浏览器访问服务器的公共 IP 地址的端口 8080,例如 http://<服务器 IP>:8080,即可访问 Traefik 控制面板。

导航到 Providers (提供程序 ) 部分并验证 Docker 是否可用。

使用 Docker Compose 配置 Traefik Proxy 作为反向代理

现在 Traefik 正在运行,并配置为处理端口 80 上的 HTTP 连接请求。接下来,创建一个使用 Apache 容器镜像的新示例 Web 服务器应用程序,以与 Traefik 集成并使用域名接受连接请求。

打开 docker-compose.yml 文件:

bash 复制代码
nano docker-compose.yml

将以下配置添加到文件中。将 app.example.com 替换为你的实际域名:

yaml 复制代码
apache:
  image: "httpd:latest"
  container_name: "apache"
  labels:
    - traefik.enable=true
    - "traefik.http.routers.apache.rule=Host(`app.example.com`)"
    - traefik.http.routers.apache.entrypoints=web

保存并关闭文件。

上述配置使用 Apache 容器镜像创建新的 Web 服务器应用程序,并接受 app.example.com 域和 Web 入口点的传入连接请求。在配置中:

  • apache:创建新的 apache 服务。
    • image: "httpd:latest":使用 Apache httpd 容器镜像部署 apache 服务。
    • labels:设置 Docker 标签以分配 apache 服务,使 Traefik 能够将流量动态路由到应用程序。
      • traefik.enable=true:使 Traefik 能够将流量转发到 apache 服务。
      • traefik.http.routers.apache.rule=Host(app.example.com) :设置 Traefik 用于侦听传入连接请求的域。如果您不想指定域,请指定 apache.localhost 而不是 apache.rule=Host 以使用 localhost。
      • traefik.http.routers.apache.entrypoints=web :设置 Traefik 用于将传入请求路由到 apache 服务的 Web 入口点。

修改后的 docker-compose.yml 文件应如下所示。

yaml 复制代码
services:
  traefik:
    image: "traefik:latest"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entryPoints.web.address=:80"
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
  apache:
     image: "httpd:latest"
     container_name: "apache"
     labels:
       - traefik.enable=true
       - traefik.http.routers.apache.rule=Host(`app.example.com`)
       - traefik.http.routers.apache.entrypoints=web

在后台启动 apache 服务:

bash 复制代码
docker compose up -d

使用 HTTP 访问你的域名,例如 http://app.example.com,验证是否显示 Apache 默认页面。

访问 Traefik 控制面板,导航到 HTTP 选项卡,并验证 apache 服务路由是否可用。

使用 Traefik 设置自动 HTTPS

Traefik 使用证书解析器从自动证书管理环境 (ACME) 提供程序生成和更新受信任的 SSL 证书。Traefik 初始化 ACME 质询以验证你的域名,并将生成的证书存储在 acme.json 文件中。

备份原始的 docker-compose.yml 文件:

bash 复制代码
mv docker-compose.yml http-docker-compose.yml

创建一个新的 docker-compose.yml 文件,并添加以下配置。将 app.example.com 替换为你的域名,将 hello@example.com 替换为你的有效电子邮件地址:

yaml 复制代码
services:
  traefik:
    image: "traefik:latest"
    container_name: "traefik"
    command:
      - "--log.level=DEBUG"
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--entryPoints.apachesecure.address=:443"
      - "--certificatesResolvers.apacheresolver.acme.tlsChallenge=true"
      - "--certificatesResolvers.apacheresolver.acme.email=hello@example.com"
      - "--certificatesResolvers.apacheresolver.acme.storage=/letsencrypt/acme.json"
    ports:
      - "443:443"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "./letsencrypt:/letsencrypt"

  apache:
    image: "httpd:latest"
    container_name: "apache"
    labels:
      - traefik.enable=true
      - traefik.http.routers.apache.rule=Host(`app.example.com`)
      - traefik.http.routers.apache.entrypoints=apachesecure
      - traefik.http.routers.apache.tls=true
      - traefik.http.routers.apache.tls.certresolver=apacheresolver

上述配置使 Traefik 能够仅使用端口 443 上的 apachesecure 入口点接受安全 HTTPS 连接请求。在 traefik 服务配置中:

  • -entryPoints.apachesecure.address=:443 :使用 apachesecure 入口点在端口 443 上启用 HTTPS 连接。
  • -certificatesResolvers.apacheresolver.acme.tlsChallenge=true :创建新的 apacheresolver 证书解析程序,并使用 ACME TLS-ALPN-01 质询作为 TLS 质询来生成新的 SSL 证书。Traefik 默认使用 Let's Encrypt ACME。
  • -certificatesResolvers.apacheresolver.acme.email=hello@example.com :设置 ACME 质询电子邮件地址 。
  • -certificatesResolvers.apacheresolver.acme.storage=/letsencrypt/acme.json :指定存储 ACME 配置的路径,以便在容器重启之间重复使用。

apache 服务配置中:

  • traefik.http.routers.apache.entrypoints=apachesecure :创建新的 apachesecure 入口点以处理连接请求。
  • traefik.http.routers.apache.tls=true :启用与服务的安全 TLS 连接。
  • traefik.http.routers.apache.tls.certresolver=apacheresolver :创建新的 apacheresolver 证书解析程序以生成和管理 SSL 证书。

应用 Docker Compose 配置:

bash 复制代码
docker compose up traefik apache -d

使用 HTTPS 访问你的域名,例如 https://app.example.com,验证连接是否安全以及是否显示默认网页。

访问 Traefik 控制面板,验证端口 443 上的 apachesecure 入口点是否可用,以及 apache 服务上的 TLS 是否处于活动状态。

使用 Docker CLI 部署 Traefik

除了 Docker Compose,你还可以使用 Docker CLI 部署 Traefik。

创建 traefik.yml 文件,并添加以下配置:

bash 复制代码
sudo nano traefik.yml
yaml 复制代码
entryPoints:
  web:
    address: ":80"

api:
  dashboard: true
  insecure: true

log:
  level: debug

providers:
  docker:
    exposedByDefault: false
    endpoint: "unix:///var/run/docker.sock"

在上述配置中:

  • entrypoint:创建一个新的 Web 入口点,用于侦听 HTTP 端口 80 上的连接。
  • api:开启 Traefik 仪表盘。
  • log:启用调试级别日志记录以包含警告和错误日志。
  • providers:将 Docker 设置为提供者,并使用 Docker 套接字进行连接。
  • 使用 Docker CLI 部署 Traefik:
bash 复制代码
docker run -d -p 8080:8080 -p 80:80 \\
  -v /var/run/docker.sock:/var/run/docker.sock \\
  -v $PWD/traefik.yml:/traefik.yml \\
  traefik:v3.1

部署一个 Nginx 容器并配置 Traefik 标签:

bash 复制代码
docker run -d \\
  --label "traefik.enable=true" \\
  --label 'traefik.http.routers.nginx.rule=Host(`app.example.com`)' \\
  --label "traefik.http.routers.nginx.entrypoints=web" \\
  nginx

使用 HTTP 访问域名,并通过 Traefik 控制面板验证路由。

使用 Traefik 启用自动 HTTPS

备份 traefik.yml 文件, 创建新的 traefik.yml 文件

bash 复制代码
mv traefik.yml old-traefik.yml
sudo nano traefik.yml

并添加以下配置, 将 hello@example.com 替换为你的有效电子邮件地址:

yaml 复制代码
entryPoints:
  websecure:
    address: ":443"

api:
  dashboard: true
  insecure: true

log:
  level: debug

providers:
  docker:
    exposedByDefault: false
    endpoint: "unix:///var/run/docker.sock"

certificatesResolvers:
  nginxresolver:
    acme:
      email: hello@example.com
      storage: /letsencrypt/acme.json
      tlsChallenge: true

在上述配置中:

  • websecure:创建新的入口点。
  • nginxresolver:设置要与 Let's Encrypt 一起使用的证书解析程序名称作为 ACME。
  • /letsencrypt/acme.json:使用主机数据目录中的 acme.json 文件,如果不可用,则创建 Let's Encrypt 目录。

停止 Traefik 和 Nginx 容器。

bash 复制代码
docker stop <traefik-container-id> -f
docker stop <nginx-container-id> -f

重新部署 Traefik,映射 HTTPS 端口 443,并挂载 letsencrypt 目录:

bash 复制代码
docker run -d -p 8080:8080 -p 443:443 \\
  -v /var/run/docker.sock:/var/run/docker.sock \\
  -v $PWD/traefik.yml:/traefik.yml \\
  -v $PWD/letsencrypt:/letsencrypt \\
  traefik:v3.1

重新部署 Nginx 容器,并配置 HTTPS 相关的标签:

bash 复制代码
docker run -d \\
  --label "traefik.enable=true" \\
  --label 'traefik.http.routers.nginx.rule=Host(`app.example.com`)' \\
  --label "traefik.http.routers.nginx.entrypoints=websecure" \\
  --label "traefik.http.routers.nginx.tls.certresolver=nginxresolver" \\
  nginx

使用 HTTPS 访问你的域名,并验证是否配置成功。

bash 复制代码
https://app.example.com

相关链接

雨云 - 新一代云服务提供商: https://www.rainyun.com/NTEzMTM1_?s=blog

面试鸭:https://mianshiya.com/?shareCode=sq29yv

我的博客:https://blog.ivwv.site

相关推荐
jikuaidi6yuan1 小时前
鸿蒙与Linux内核的关系
linux·华为·harmonyos
zyy291829181 小时前
嵌入式Linux(SOC带GPU树莓派)无窗口系统下搭建 OpenGL ES + Qt 开发环境,并绘制旋转金字塔
linux·运维·数据库·嵌入式硬件·qt·物联网·系统架构
Ven%1 小时前
如何看linux系统内核是aarch64 ,还是64-bit
linux·运维·服务器
寒冰碧海2 小时前
Linx下自动化之路:PostgreSQL 安装包精准自动化部署至指定路径并注册成服务全解析
运维·postgresql·自动化
统信软件技术有限公司2 小时前
统信服务器操作系统V20系列配置JDK方案
java·运维·服务器
Derrick_itRose3 小时前
黑马程序员MybatisPlus/Docker相关内容
java·docker
PP东3 小时前
DOCKER学习总结
学习·docker·eureka
测试盐3 小时前
ffmpeg命令
linux·ffmpeg·音视频
小程序耿4 小时前
Linux的基本操作及虚拟机设置
linux
C++忠实粉丝4 小时前
计算机网络之传输层协议UDP
linux·网络·c++·网络协议·计算机网络·udp