博客 / 詳情

返回

如何在Ubuntu系統中為docker容器建立反向代理 ?

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

安裝完成後,運行以下命令生成加密的密碼。在本例中,我使用 Traefik@123# 進行加密。你可以有自己的假設。用户為 admin,您可以用自己的用户名替換它。

$ htpasswd -nb admin Traefix@123#

您將得到加密的密碼,如下所示

pkumar@traefik:~$ htpasswd -nb admin Traefik@123#
admin:$apr1$V.9MT9VH$MtLgwiAa4jq1ngDVvTdJu/
pkumar@traefik:~$

複製此輸出並將其保存在某處,因為我們需要在 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 = "info@linuxtechi.local"
  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 = "api@internal"
  [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...

Traefik-login-window-Ubuntu

登錄到儀表板後,您將看到以下界面

Traefik-Dashboard-Ubuntu

(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: dbpass@123#
      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: sqlpass@123#
    MYSQL_DATABASE: wordpress_db
    MYSQL_USER: dbuser
    MYSQL_PASSWORD: dbpass@123#
  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: dbpass@123#
      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: sqlpass@123#
      MYSQL_DATABASE: wordpress_db
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass@123#
    networks:
      - internal
    labels:
      - traefik.enable=false

保存文件並退出文件

運行以下命令來創建 MySQL 和 wordpress 容器

$ docker-compose up -d

現在導航到 Traefik 儀表板並單擊 HTTP 路由器,您將發現儀表板中添加了新的容器。

WordPress-Frontend-Traefik-Ubuntu

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-Installation-Traefik-Ubuntu

完成安裝嚮導。現在您可以使用您的 WordPress 站點了。

我的開源項目

  • course-tencent-cloud(酷瓜雲課堂 - gitee倉庫)
  • course-tencent-cloud(酷瓜雲課堂 - github倉庫)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.