如何在Ubuntu系统中使用Traefik为容器设置反向代理?

2023-10-27

Traefik 是一种为 docker 容器建立反向代理的现代方法。当您希望在 docker 容器中运行多个应用程序,并公开端口 80 和 443 时,traefik 可能是反向代理的最佳选择。Traefik 提供了自己的监控仪表板。您还可以将 Traefik 用于 HTTP 负载均衡器。在本文中,我们将通过一个简单的示例在 Ubuntu 20.04 上安装 Traefik v2.4。

先决条件
  • Ubuntu 20.04 LTS
  • Docker CE (Community Edition)
  • Internet connection to download packages
  • Sudo Privileged user account
  • A domain for traefik dashboard [Should be maintained A record]
  • A domain for wordpress site [Should be maintained A record]

在本文中,我们使用的是 linuxtechi.local 作为域名,traefik.linuxtech .local 作为 Traefik dashboard 的 FQDN。

Ubuntu 20.04 上设置 Traefik 的步骤

在本文中,首先我们将设置 Traefik,然后将 Wodresspress 容器注册到 Traefik,以进行反向代理和负载平衡。我们将使用 Let’s Encrypt SSL 证书配置 Traefik,以通过 HTTPS 提供所有内容。

(1) 配置 Traefik

创建一个配置文件,并设置访问 traefik 仪表板的加密密码。您可以使用 htpasswd 实用程序创建加密的密码。要使用 htpasswd 实用程序,请使用以下命令安装。

$ sudo apt-get install -y apache2-utils

安装完成后,运行以下命令生成加密的密码。在本例中,我使用 Traefik@123# 进行加密。你可以有自己的假设。用户为 admin,您可以用自己的用户名替换它。

$ htpasswd -nb admin Traefix@123#

您将得到加密的密码,如下所示

pkumar@traefik:~$ htpasswd -nb admin Traefik@123#
admin:$apr1$V.9MT9VH$MtLgwiAa4jq1ngDVvTdJu/
pkumar@traefik:~$

复制此输出并将其保存在某处,因为我们需要在 Traefik 配置文件中使用此加密密码来为 Traefik 仪表板设置基本身份验证。

现在创建一个名为 traefik.toml 的配置文件,使用 toml 格式。我们将使用 Traefik 的三个提供者,即 api、docker 和 acme。Acme 提供 let’s encrypt TLS 证书。

创建一个 traefik.toml 文件,包含以下内容

$ vi traefik.toml
[entryPoints]
  [entryPoints.web]
    address = ":80"
    [entryPoints.web.http.redirections.entryPoint]
      to = "websecure"
      scheme = "https"
  [entryPoints.websecure]
    address = ":443"

[api]
  dashboard = true
[certificatesResolvers.lets-encrypt.acme]
  email = "info@linuxtechi.local"
  storage = "acme.json"
  [certificatesResolvers.lets-encrypt.acme.tlsChallenge]

[providers.docker]
  watch = true
  network = "web"

[providers.file]
  filename = "traefik_secure.toml"

保存并且关闭文件

在上面的文件入口点 web 处理 80 端口, websecure 处理 443 端口 (SSL / TLS 连接)

所有 80 端口的流量被强制重定向到 websecure 入口点,以确保连接安全。不要忘记更改上述文件 traefik 中的电子邮件和域名。

让我们创建另一个文件 traefik_secure.toml,包含以下内容

$ vi traefik_secure.toml
[http.middlewares.simpleAuth.basicAuth]
  users = [
    "admin:$apr1$V.9MT9VH$MtLgwiAa4jq1ngDVvTdJu/"
  ]

[http.routers.api]
  rule = "Host(`traefik.linuxtechi.local`)"
  entrypoints = ["websecure"]
  middlewares = ["simpleAuth"]
  service = "api@internal"
  [http.routers.api.tls]
    certResolver = "lets-encrypt"

保存并退出文件

不要忘记更改上面文件中管理员用户和主机条目的密码字符串,以适合您的设置。

(2) 运行 traefik 容器

为代理创建新的 docker 网络,以便在容器之间共享。使用以下命令创建 docker 网络。

$ docker network create web

启动 traefik 容器时,将该容器添加到此网络。您可以向该网络添加其他容器,以便 Traefik 作为反向代理工作。

创建一个空文件,保存 Let’s encrypt 信息,并相应地修改权限。

$ touch acme.json
$ chmod 600 acme.json

一旦这个 json 文件移动到 docker 容器,所有权将自动更改为 root

使用以下命令创建一个 traefik 容器

$ docker run -d \
   -v /var/run/docker.sock:/var/run/docker.sock \
   -v $PWD/traefik.toml:/traefik.toml \
   -v $PWD/traefik_secure.toml:/traefik_secure.toml \
   -v $PWD/acme.json:/acme.json \
   -p 80:80 \
   -p 443:443 \
   --network web \
   --name traefik \
    traefik:v2.4

现在,您可以访问 Traefik 仪表板以监视容器的健康状态。访问 https://your_domain.com/dashboard,就本例而言,URL 将是:

https://traefik.linuxtechi.local/dashboard

Traefik-login-window-Ubuntu

登录到仪表板后,您将看到以下界面

Traefik-Dashboard-Ubuntu

(3) 添加容器到 Traefik

您已经配置了运行在服务器上的 Traefik。在这一步中,我将添加一个 WordPress 容器到Traefik 代理。WordPress 容器将由 Docker Compose 管理。

让我们创建一个 docker-compose.yml 文件,包含以下内容

$ vi docker-compose.yml

要指定我们将使用的版本和网络,请向文件中添加以下行

version: "3"
networks:
  web:
    external: true
  internal:
    external: false

我使用版本 3,因为它是 Docker Compose 的最新版本。Traefik 只有在应用程序属于同一网络的情况下才会识别它们。在前面的步骤中,我已经用网络名 web 手动创建了 docker 网络,所以我已经在 docker-compose.yml 中包含了这个网络,并将其公开给外部 traefik 代理。我已经定义了另一个网络来连接我们的应用程序与数据库容器,不需要通过 traefik 公开。

现在定义每个服务。先为 WordPress 应用程序创建一个服务。在 docker-compose.yml 中添加以下行

services:
  wordpress:
    image: wordpress:latest
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_USER: dbuser
      WORDPRESS_DB_PASSWORD: dbpass@123#
      WORDPRESS_DB_NAME: wordpress_db
    labels:
      - traefik.http.routers.blog.rule=Host(`blog.linuxtechi.local`)
      - traefik.http.routers.blog.tls=true
      - traefik.http.routers.blog.tls.certresolver=lets-encrypt
      - traefik.port=80
    networks:
      - internal
      - web
    depends_on:
      - mysql

我已经使用了 traefik.port = 80,Traefik 将使用此端口将流量路由到 WordPress 容器。

将 Host: blog.linuxtechi.com 替换为您自己的站点域名

现在,配置 MySQL 服务,将以下行添加到 docker-compose.yml 的底部

mysql:
  image: mysql:latest
  environment:
    MYSQL_ROOT_PASSWORD: sqlpass@123#
    MYSQL_DATABASE: wordpress_db
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: dbpass@123#
  networks:
    - internal
  labels:
    - traefik.enable=false

在此示例中,我为数据库容器使用了 MySQL 的最新镜像。Wordress 和 MySQL 服务的环境变量已在文件本身中定义。使用 Traefik 的代理不需要 MySQL 服务,因此我仅使用了内部网络。

完整的 Docker-compose.yml 文件看起来像:

version: "3"
networks:
  web:
    external: true
  internal:
    external: false
services:
  wordpress:
    image: wordpress:latest
    environment:
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_USER: dbuser
      WORDPRESS_DB_PASSWORD: dbpass@123#
      WORDPRESS_DB_NAME: wordpress_db
    labels:
      - traefik.http.routers.blog.rule=Host(`blog.linuxtechi.local`)
      - traefik.http.routers.blog.tls=true
      - traefik.http.routers.blog.tls.certresolver=lets-encrypt
      - traefik.port=80
    networks:
      - internal
      - web
    depends_on:
      - mysql

  mysql:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: sqlpass@123#
      MYSQL_DATABASE: wordpress_db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass@123#
    networks:
      - internal
    labels:
      - traefik.enable=false

保存文件并退出文件

运行以下命令来创建 MySQL 和 wordpress 容器

$ docker-compose up -d

现在导航到 Traefik 仪表板并单击 HTTP 路由器,您将发现仪表板中添加了新的容器。

WordPress-Frontend-Traefik-Ubuntu

Now use the url blog.linuxtechi.local [Replace with your domain]. You will be redirected to WordPress installation wizard with TLS connection.

现在使用 url blog.linuxtech .local (替换为您的域名),您将被重定向到使用 TLS 连接的 WordPress 安装向导。

WordPress-Installation-Traefik-Ubuntu

完成安装向导。现在您可以使用您的 WordPress 站点了。

我的开源项目

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Ubuntu系统中使用Traefik为容器设置反向代理? 的相关文章

  • 在Linux服务器中安装ZLIB

    我要安装ZLIB http www techsww com tutorials libraries zlib installation installing zlib on ubuntu linux php在Linux服务器中 我的服务器帐
  • 共享库 RPATH 和二进制 RPATH 优先级

    如果共享库链接到二进制文件 并且共享库还依赖于其他库 则共享库的 RPATH 和二进制文件的 RPATH 的优先级 链接器搜索顺序 是什么 二进制文件的 RPATH 是否可以覆盖共享库中的 RPATH 我在共享库RPATH中设置的 ORIG
  • UNIX 域 STREAM 和 DATAGRAM 套接字之间的区别?

    这个问题是NOTSTREAM 类型和 DATAGRAM 类型 INTERNET 套接字之间的区别 我知道 STREAM 套接字使用 TCP 数据报套接字使用 UDP 以及所有 TCP UDP 内容 按顺序到达的数据包 ACK NACK 等
  • H.323,如何制作一个没有媒体的简单环。该脚本遵循 Q.931 设置,但仍然无法正常工作

    谁能帮我解决这个问题吗 当我发送此请求时 我在wireshark中看到数据包将发送到1720 tcp端口中的SJPhone 但 SJPhone 仍然没有响铃 我想让它响起 无论媒体 我非常感谢您的支持 我一定缺少消息协议细节来实现这个 请给
  • ngx_http_brotli_filter_module.so" 与 /etc/nginx/nginx.conf:1 中的二进制不兼容

    Using Nginx 1 17 3 and Nginx 1 14 0在两台独立服务器上的 Ubuntu 18 上 两者都显示相同的错误ngx http brotli filter module so is not binary compa
  • 如何可视化包含/指向彼此的 C 结构图?

    我正在使用Ubuntu 10 04 正在研究内核对象的编程 我遇到了一些相当复杂的结构 我很难阅读 所以我想我应该尝试找到一些可以帮助我可视化它们的工具 到目前为止我唯一能找到的是VCG http rw4 cs uni sb de sand
  • 使用 C++ 更改终端字体大小

    我正在用 C 做一个小项目 在 Ubuntu 11 04 中 该程序是基于文本的 全部在 Gnome 终端中 我正在使用 ncurses 库来更改字体颜色 但我也想将不同大小的文本打印到终端 并且不知道如何使用 ncurses 来做到这一点
  • x = os.system(..) 的返回值[重复]

    这个问题在这里已经有答案了 当我打字时os system whoami 在Python中 作为root 它返回root 但是当我尝试将它分配给变量时x os system whoami 它将 x 的值设置为 0 为什么 os system
  • Unix unzip:如何批量解压文件夹中的zip文件并保存在子文件夹中?

    假设我有一个文件夹 images 里面有 0001 zip 到 9999 zip 我想将它们全部解压并将它们保存在具有其文件名的子文件夹中 例如 0001 zip 将被解压并保存到 0001 0002 zip将被解压缩并保存到 0002 我
  • 使用 laravel 拒绝 .composer/config 文件权限

    我在 ubuntu virtualbox 上有一个 laravel 项目 我曾经跑步composer update一切都很好 我不知道有什么变化可能会影响这一点 但现在当我跑步时composer update I get file get
  • SDKmanager:警告:无法创建设置。 java.lang.IllegalArgumentException

    我尝试在 Ubuntu 上安装 androidSDK 但是当我尝试在 tools bin sdkmanager 文件夹上运行 SDK 管理器时 我收到以下消息 我的 Ubuntu 最近安装了 除了 Java 8 和 Android Stud
  • Linux 上的 JavaFX

    Linux x86 和 x64 上的 JavaFX 情况如何 JavaFX 应用程序可以在 Linux 操作系统上顺利执行吗 我发现了 2011 年和 2012 年的一些问题 当时应用程序不稳定 目前发布的 JFX 版本是 2 2 4 在
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • 设置Linux使用特定版本的python进行编译

    我正在运行 Ubuntu 来编译一组需要 python 2 4 的代码 如何设置终端启动器 以便当我打开该启动器时 所有与 python 相关的命令都将使用 python 2 4 而不是 Ubuntu 中默认的 python 2 6 Set
  • ModuleNotFoundError:尽管已安装,但没有名为“PyDIP”的模块

    尝试使用图像识别 我安装了带有 OpenCV 的 Python 如下本教程 https www pyimagesearch com 2018 08 15 how to install opencv 4 on ubuntu 后来 我决定尝试一
  • 多个同名进程

    我有一个在 Linux 2 6 13 和 WindRiver Linux 3 0 上运行的应用程序 在 Linux 2 6 13 中 当我 ps eaf grep myapplication 输出显示 myapplication 的多个条目
  • Linux 相当于 GetCommandLine 和 CommandLineToArgv?

    我想知道是否有一些 API 可以在 Linux 上获取当前进程的命令行参数 我想我是非常不清楚的 该问题的真正目的是通过命令行参数传递 unicode 文件名 从文件中读取 proc self cmdline 例如 wallyk zf od
  • 在 Linux 上用 C 跟踪键盘和鼠标事件

    如何在 Linux 中用 C 语言跟踪键盘或鼠标事件 Like for example if the user presses ESC Shift etc I should be able to track it Same way for
  • 对于 Linux 上的 ARM,从 *.hex 转换为 *.bin

    我想使用以下命令将程序上传到我的 STM32F4 Discovery 板st flash命令 问题是当我尝试上传 hex 或 elf 文件时 它不起作用 我尝试了多种方法 例如使用 xxd 从 elf 或 hex 转换为 bin 但当我上传
  • 如何在shell中获取clock_gettime(2)时钟?

    我看不到这样的选项date proc uptime是基于引导的 而不是单调的 最后我发现cat proc timer list grep now产生的纳秒数是通过以下方式获得的ktime get如果我理解正确的话 它会返回单调时间 但这非常

随机推荐

  • php7 libevent扩展,PHP7 安装event扩展的实现方法

    Libevent 是一个用C语言编写的 轻量级的开源高性能I O框架 支持多种 I O 多路复用技术 epoll poll dev poll select 和 kqueue 等 支持 I O 定时器和信号等事件 注册事件优先级 PHP提供了
  • 【牛客】四选一多路器

    描述 制作一个四选一的多路选择器 要求输出定义上为线网类型 状态转换 d0 11 d1 10 d2 01 d3 00 信号示意图 波形示意图 输入描述 输入信号 d1 d2 d3 d4 sel 类型 wire 输出描述 输出信号 mux o
  • 前端面试题之React

    文章目录 1 React生命周期 V16 3 之前 挂载阶段 组件更新阶段 卸载阶段 新增后 挂载阶段 更新阶段 static getDerivedStateFromProps shouldComponentUpdate render ge
  • SSM myBatis 配置及自动生成Bean 和 Dao

    因为我发现在做SSM 的配置的时候 配置中出现一点问题都会导致项目打包失败或者其他问题 但是我发现网上很多都没有贴出每个配置文件的代码 如果是新手在配置上就会走很多的弯路 所以这里我贴出所有配置文件的代码 这样会方便很多新手快速的构建正确的
  • Arduino控制舵机

    一 舵机一般有三根线 和Arduino连接一般如下 二 代码分析 include
  • 为什么我们使用Story Points进行估算?

    故事点 Story Points 简介 Scrum指南告诉我们 估算应该由将要完成工作的人提供 但它并没有告诉我们应该如何提供估算 它把这个决定留给了我们 Scrum团队使用的一种常见策略是使用称为故事点的度量单位进行估算 但为什么要使用S
  • hive的row_number()、rank()和dense_rank()的区别以及具体使用

    row number rank 和dense rank 这三个是hive内置的分析函数 下面我们来看看他们的区别和具体的使用案例 首先创建一个文件test A 1 B 3 C 2 D 3 E 4 F 5 G 6 1 2 3 4 5 6 7
  • 国际化字符编码处理总结

    在处理国际化时 处理不当就会产生乱码 通用的做法是都转换为UTF 8编码 对于高层开发语言十分简单 对于底层编程语言则有些复杂 其中涉及的概念也有很多 字符是指计算机中使用的字母 数字 字和符号 包括 1 2 3 A B C 等等 在 AS
  • ‘‘‘python‘‘‘内置函数

    目录 关键字 class 定义类 内置函数 和定义函数的调用一致 常用方法 字符串的方法
  • lua/luci入门

    lua 注释 单行注释 多行注释 数据类型可以用type函数判断 nil 未使用过的变量 既是值 也是类型 boolean string number 相当于c里的double table 唯一的数据结构 基本与php数组类型同 索引数组从
  • openwrt之Uci

    Openwrt中所有的配置文件都存放再 etc config中 uci是openwrt中用来修改配置文件的一个软件 一 配置文件的格式 config声明一个section example 指的是section的type 也就是类型 test
  • C++ 多语言切换

    如果设置UI资源文件非重点不做介绍 设置英文版接口 SetThreadUILanguage MAKELANGID LANG ENGLISH SUBLANG ENGLISH US 此时如果操作系统的语言选择的是简体中文 那么掉系统的AfxMe
  • 已解决(Python3中pip无法安装urllib报错问题)No matching distribution found for urllib

    已解决 Python3中pip无法安装urllib报错问题 ERROR Could not find a version that satisfies the requirement urllib from versions none ER
  • selenium 下载文件取消安全下载的配置

    使用 selenium 下载碰见的问题 文件存在危险 因此 Chrome 已将其拦截 查找了很多配置文件都无法解决这个问题 经过多次测试 下面的参数配置可以解决这个问题 selenium 下载文件取消安全下载的配置 如果想要下载文件 可以添
  • MATLAB/Simulink 永磁同步电机启动(I/F控制) 中高速运行(滑模观测器控制/磁链观测器)

    MATLAB Simulink 永磁同步电机启动 I F控制 中高速运行 滑模观测器控制 磁链观测器 运行模式间切换方案设计 性能要求 价格等方面请加好友 卡尔曼滤波器加锁相环 ID 1628564485704566696Elaine
  • java jen部署_CSS布局:Jen Simmons的网格,区域和@Supports

    java jen部署 In this episode of the Versioning Show Tim and David are joined by Jen Simmons Designer Advocate at Mozilla a
  • Python3 基础语法练习小Demo

    文章目录 反恐精英基础版 分析 代码实现 反恐精英修复版 分析 代码实现 反恐精英加强版 分析 代码实现 反恐精英超级加强版 分析 代码实现 反恐精英基础版 一个精英对一个匪徒 分析 定义人类 描述公共属性 life 100 name 姓名
  • 自定义开发成绩查询小程序

    在当今数字化时代 教育行业借助技术手段提高教学效果 作为老师 拥有一个自己的成绩查询系统可以帮助你更好地管理学生成绩 并提供更及时的反馈 本文将为你详细介绍如何从零开始搭建一个成绩查询系统 让你的教学工作更加高效和便捷 不过比较便捷好用的方
  • [人工智能-深度学习-44]:开发环境 - Anaconda的目录结构与SourceInsight工程

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121309970 目录 第1章 前言
  • 如何在Ubuntu系统中使用Traefik为容器设置反向代理?

    Traefik 是一种为 docker 容器建立反向代理的现代方法 当您希望在 docker 容器中运行多个应用程序 并公开端口 80 和 443 时 traefik 可能是反向代理的最佳选择 Traefik 提供了自己的监控仪表板 您还可