在 Docker Swarm 部署 traefik 以實現跨主機代理

跨主機反向代理

目錄

inline table of content only on mobile

前言

如果你有多台主機,並且架設了 docker 服務,其實可以不用再每一台主機上都部署 traefik 來處理每個容器的反向代理和 TLS 證書

當然,如果在同一個區域網路下,可以簡單地使用 traefik 的動態配置文件做到

可是如果今天不在同一區域網路下呢?常見的情況就是在不同區域網路下的多台 VPS

又或者,就是想要使用 docker 的 traefik label 來設定中間件(middleware)呢?

畢竟如果想要添加 authentik、authelia 這類的授權頁面,或者使用 crowdsec,利用 traefik 的中間件非常方便設置

其實還有一個方法,那就是在 docker swarm 下部署容器,並利用 overlay network 來做到跨越多台 docker 主機的作用,也就是這篇文章的內容

🐧 docker swarm 的好處

I. 需求少

如果你的機器沒有公共 IP(public IP),像是宿舍或公寓裡自架的伺服器,你未必會有最上游 NAT 的權限來設置端口轉發(port fowarding),那麼在這台主機上所設置的服務,便會無法暴露到外網

而若使用 docker swarm,便只需要在一台機器上部署 traefik 進行反向代理,就可以把你家裡伺服器上的服務或網站暴露到外網

好處就是:只需要有一個公共 IP、只需要部署一個 traefik


且 docker swarm 是 docker 內建的功能,在完整安裝 docker engine 的時候就存在了,也不會佔用很多資源

II. 容易設置

使用 docker swarm 只需要簡單修改一下 docker 的 “labels” 區塊,和部署應用程式時的 docker 命令,就可以完成了

🐧 操作方法

前提

host1 : 「擁有」公共 IP,並且 traefik 將部署在這裡
host2 : 「沒有」公共 IP,其他的 app 會部署在這裡

第一步,初始化 docker swarm

host1 執行:

docker swarm init

他會輸出像這樣的內容,但這是設置 worker 用的token:
docker swarm join --token THISIS-7-89456123789aworker456987token....... IP_ADDR:2377

另外還會有一行,這行才是我們需要使用的:
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.


所以接著,繼續在 host1 執行:

docker swarm join-token manager

他會輸出像這樣的內容,這是設置 manager 用的token:
docker swarm join --token MAGENA-7-89456123789r456987token....... IP_ADDR:2377


第二步,將 host2 設置成 manager (非 worker,因為 worker 無法自行部署 app )

切換到 host2 後,執行 MANAGER 的設置命令

(記得複製你自己的)docker swarm join --token MAGENA-7-8943789r487token....... IP_ADDR:2377

接著,執行這個命令來檢查節點的狀態

docker node ls

應該會輸出像這樣的內容:

ID      HOSTNAME    STATUS    AVAILABILITY     MANAGER STATUS     ENGINE VERSION

idofhostt2    host2      Ready     Active        Reachable         27.3.1

idofhostt1 *   host1      Ready     Active        Leader         27.3.1

現在,我們就成功透過 docker swarm 來連接兩台跨網路的裝置了!



第三步,新增 traefik 的 docker-compose.yml 和其他配置文件 1

host1 新增如下方的資料夾和檔案

  • 新增資料夾 : mkdir traefik
  • 進入資料夾 : cd traefik
  • 新增檔案 : touch traefik.yml config.yml acme.json docker-compose.yml
  • 設置 acme 的權限 : chmod 600 acme.json

traefik
├ docker-compose.yml
├ traefik.yml
├ config.yml
└ acme.json

編輯 docker-compose.yml nano docker-compose.yml,把連結裡的內容貼上;

編輯 traefik.yml nano traefik.yml,把連結裡的內容貼上


(此步驟非必要,但強烈建議) 加上哈希密碼

sudo apt-get install apache2-utils

將「username」和「yourpassword」設置成你自己的用戶名和密碼

htpasswd -nb username yourpassword

命令執行後,會出現像這樣的一串:username:$apr1$8VzK7EwL$4Z9T.HqxGkJpAqVnqp4Ol1

把所有的 $ 改成 $$ (以避免 docker compose 會把單個$譯為環境變數)

接著,把 docker-compose.yml 裡面的 user:hashed_password 改成剛剛出現的那一串



第四步,部署 traefik

host1 執行:

docker stack deploy -c docker-compose.yml traefik

或使用任何你喜歡的名稱 docker stack deploy -c docker-compose.yml traefik_stack_name


host1 host2 檢查

docker service ls

輸出如下 :

ID       NAME       MODE    REPLICAS    IMAGE        PORTS

rtafeiksid    traefik_traefik    replicated   1/1      traefik:latest



第五步,新增 whoami 的 docker-compose.yml

切換到 host2 新增如下方的資料夾和檔案

  • 新增資料夾 : mkdir whoami
  • 進入資料夾 : cd whoami
  • 新增檔案 : touch docker-compose.yml

whoami
└ docker-compose.yml

編輯 docker-compose.yml nano docker-compose.yml,把連結裡的內容貼上



第六步,部署 apps (whoami)

host2 執行:

docker stack deploy -c docker-compose.yml whoami

或使用任何你喜歡的名稱 docker stack deploy -c docker-compose.yml whoami_stack_name


host1 host2 檢查

docker service ls

輸出如下 :

ID       NAME         MODE    REPLICAS    IMAGE        PORTS

rtafeiksid    traefik_traefik      replicated   1/1      traefik:latest

whoidami    whoami2_whoami2    replicated   1/1      traefik/whoami:v1.10



第七步,完成

現在,應該可以透過你在 traefik 標籤裡設置的域名來訪問 traefik 的 dashboard 或是 whoami 的頁面了

若有出現任何錯誤,記得:

  • 確認你的 DNS 紀錄有將域名指向 host1
  • 檢查 traefik 的日誌 docker service logs traefik_traefik
  • 檢查 docker swarm 的 overlay network docker network inspect proxy


by Pen

  1. traefik deployment reference: JimsGarage  ↩︎

到這頁的屁股了:3
📬Email:lipen@penli.quest

使用 Hugo 建立
主題 StackJimmy 設計