Traefik 是一个现代反向代理和负载平衡服务器,支持第 4 层 (TCP) 和第 7 层 (HTTP) 负载平衡。 它的配置可以用 JSON、YML 或 TOML 格式定义。 它由入口点(前端)、服务(后端)、路由器(规则)、中间件(可选功能)组成。
本文将演示如何在第 7 层(HTTP)模式下使用 Traefik 负载均衡器。
先决条件
- 安装了 docker 和 docker-compose
- Internet 连接以下载 docker 图像。
- 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