如何在 Ubuntu 20.04 中使用 Docker 设置 Traefik 负载均衡器

Traefik 是一个现代反向代理和负载平衡服务器,支持第 4 层 (TCP) 和第 7 层 (HTTP) 负载平衡。 它的配置可以用 JSON、YML 或 TOML 格式定义。 它由入口点(前端)、服务(后端)、路由器(规则)、中间件(可选功能)组成。

本文将演示如何在第 7 层(HTTP)模式下使用 Traefik 负载均衡器。

先决条件

  1. 安装了 docker 和 docker-compose
  2. Internet 连接以下载 docker 图像。
  3. DNS A 记录映射到您的域以获取 Let’s Encrypt 证书(例如 traefik.yourdomain.com)

配置

我将在同一个 Docker 网络区域中运行两台后端服务器(nginx 容器)和一个 Traefik 容器。 我正在使用 traefik.yourdomain.com 进行解释。 您需要拥有自己的域。

让我们首先在您的主位置创建一个目录。

$ mkdir traefik && cd traefik

现在使用以下命令创建一个 docker 网络。 这有助于从他们的名字到达容器。

$ docker network create web_zone

Traefik.yaml 配置

首先,创建一个名为 traefik.yaml 的文件:

$ vim traefik.yaml

并粘贴以下内容。

# Static configuration entryPoints:     unsecure:         address: :80     secure:         address: :443  certificatesResolvers:     myresolver:         acme:             email: [email protected]             storage: acme.json             httpChallenge:                 entryPoint: unsecure              providers:       file:       filename: tls.yaml       watch: true

解释

  • 入口点就像前端列表服务和端口。
  • certificateResolvers 是使用按需的letsencrypt 证书。
  • Providers 是定义路由器/中间件和服务的文件

文件提供者配置

现在,在同一目录中创建我们在提供程序部分中定义的另一个文件:

$ vim tls.yaml

并粘贴以下 yaml 配置。

http:     routers:         http_router:             rule: "Host(`traefik.yourdomain.com`)"             service: allbackend         https_router:             rule: "Host(`traefik.yourdomain.com`)"             service: allbackend             tls:                 certResolver: myresolver                 options: tlsoptions     services:         allbackend:             loadBalancer:                 servers:                     - url: "https://myserver1/"                     - url: "https://myserver2/"             tls:     options:         tlsoptions:             minVersion: VersionTLS12

解释

  • 路由器部分用于定义路由。 我们有两条 http 和 https 路由
  • 后端是在服务中定义的,你也可以指定负载均衡算法。
  • tls 来定义 TLS 配置和选项。

按照文件中的定义,创建以下文件来存储 Let’s Encrypt 证书。

$ touch acme.json
$ chmod 600 acme.json

用于 traefik 的 Docker-compose

我将使用 docker compose 创建一个容器并映射 80、443 端口。 您定义您的域名。 创建一个文件 docker-compse.yml:

$ vim docker-compose.yml

并粘贴以下配置:

version: '3'  services:    traefik:     image: traefik:latest     command: --docker --docker.domain=yourdomain.com     ports:       - 80:80       - 443:443     networks:       - web_zone     volumes:       - /run/docker.sock:/run/docker.sock       - ./traefik.yaml:/traefik.yaml       - ./tls.yaml:/tls.yaml       - ./acme.json:/acme.json     container_name: traefik     restart: always networks:   web_zone:       external: true

后端服务器

现在让我们使用 nginx 映像运行两个后端服务器。 先建个目录,

$ mkdir ~/traefik/backend && cd ~/traefik/backend/

创建两个索引文件,如下所示。

echo "<h1> Hello server 1</h1>" > index-server1.html
echo "<h1> Hello server 2</h1>" > index-server2.html

Docker 撰写文件以运行两个 nginx 后端服务器

以下是制作两个 nginx 容器的简单 compose 文件。 创建 docker-compse.yml 文件:

$ vim docker-compose.yml

并粘贴以下配置:

version: '3' services:   myserver1:     image: nginx     container_name: nginx1     restart: always     volumes:       - ./index-server1.html:/usr/share/nginx/html/index.html     networks:       - web_zone   myserver2:     image: nginx     container_name: nginx2     restart: always     volumes:       - ./index-server2.html:/usr/share/nginx/html/index.html     networks:       - web_zone networks:   web_zone:         external: true

启动 Docker 容器

现在运行容器。 首先使用以下命令启动 nginx 后端容器。

$:~/traefik/backend$ docker compose up -d

必须运行两个容器。 通过执行以下命令进行确认。

[email protected]:~/traefik/backend$ docker ps

现在,回到目录并运行以下命令来运行 traefik 负载均衡器。

$:~/traefik$ docker compose up -d

确保 traefik 容器已启动并正在运行。

$:~/traefik$ docker ps