之前看到 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 可以做到兩件事:

  1. Standard:建立 Docker 連線伺服器,具備 TLS 與 Token 驗證功能
  2. 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_URLTOKEN 編輯並取消註解就好。

DOCKHAND_SERVER_URL 就是管理機器的 Domain(要能從被管理機器連線上)填入到 wss://your-dockhand.example.com/api/hawser/connectyour-dockhand.example.com 部分。注意他走的是 wss,因此如果有使用 Nginx 等會管連線的工具,要記得允許 WebSocket 連線。(參考《在家裡用 Raspberry Pi 5 和 Docker 用一個放什麼都方便的小機器》中的 WebSocket Support 選項。)

TOKEN 則是從新增介面取得。
Create env from dashboard
Get token

儲存後,啟用 Service 即可

1
sudo systemctl enable --now hawser

完成後就會出現新的 Environment 了,和本地的一樣,可以查看和管理 Docker Container、Image、Volume 等。

後記

沒有,就是瞎搞瞎玩發現有趣的東西寫篇廢文。