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: falseservices: 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仓库)