使用 Docker 安裝與設定 Traefik

我們將使用 Docker Compose 來安裝並啟動一個最基礎的 Traefik 實例。這將作為後續所有範例的基礎。

前置準備

請確保你的開發環境已經安裝了:

  • Docker Engine: 版本 20.10+
  • Docker Compose: 版本 1.29+ (或是 Docker Desktop 內建的 docker compose v2)

安裝教學

你可以透過以下指令檢查:

docker --version
docker compose version

建立專案目錄

首先,在你的電腦上建立一個新的目錄,例如 traefik-lab,並進入該目錄:

mkdir traefik-lab
cd traefik-lab

建立 docker-compose.yml

在目錄中建立一個名為 docker-compose.yml 的檔案,內容如下:

version: '3'

services:
  # Traefik Reverse Broker
  traefik:
    image: traefik:v3.0
    container_name: traefik
    # 啟用 Web UI 並設定 Docker Provider
    command:
      - '--api.insecure=true' # 開發環境使用,啟用 Dashboard (不安全模式)
      - '--providers.docker=true' # 啟用 Docker Provider
      - '--providers.docker.exposedbydefault=false' # 預設不暴露所有容器
      - '--entrypoints.web.address=:80' # 定義 EntryPoint: web 監聽 80 port
    ports:
      - '80:80' # HTTP Port
      - '8080:8080' # Dashboard Port (Web UI)
    volumes:
      # 重要:讓 Traefik 能夠監聽 Docker Daemon 的事件
      - /var/run/docker.sock:/var/run/docker.sock:ro

  # 測試用的 Web 服務 (whoami)
  whoami:
    image: traefik/whoami
    container_name: simple-service
    labels:
      - 'traefik.enable=true' # 告訴 Traefik 這個容器需要被代理
      - 'traefik.http.routers.whoami.rule=Host(`whoami.localhost`)' # 路由規則
      - 'traefik.http.routers.whoami.entrypoints=web' # 指定使用 web EntryPoint

設定檔解析

讓我們逐行解釋這個 docker-compose.yml 的關鍵部分:

  1. image: traefik:v3.0: 使用官方 Traefik v3 映像檔。
  2. command:
    • --api.insecure=true: 啟用 Web Dashboard。注意:這會開啟 8080 port 且完全沒有密碼保護,僅限開發環境使用
    • --providers.docker=true: 告訴 Traefik 監聽 Docker 事件。
    • --providers.docker.exposedbydefault=false: 安全性設定。這表示只有當容器有明確加上 traefik.enable=true 的 Label 時,Traefik 才會處理它。如果不設為 false,Traefik 會嘗試代理所有的容器,這可能會暴露不該暴露的服務 (如資料庫)。
    • --entrypoints.web.address=:80: 定義一個名為 web 的進入點,監聽 TCP 80 port。
  3. ports:
    • 80:80: 將主機的 80 port 對應到容器的 80 port (web)。
    • 8080:8080: 將主機的 8080 port 對應到容器的 8080 port (dashboard)。
  4. volumes:
    • /var/run/docker.sock:/var/run/docker.sock:ro: 這是 Docker Provider 運作的關鍵。Traefik 需要存取這個 Socket 檔案才能與 Docker Daemon 溝通,獲取容器的資訊。:ro 表示唯讀 (Read-only),增加安全性。

啟動服務

在終端機執行以下指令啟動服務:

docker compose up -d

Traefik 應該會很快啟動完成。你可以用 docker compose ps 確認狀態。

驗證安裝

1. 存取 Dashboard

打開瀏覽器,輸入 http://localhost:8080。你應該會看到 Traefik 的 Dashboard 介面。這證明 Traefik 已經成功啟動並在運行中。

2. 存取測試服務 (whoami)

我們在 whoami 服務上設定了 Host(`whoami.localhost`) 的規則。

打開瀏覽器或使用 curl 測試:

curl -H "Host: whoami.localhost" http://localhost

或是直接在瀏覽器輸入 http://whoami.localhost (大部分現代瀏覽器和 OS 都會將 *.localhost 解析為 127.0.0.1)。

你應該會看到類似這樣的輸出:

Hostname: 6e0d37e6f6b5
IP: 127.0.0.1
IP: 172.19.0.3
RemoteAddr: 172.19.0.2:41652
GET / HTTP/1.1
Host: whoami.localhost
User-Agent: curl/7.64.1
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.19.0.1
X-Forwarded-Host: whoami.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: 0d6d5c6f3b5a
X-Real-Ip: 172.19.0.1

這代表你的請求已經成功:

  1. 到達 Traefik (:80)。
  2. Traefik 根據 Host Header (whoami.localhost) 匹配到了路由規則。
  3. Traefik 將請求轉送給了 whoami 容器。
  4. whoami 容器回應了它的內部資訊。

靜態配置:Command vs File

在上面的範例中,我們使用 Command Line Arguments (CLI 參數) 來設定 Traefik 的靜態配置 (Static Configuration)。這是最簡單快速的方法。

但在生產環境中,設定可能會變得很複雜。這時我們會傾向使用一個獨立的設定檔 traefik.yml

如果要改用檔案配置,你需要:

  1. 建立 traefik.yml
  2. command 區塊移除。
  3. traefik.yml 掛載到容器內的 /etc/traefik/traefik.yml

之後的章節,為了教學方便,我們將主要使用 CLI 參數方式,但在進階設定章節會介紹如何遷移到設定檔。