Docker 如何设置 Traefik 反向代理?

文章导读
Previous Quiz Next
📋 目录
  1. 配置 Traefik 的步骤
  2. 结论
A A

Docker - 设置 Traefik



Previous
Quiz
Next 配置 Traefik 的步骤

在本节中,让我们逐步了解如何配置 Traefik −

步骤 1:从官方仓库拉取 Traefik 镜像

第一步是从 Docker 官网拉取官方 Traefik 镜像。这可以通过打开终端并运行以下命令来完成 −

$ docker pull traefik

此命令将把最新的 Traefik 镜像拉取到您的本地环境。

Pull the Latest Image of Traefik

步骤 2:为 Traefik 创建目录

让我们开始为 Traefik 设置创建一个目录。

$ mkdir traefik

步骤 3:创建 Traefik 配置文件

现在是时候创建一个 Traefik 配置文件了,它将是一个 YAML 文件 −

$ echo > traefik/traefik.yml

traefik.yml 的内容如下 −

api:
   dashboard: true # 可选,用于启用 web 仪表板
   insecure: true # 可选,无需认证即可进入仪表板
   debug: false # 可选,用于启用调试日志
entryPoints:
   web:
   address: ":80"
 # 如果需要使用 HTTPS 而非 HTTP,则可选
 #    http:
 #    redirections:
 #       entryPoint:
 #          to: websecure
 #          scheme: https
   websecure:
      address: ":443"
serversTransport:
   insecureSkipVerify: true
providers:
   docker:
      endpoint: "unix:///var/run/docker.sock"
      exposedByDefault: false
      network: proxy # 可选,仅使用 Docker 的 proxy 网络。
certificatesResolvers:
   letencrypt:
      acme:
         email: <youremail>@email.com
         storage: /certs/acme.json
         # caServer: https://acme-v02.api.letsencrypt.org/directory # 生产环境(默认)
         caServer: https://acme-staging-v02.api.letsencrypt.org/directory #  staging 环境
         httpChallenge:
            entryPoint: web

步骤 4:为 Traefik 创建 Docker Compose 文件

现在让我们创建 docker-compose.yml 文件。其内容如下 −

services:
   traefik:
      image: traefik:v3.0
      container_name: traefik
      restart: unless-stopped
      security_opt:
         - no-new-privileges:true
      environment:
         - TZ=Europe/Paris # 根据您的时区更改此项 
      networks:
         - frontend
      ports:
         - 80:80 # HTTP 入口点
         - 443:443 # HTTPS 入口点
         - 8080:8080 # 仪表板 Web GUI
      volumes:
         - /var/run/docker.sock:/var/run/docker.sock:ro # Docker 监视 Traefik 的 socket
         - ./traefik.yml:/traefik.yml:ro # Traefik 配置文件
         - traefik-certs:/certs # Docker volume 用于存储证书和 acme 文件
volumes:
   traefik-certs:
      name: traefik-certs

networks:
   frontend:
      driver: bridge

步骤 5:创建 acme.json 文件

现在让我们创建 acme.json 文件,用于存储用户权限和 SSL 证书。

{
   "email": "your@email.com",
   "storage": "acme/",
   "ca": "https://acme-v02.api.letsencrypt.org",
   "dns": {
      "provider": "cloudflare"
   }
}

步骤 6:启动容器

配置设置完成后,我们可以使用以下命令在 Docker 中运行容器 −

$ docker compose -f docker-compose.yml up -d

让我们详细了解该命令 −

  • docker compose − 用于使用 docker-compose.yml 文件运行具有多个容器的 docker 应用程序。
  • -f − 此标志指示文件路径,在我们的例子中,文件名是 traefik 目录下的 docker-compose.yml。
  • up − 此命令告诉 docker 启动 docker compose 文件中的服务。
  • -d − 此标志表示 detached 模式。
Start the Traefik Container

步骤 7:为您的服务配置 Traefik

让我们更新配置以使用 Traefik 作为反向代理。这可以通过在单独目录中为 web 服务创建 docker-compose.yaml 文件来完成,如下所示 −

$ mkdir webapp
$ cd webapp
$ touch docker-compose.yml

services:
   webapp:
      image: traefik/webapp
      networks:
         - web
      labels:
         - "traefik.enable=true"
         - "traefik.http.routers.webapp.rule=Host(`yourdomain.com`)"
         - "traefik.http.services.webapp.loadbalancer.server.port=80"
         - "traefik.http.routers.webapp.entrypoints=web,websecure"
         - "traefik.http.routers.webapp.tls=true"
         - "traefik.http.routers.webapp.tls.certresolver=http"

networks:
   web:
      external: true

让我们了解一下上面使用的配置信息 −

  • traefik.enable=true − 此标签指示 Traefik 正确管理服务。
  • traefik.http.routers.webapp.rule − 这指定了用于执行路由的域名。
  • traefik.http.services.webapp.loadbalancer.server.port − 此标签用于映射容器端口。
  • traefik.http.routers.webapp.entrypoints − 此标签提供了要使用的入口点信息。
  • traefik.http.routers.webapp.tls=true − 此标签启用 HTTPS 并自动处理证书。

您可以使用以下命令运行 webapp 的 docker compose 文件 −

$ docker compose -f webapp/docker-compose.yml up -d

步骤 8:检查设置是否正常工作

现在容器已启动并运行。我们可以访问以下 URL:http://<Server IP>:8080。

注意 − 由于您在本地机器上运行,可以直接将 <Server IP> 替换为 localhost 或 127.0.0.1。

上述 URL 的登陆页面如下所示 −

Check Whether Setup is Working Properly

结论

在本章中,我们讨论了如何使用 Docker 将 Traefik 容器化。Traefik 用于处理网络流量并管理 TLS/SSL 证书。这种设置易于管理,因为它具有可移植性且在不同环境中保持一致,您可以轻松地启动和运行它。这种设置可以顺利集成到其他基于 Docker 的系统中,并根据需要与他人共享。

关于使用 Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker Docker