共计 5024 个字符,预计需要花费 13 分钟才能阅读完成。
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
装置实现后,运行以下命令生成加密的明码。在本例中,我应用 [email protected]# 进行加密。你能够有本人的假如。用户为 admin,您能够用本人的用户名替换它。
$ htpasswd -nb admin [email protected]#
您将失去加密的明码,如下所示
[email protected]:~$ htpasswd -nb admin [email protected]#
admin:$apr1$V.9MT9VH$MtLgwiAa4jq1ngDVvTdJu/
[email protected]:~$
复制此输入并将其保留在某处,因为咱们须要在 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 = "[email protected]"
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 = "[email protected]"
[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…
登录到仪表板后,您将看到以下界面
(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: [email protected]#
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: [email protected]#
MYSQL_DATABASE: wordpress_db
MYSQL_USER: dbuser
MYSQL_PASSWORD: [email protected]#
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: [email protected]#
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: [email protected]#
MYSQL_DATABASE: wordpress_db
MYSQL_USER: dbuser
MYSQL_PASSWORD: [email protected]#
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 站点了。
我的开源我的项目
- course-tencent-cloud(酷瓜云课堂 – gitee 仓库)
- course-tencent-cloud(酷瓜云课堂 – github 仓库)