想用容器隔離交付 OpenClaw Gateway、又不想在升級夜手工改一堆路徑的團隊,通常會在 Compose、命名卷與鏡像 digest 之間做權衡。本文給出可復現的 Docker 生產路徑:與站內 Ubuntu 24.04 + systemd + Tunnel 裸機篇 明確分工,覆蓋環境基線、docker-compose.yml 結構、持久化卷、鏡像升級與健康檢查,以及容器層常見報錯的對照表。
裸機篇把抽象層壓到最低:進程直接跑在宿主機上,用 systemd 管重啟,用隧道承接公網入口。Docker 篇則把交付物從「目錄 + Unit」換成「鏡像 + Compose」:升級時主要操作是拉取新 digest、滾動容器與核對卷掛載是否仍然有效。兩條路都能做到「Gateway 只監聽迴環、邊緣終止 TLS」,差別在於你是否願意承擔鏡像供應鏈與卷治理的複雜度,來換取多環境一致性與回滾粒度。
若團隊已經統一了鏡像倉庫、掃描與 SBOM 流程,Compose 往往是阻力最小的生產形態;若只有單臺 VPS、變更頻率低,裸機 systemd 可能更省總帳。下面六條「痛點拆解」來自常見排障對話,用來幫你判斷自己是否準備好上容器。
把 latest 標籤當成版本管理:生產應固定 digest 或帶構建號的 immutable tag;否則「昨晚還能跑」無法對應到任何一層文件系統。
配置寫進鏡像層:環境相關參數應走 env、secrets 或掛載只讀配置;否則每次改令牌都要重新 build,違背容器交付初衷。
匿名卷堆滿磁碟:未命名的緩存卷在多次試驗後會悄悄佔滿 /var/lib/docker;需要命名卷或外部對象存儲策略。
健康檢查永遠返回 200:只檢查 HTTP 埠而不驗證上遊模型或配置加載,會在流量切入後集中爆 502。
compose 與隧道各寫各的:ingress 仍指向舊容器 IP 或舊埠時,外網症狀與容器日誌會完全對不上。
在 Linux 容器裡硬扛 macOS 工作負載:與裸機篇同理,需要 Xcode/模擬器的任務應放到遠程 Mac 執行層,而不是把容器當萬能沙箱。
當你能明確回答「鏡像從哪來、卷存什麼、升級誰負責」三件事,就可以進入環境與 Compose 模板部分;若答不上來,先在預發布環境把三條答案寫成一頁紙再動生產。
與裸機路徑並行維護時,建議共用同一份監聽與隧道拓撲約定:容器內仍只暴露 127.0.0.1 映射到宿主機迴環,由 cloudflared 或等價邊緣承接。這樣從 systemd 遷到 Compose 時,安全邊界不需要重寫,只替換進程託管層。
若你在團隊內同時維護「安裝腳本」與「compose 倉庫」,務必規定單一事實來源:要麼以 compose 為唯一交付入口並在 CI 裡渲染出 systemd 片段供少數裸機特例使用,要麼反過來——雙軌並行時最常見的事故是埠、卷名與 env 文件路徑在兩邊各改一半。
最後提醒:容器能緩解依賴地獄,但不會消除密鑰輪換與審計要求。把 env_file 當保險箱而不做權限與輪換流程,和把令牌明文寫進倉庫本質相同,只是崩潰時間推遲到下次滲透測試。
評審時把「安裝分鐘數」和「季度升級成本」放在同一行:容器路徑的前置投入更高,但每次升級的可重複性也更高。下表用於和干係人對齊,佔位服務名與埠請替換為你環境內的真實值。
| 維度 | Gateway 直綁公網 | systemd + 迴環 + Tunnel(裸機) | Docker Compose 生產 |
|---|---|---|---|
| 交付單元 | 手工目錄與腳本 | Unit + 配置文件 | 鏡像 digest + compose 文件 |
| 升級路徑 | 高摩擦,易漂移 | 替換二進位與配置,滾動 systemctl | pull 鏡像、recreate 容器、核對卷 |
| 隔離性 | 弱 | 中等(依賴用戶與權限) | 強(命名空間與 cgroup,仍非完整虛擬化) |
| 可觀測性 | 需自建 | journald 清晰 | 需統一 docker logs / 旁路 agent |
| 典型代價 | 安全風險最高 | 運維腳本化要求適中 | 鏡像供應鏈與卷治理成本 |
Compose 的價值在於把「運行態 + 持久化 + 依賴邊」聲明化;若你拒絕給卷和標籤起名字,容器只會把混亂延遲到磁碟告警那天。
以 Ubuntu 24.04 LTS 或同類伺服器為例:請安裝官方文檔支持的 Docker Engine 與 Compose v2 插件(docker compose 子命令),避免混用已廢棄的獨立 docker-compose 二進位造成 CI 與生產不一致。資源方面,除 Gateway 自身記憶體外,要為日誌、臨時解壓與並發連接預留 headroom;磁碟分區建議單獨關注 /var/lib/docker 的增長曲線。
安全基線與裸機篇一致:業務埠不對公網監聽,SSH 僅密鑰,防火牆默認拒絕入站。容器只是多了一層命名空間,不會自動替你做好 TLS 與訪問控制。
校驗版本:docker version 與 docker compose version 輸出寫入 Runbook,生產與預發布 minor 對齊。
啟用 log-driver 與輪轉策略:默認 json-file 時配置 max-size / max-file,避免單容器刷爆磁碟。
創建專用網絡:在 compose 中聲明自定義 bridge,限制僅網關與隧道側車互通,減少默認 bridge 的意外暴露。
拉取策略與鏡像源:記錄 registry、鏡像名與 digest;生產拉取使用同一鏡像倉,避免「調試時 docker.io、上線時私有倉」混用。
準備命名卷或綁定掛載策略:配置與密鑰分卷:只讀掛載配置目錄,可寫卷僅放運行態與緩存,密鑰用 secret 文件權限 400。
預演一次完整 down/up:在預發布執行 docker compose down 再 up -d,確認卷未丟、隧道仍指向上遊。
提示:OpenClaw 具體鏡像名、環境變量與啟動參數以官方文檔為準;下文 YAML 中的服務名、鏡像佔位與環境鍵均為示例,落地前請替換並刪除未使用欄位。
生產映射建議採用 127.0.0.1:宿主機埠:容器埠,讓宿主機迴環承接隧道上遊,與裸機篇「只監聽 127.0.0.1」一致。健康檢查應至少驗證 HTTP 就緒;若官方提供配置校驗子命令,可在 start_period 內放寬重試間隔,避免鏡像剛起就被誤殺。
services:
openclaw-gateway:
image: ghcr.io/example/openclaw-gateway@sha256:<DIGEST>
restart: unless-stopped
env_file:
- ./gateway.env
volumes:
- openclaw_data:/var/lib/openclaw
- ./gateway.yaml:/etc/openclaw/gateway.yaml:ro
ports:
- "127.0.0.1:8787:8787"
healthcheck:
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:8787/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 40s
volumes:
openclaw_data:
升級建議順序:① 在預發布 docker compose pull 校驗 digest;② 備份命名卷內關鍵數據或導出配置;③ 生產執行 docker compose up -d --no-deps --build(若無 build 則去掉對應標誌)並觀察健康檢查;④ 本機與隧道各 curl 一次;⑤ 確認無異常後再 docker image prune 清理懸空層(慎用,先確認無回滾需求)。
排錯時優先看三層:容器日誌是否報配置或權限;宿主機 ss -tlnp 是否仍綁定預期迴環埠;隧道 ingress 是否仍指向該埠。外網 502 而 curl 127.0.0.1 正常時,不要先懷疑鏡像,先核對路由。
對需要「藍綠」式切換的團隊,可以短暫並行起兩套 compose project(不同 project name、不同宿主機迴環埠),在隧道或內部 LB 上做權重切換;切完務必 docker compose -p old_project down,否則舊容器會繼續佔用卷鎖或後臺任務。
若 Gateway 需要訪問宿主機上的 Unix socket 或本地模型側車,優先評估是否真的需要 network_mode: host——它會繞過部分埠映射隔離,應視為高風險開關並在變更單裡雙人覆核。
注意:不要把含 API 密鑰的 gateway.env 提交進 Git;CI 構建日誌裡禁止列印 compose 渲染後的完整環境。卷權限與 UID/GID 映射錯誤時,常見症狀是「健康檢查偶發失敗」而非直接啟動崩潰。
下列條目用於和平臺組對齊「容器默認不是免費午餐」的事實;具體數字請用你們監控中的 P95 與磁碟曲線替換佔位描述。
監控側建議為容器增加「重啟次數」「不健康持續時間」與「卷使用率」三類告警,而不是只看 CPU;Gateway 類服務往往在磁碟或文件描述符耗盡時才出現雪崩式重啟。
/var/lib/docker 的月增量常以數十 GB計;應與卷備份策略一起納入告警。start_period,再按 RPS 調整。純 Linux 容器適合承載 OpenClaw 網關、隊列與輕量編排,但在 Xcode、模擬器與 Apple Silicon 特性上仍會撞到硬邊界:要麼持續為兼容層買單,要麼把執行層挪到專用 Mac。相比在個人筆記本或臨時機器上湊合跑網關——睡眠、更新與權限彈窗會把自動化打成不可預測狀態——把需要穩定在線與蘋果生態對齊的工作負載放到合同化的遠程 Mac 獨佔節點,同時讓 Linux 側繼續用 Docker 或 systemd 託管控制面,失敗域更清晰。綜合長期排班、磁碟與合規成本,NodeMini 的 Mac Mini 雲端租賃通常是更優解:網關留在 VPS 容器裡,重活交給可訂購的執行節點,團隊不必在「錯誤層級」上反覆修補。