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/dashb...,就本例而言,URL 将是:

https://traefik.linuxtechi.lo...

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 站点了。

我的开源项目


鸠摩智首席音效师
472 声望9 粉丝

身强体健,龙精虎猛的活着。