目錄
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 進行反向代理,就可以把你家裡伺服器上的服務或網站暴露到外網
且 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 VERSIONidofhostt2 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 PORTSrtafeiksid 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 PORTSrtafeiksid 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
traefik deployment reference: JimsGarage ↩︎