2026 OpenClaw Docker 生產部署 Compose 編排 · 鏡像升級 · 卷持久化與 systemd 對照

想用容器隔離交付 OpenClaw Gateway、又不想在升級夜手工改一堆路徑的團隊,通常會在 Compose、命名卷與鏡像 digest 之間做權衡。本文給出可復現的 Docker 生產路徑與站內 Ubuntu 24.04 + systemd + Tunnel 裸機篇 明確分工,覆蓋環境基線、docker-compose.yml 結構、持久化卷、鏡像升級與健康檢查,以及容器層常見報錯的對照表。

01

這篇與「systemd 裸機 + Tunnel」篇各管哪一段

裸機篇把抽象層壓到最低:進程直接跑在宿主機上,用 systemd 管重啟,用隧道承接公網入口。Docker 篇則把交付物從「目錄 + Unit」換成「鏡像 + Compose」:升級時主要操作是拉取新 digest、滾動容器與核對卷掛載是否仍然有效。兩條路都能做到「Gateway 只監聽迴環、邊緣終止 TLS」,差別在於你是否願意承擔鏡像供應鏈與卷治理的複雜度,來換取多環境一致性與回滾粒度。

若團隊已經統一了鏡像倉庫、掃描與 SBOM 流程,Compose 往往是阻力最小的生產形態;若只有單臺 VPS、變更頻率低,裸機 systemd 可能更省總帳。下面六條「痛點拆解」來自常見排障對話,用來幫你判斷自己是否準備好上容器。

  1. 01

    把 latest 標籤當成版本管理:生產應固定 digest 或帶構建號的 immutable tag;否則「昨晚還能跑」無法對應到任何一層文件系統。

  2. 02

    配置寫進鏡像層:環境相關參數應走 env、secrets 或掛載只讀配置;否則每次改令牌都要重新 build,違背容器交付初衷。

  3. 03

    匿名卷堆滿磁碟:未命名的緩存卷在多次試驗後會悄悄佔滿 /var/lib/docker;需要命名卷或外部對象存儲策略。

  4. 04

    健康檢查永遠返回 200:只檢查 HTTP 埠而不驗證上遊模型或配置加載,會在流量切入後集中爆 502。

  5. 05

    compose 與隧道各寫各的:ingress 仍指向舊容器 IP 或舊埠時,外網症狀與容器日誌會完全對不上。

  6. 06

    在 Linux 容器裡硬扛 macOS 工作負載:與裸機篇同理,需要 Xcode/模擬器的任務應放到遠程 Mac 執行層,而不是把容器當萬能沙箱。

當你能明確回答「鏡像從哪來、卷存什麼、升級誰負責」三件事,就可以進入環境與 Compose 模板部分;若答不上來,先在預發布環境把三條答案寫成一頁紙再動生產。

與裸機路徑並行維護時,建議共用同一份監聽與隧道拓撲約定:容器內仍只暴露 127.0.0.1 映射到宿主機迴環,由 cloudflared 或等價邊緣承接。這樣從 systemd 遷到 Compose 時,安全邊界不需要重寫,只替換進程託管層。

若你在團隊內同時維護「安裝腳本」與「compose 倉庫」,務必規定單一事實來源:要麼以 compose 為唯一交付入口並在 CI 裡渲染出 systemd 片段供少數裸機特例使用,要麼反過來——雙軌並行時最常見的事故是埠、卷名與 env 文件路徑在兩邊各改一半。

最後提醒:容器能緩解依賴地獄,但不會消除密鑰輪換與審計要求。把 env_file 當保險箱而不做權限與輪換流程,和把令牌明文寫進倉庫本質相同,只是崩潰時間推遲到下次滲透測試。

02

選型對照:Docker Compose 生產 vs systemd 裸機 vs 網關直出公網

評審時把「安裝分鐘數」和「季度升級成本」放在同一行:容器路徑的前置投入更高,但每次升級的可重複性也更高。下表用於和干係人對齊,佔位服務名與埠請替換為你環境內的真實值。

維度Gateway 直綁公網systemd + 迴環 + Tunnel(裸機)Docker Compose 生產
交付單元手工目錄與腳本Unit + 配置文件鏡像 digest + compose 文件
升級路徑高摩擦,易漂移替換二進位與配置,滾動 systemctlpull 鏡像、recreate 容器、核對卷
隔離性中等(依賴用戶與權限)強(命名空間與 cgroup,仍非完整虛擬化)
可觀測性需自建journald 清晰需統一 docker logs / 旁路 agent
典型代價安全風險最高運維腳本化要求適中鏡像供應鏈與卷治理成本

Compose 的價值在於把「運行態 + 持久化 + 依賴邊」聲明化;若你拒絕給卷和標籤起名字,容器只會把混亂延遲到磁碟告警那天。

03

環境與前置:Docker Engine、Compose v2 與資源下限

以 Ubuntu 24.04 LTS 或同類伺服器為例:請安裝官方文檔支持的 Docker EngineCompose v2 插件docker compose 子命令),避免混用已廢棄的獨立 docker-compose 二進位造成 CI 與生產不一致。資源方面,除 Gateway 自身記憶體外,要為日誌、臨時解壓與並發連接預留 headroom;磁碟分區建議單獨關注 /var/lib/docker 的增長曲線。

安全基線與裸機篇一致:業務埠不對公網監聽,SSH 僅密鑰,防火牆默認拒絕入站。容器只是多了一層命名空間,不會自動替你做好 TLS 與訪問控制。

  1. 01

    校驗版本:docker versiondocker compose version 輸出寫入 Runbook,生產與預發布 minor 對齊。

  2. 02

    啟用 log-driver 與輪轉策略:默認 json-file 時配置 max-size / max-file,避免單容器刷爆磁碟。

  3. 03

    創建專用網絡:在 compose 中聲明自定義 bridge,限制僅網關與隧道側車互通,減少默認 bridge 的意外暴露。

  4. 04

    拉取策略與鏡像源:記錄 registry、鏡像名與 digest;生產拉取使用同一鏡像倉,避免「調試時 docker.io、上線時私有倉」混用。

  5. 05

    準備命名卷或綁定掛載策略:配置與密鑰分卷:只讀掛載配置目錄,可寫卷僅放運行態與緩存,密鑰用 secret 文件權限 400。

  6. 06

    預演一次完整 down/up:在預發布執行 docker compose downup -d,確認卷未丟、隧道仍指向上遊。

info

提示:OpenClaw 具體鏡像名、環境變量與啟動參數以官方文檔為準;下文 YAML 中的服務名、鏡像佔位與環境鍵均為示例,落地前請替換並刪除未使用欄位。

04

Compose 骨架:埠映射、卷、健康檢查與升級命令

生產映射建議採用 127.0.0.1:宿主機埠:容器埠,讓宿主機迴環承接隧道上遊,與裸機篇「只監聽 127.0.0.1」一致。健康檢查應至少驗證 HTTP 就緒;若官方提供配置校驗子命令,可在 start_period 內放寬重試間隔,避免鏡像剛起就被誤殺。

docker-compose.yml 示例
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——它會繞過部分埠映射隔離,應視為高風險開關並在變更單裡雙人覆核。

warning

注意:不要把含 API 密鑰的 gateway.env 提交進 Git;CI 構建日誌裡禁止列印 compose 渲染後的完整環境。卷權限與 UID/GID 映射錯誤時,常見症狀是「健康檢查偶發失敗」而非直接啟動崩潰。

05

可寫進值班手冊的硬參數與拓撲提示

下列條目用於和平臺組對齊「容器默認不是免費午餐」的事實;具體數字請用你們監控中的 P95 與磁碟曲線替換佔位描述。

監控側建議為容器增加「重啟次數」「不健康持續時間」與「卷使用率」三類告警,而不是只看 CPU;Gateway 類服務往往在磁碟或文件描述符耗盡時才出現雪崩式重啟。

  • 鏡像層與磁碟:頻繁拉取大基礎鏡像時,/var/lib/docker 的月增量常以數十 GB計;應與卷備份策略一起納入告警。
  • 健康檢查間隔:過短會放大抖動,過長會拖慢流量切入;常見起點為 30s 間隔 + 合理 start_period,再按 RPS 調整。
  • 回滾窗口:保留至少一個已知良好的 digest tag,並在 compose 文件中以注釋寫明發布工單號,避免「只能 latest 回滾」。

純 Linux 容器適合承載 OpenClaw 網關、隊列與輕量編排,但在 Xcode、模擬器與 Apple Silicon 特性上仍會撞到硬邊界:要麼持續為兼容層買單,要麼把執行層挪到專用 Mac。相比在個人筆記本或臨時機器上湊合跑網關——睡眠、更新與權限彈窗會把自動化打成不可預測狀態——把需要穩定在線與蘋果生態對齊的工作負載放到合同化的遠程 Mac 獨佔節點,同時讓 Linux 側繼續用 Docker 或 systemd 託管控制面,失敗域更清晰。綜合長期排班、磁碟與合規成本,NodeMini 的 Mac Mini 雲端租賃通常是更優解:網關留在 VPS 容器裡,重活交給可訂購的執行節點,團隊不必在「錯誤層級」上反覆修補。

FAQ

常見問題

可以分環境使用:預發布 Compose、生產裸機,或按服務拆分。關鍵是統一監聽與隧道約定,避免同一宿主機上兩套 Gateway 爭用迴環埠。更多 OpenClaw 文章見 專欄篩選

先看 docker logs 與健康檢查命令是否仍匹配新版本路徑;再核對卷權限與 env。需要並行算力時,可先對照 租賃價格說明 評估遠程 Mac 節點。

檢索 幫助中心 的 SSH/VNC 與網絡條目;容器網絡問題另查宿主機防火牆與 docker network。