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
登录到仪表板后,您将看到以下界面
(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 路由器,您将发现仪表板中添加了新的容器。
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 站点了。