之前看到 Dockhand,發現介面比 Portainer 看起來好看很多,就順帶把所有之前設定過的 Portainer 都換掉了。而最近在處理一個 Docker 機器一直死掉的問題,由於該機器只是簡單的 Docker on Linux,沒有特別安裝管理介面,覺得管理起來很難用,又想起 Dockhand 的介面看起來可以管多個 Docker,就發現了 Dockhand 的附屬產品 Hawser。
連線到 Docker 的方法
為了增加篇幅(並不是),先介紹 Docker 常見的連線方式。通常我們都會用像是 Docker Desktop 或 Docker CLI 來連線,這種通常是基於Socket,因此不需要額外建立網路連線。然而如果我們是不同機器的話就無法直接使用,因此 Docker 本身也允許開啟 2375/2376 Port 來遠端連線,但該 2375 預設並沒有加密,而 2376 雖然有加密,但設定相對複雜很多。
因此,如果要維持使用 2375,那我想簡單的作法是透過虛擬區域網路進行,例如 VPC、私人 VPN 或 TailScale 這類工具。由於我管理用的機器和被管理的機器不位於同一個平台,VPC 不是一個容易的選項。私人 VPN 雖然是個選項,但設定上比較麻煩。TailScale 則是不想付錢(因為我用在公司,應該不能用免費方案)。
我遇到的問題
我們最主要的問題是我們被管理的機器沒有對外 IP(因為該機器是放 Web 服務,所以前面有一個 Load Balancer 負責對外),為了監看管理而特別把他轉換成可外部連線的話感覺改太多,資安上也必須要更深入考量,因此我傾向於不使用基於外部 IP 的作法。排除掉 TailScale 後,我第一個想到的是透過 Cloudflare Tunnel。實際上我覺得也有機會做出來,主要可能就只是設定上會比較麻煩。
Hawser 用途
正在研究的過程中,我看到 Dockhand 有兩個額外的連線模式:Hawser (standard) 和 Hawser (edge),好奇看了一下這個是什麼後,發現他正好可以解決這些問題。
Hawser 可以做到兩件事:
- Standard:建立 Docker 連線伺服器,具備 TLS 與 Token 驗證功能
- Edge:將本地 Docker 透過 Token 連線到 Dockhand
第一項相當於原本的 2375/2376,但額外加入了 Token 驗證,簡化原本需要用 CA 進行認證的複雜度。但在沒有對外 IP 的狀況下,這並沒有太多用處。
因此最受我吸引的就是第二個選項。由於我們管理機器本來就可以從外網連入,被管理的機器透過 Hawser 建立與管理機器的連線,如此就可以避免需要建立對外 IP 的問題。這相當於建立一個 Tunnel,允許管理機器直接連線到被管理的機器而無須知道該機器的 IP。
使用方法
GitHub Repo:https://github.com/Finsys/hawser
雖然官方 Readme 寫說從 GitHub Release 下載 Binary,但其實往下拉他就有安裝腳本了:
1 | curl -fsSL https://raw.githubusercontent.com/Finsys/hawser/main/scripts/install.sh | bash |
由於我們被管理的機器要一直被管理(?),所以很自然的我們就選用 Systemd Service 模式。
安裝好後只需要編輯 /etc/hawser/config,把 PORT 那行註解掉(關閉 Standard Mode),並將 Edge Mode 的 DOCKHAND_SERVER_URL 與 TOKEN 編輯並取消註解就好。
DOCKHAND_SERVER_URL 就是管理機器的 Domain(要能從被管理機器連線上)填入到 wss://your-dockhand.example.com/api/hawser/connect 的 your-dockhand.example.com 部分。注意他走的是 wss,因此如果有使用 Nginx 等會管連線的工具,要記得允許 WebSocket 連線。(參考《在家裡用 Raspberry Pi 5 和 Docker 用一個放什麼都方便的小機器》中的 WebSocket Support 選項。)
TOKEN 則是從新增介面取得。

儲存後,啟用 Service 即可
1 | sudo systemctl enable --now hawser |
完成後就會出現新的 Environment 了,和本地的一樣,可以查看和管理 Docker Container、Image、Volume 等。
後記
沒有,就是瞎搞瞎玩發現有趣的東西寫篇廢文。