2026 OpenClaw Docker Compose 多容器部署:Gateway 綁定、Token 與「子代理配對 1008」網絡修復清單(含 trustedProxies)

約 14 分鐘閱讀 · MACCOME

誰會遇到問題:Docker Compose 同時跑 Gateway 與 CLI/代理相關容器,日誌裡 Gateway 「看起來在跑」,但子會話/工具一調用就出現 gateway closed (1008):pairing required,或 RPC 顯示健康卻仍卡在配對。本文結論:這不是「再重裝一遍鏡像」能解決的孤立問題,而往往是 綁定面、Token、可信代理網段(trustedProxies)與容器間 URL 的組合問題;本文給出症狀矩陣、Compose 片段、六步 Runbook 與三 KPI分工:與《官方 docker-setup.sh + GHCR》《配對與 Token》《Docker 網絡分診》並聯。

Compose 裡「Gateway 已啟動」為何仍會在子代理上報 1008?

OpenClaw 的 Gateway 負責長連接與路由;當 CLI 或「子會話/子代理」類工具跨 WebSocket/HTTP 與 Gateway 對話時,除了進程在線,還要求調用方在 Gateway 視角下的網絡身份可信,且配對狀態未過期。Docker 默認把每個服務放進獨立網絡命名空間:如果你在 CLI 容器裡寫 http://127.0.0.1:18789,請求只會在容器自己上打洞,而不是宿主機或其他服務。

  1. 服務名未替換 localhost:應使用 http://openclaw-gateway:18789(示例)這類 Compose DNS 名稱
  2. bind 與訪問面不一致:Gateway 僅監聽 loopback 時,其他容器通過 bridge IP 訪問會被當成「非本機」,觸發鑑權或配對分支。
  3. 缺少 trustedProxies:當 Gateway 位於反代或 bridge 之後,需要把 Docker 網段(常見如 172.16.0.0/1210.0.0.0/8 以及你們自定義網絡的 CIDR)聲明為可信以正確識別客戶端身份。
  4. OPENCLAW_GATEWAY_TOKEN 漂移:網關與 CLI 的 token 來自不同掛載路徑或 env,表現為「有時能連有時 401/1008 交替」。
  5. 升級後配對狀態丟失:與卷掛載不完整有關,子代理會話需要重新配對但被誤當成網絡問題。
  6. 忽略官方 issue 中的模式:社區在 Docker 場景經常總結:loopback bind + 分容器 = 必須顯式改 bind 或 trusted proxy 策略——這不是缺陷而是網絡邊界合同

與《三平臺安裝總覽》不同:Compose 的重點不是「裝在哪個 OS」,而是哪張網在哪個容器眼裡算可信

當你復現問題時,建議把三條日誌指紋並排保存:Gateway 啟動行、子代理調用棧、以及 docker inspect 裡 attachable 網絡的 Subnet——很多 1008 在對比這三者後會落在「未聲明可信網段」而不是模型或通道本身。

表 1:症狀 → 先查項(決策矩陣)

症狀快照優先核查(升序)常見根因
容器 A ping 不通 127.0.0.1:18789先換服務名 URL,再看 publish 埠與監聽地址localhost 語義錯誤
RPC healthy 但 sessions_spawn 報 1008配對列表 → trustedProxies → bind 三元組子代理路徑被視為外部未配對
日誌有 trusted proxy / pairing 字樣對齊 compose 網絡 CIDR 與 gateway.auth 配置網段未列入可信集合
僅跨版本升級後出現比對新老默認 bind/auth、遷移備份的 .openclaw默認收緊或配對失效
info

提示:若你使用官方 docker-setup.sh 路徑,請仍以本文的網絡合同視角覆核服務名與卷——詳見《GHCR 與 Control UI Runbook》。

表 2:bind 模式 vs 容器間訪問(對照)

gateway.bind(概念)適合與 Compose 的摩擦點
loopback單容器 all-in-one 或僅宿主機訪問其他服務容器無法直接當本機迴環訪問
lan / 自定義監聽多服務、需跨容器 RPC必須配 token / auth 且收緊暴露面
trusted reverse proxy前面還有 Nginx/Caddy需與《反代清單》一致聲明下遊來源

表 3:trustedProxies 填寫思路(含示例 CIDR)

下表為教學示例:務必用 docker network inspect 取得你們真實 subnet,而不是盲抄。

網絡類型常見 CIDR 示例你要做的事
Docker 默認 bridge172.17.0.0/16(視環境而定)對照 Gateway 收到的源 IP 是否落在該段
Compose 自定義網絡例如 172.18.0.0/16172.30.x.x整條子網加入 trustedProxies(而非單個容器 IP)
overlay / swarm由編排下發同樣以「子網」而不是 pod IP 列表為目標,減少抖動

六步 Runbook:從「容器能互 ping」到「子代理可配對」

  1. 統一 OPENCLAW_CONFIG_DIR:Gateway 與 CLI/agents 掛載同一路徑或同步內容,避免一份讀 A、一份讀 B。
  2. 用服務名寫 Gateway URL:在 CLI 容器 env:OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789(名稱以你的 compose 服務名為準)。
  3. 對齊 Token:OPENCLAW_GATEWAY_TOKEN 兩側一致;若用文件 token,確認掛載 uid 可讀。
  4. 設置 gateway 綁定與 trustedProxies:按表 2/3 更新配置後重啟 Gateway(綁定類變更通常需要硬重啟)。
  5. 跑診斷鏈:openclaw gateway statusopenclaw doctor → 復現子代理動作並抓日誌關鍵字 1008 / pairing
  6. 登記三 KPI:成功配對耗時、重啟次數、是否仍有跨容器 RPC 超時——寫在變更單。
yaml
# 片段示例(服務名與環境佔位 — 上線前請替換)
services:
  openclaw-gateway:
    environment:
      - OPENCLAW_CONFIG_DIR=/config
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - ./config:/config
    networks: [oc-net]

  openclaw-cli:
    environment:
      - OPENCLAW_CONFIG_DIR=/config
      - OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789
      - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
    volumes:
      - ./config:/config
    networks: [oc-net]

networks:
  oc-net: { driver: bridge }

三條應寫進面板的 KPI(運維可核對)

  1. 子代理成功率:單位時間內 sessions_spawn(或等價 API)成功 / 調用總數,低於閾值自動打開「配對+網段」分流頁。
  2. 配置漂移告警:對比兩個容器內 gateway.auth.token 指紋或 env hash,不一致立即阻斷髮布。
  3. Gateway 重啟成本:記錄 bind/trustedProxies 變更後必須重啟的次數,推動「配置即代碼」與評審模板。

上述 KPI 為工程可觀測性建議,不構成上遊項目 SLA 承諾。

為什麼臨時拼湊的容器環境難撐 OpenClaw 生產主鏈

僅靠「能拉起鏡像」不夠:子代理與會話工具要求穩定 Gateway、可預測網絡身份與一致配置卷。在筆記本上反覆 docker run 單容器試玩與在獨佔遠程 Mac 上用固定 Compose 與持久卷跑長任務,故障面完全不同:後者更接近真實業務無人值守與定時任務場景

純函數式 VPS 或共享桌面雖能短期跑通 demo,卻常常缺少一致的磁碟與網絡基線;當團隊需要把 Gateway、反代與自動化任務放在同一可信區域並快速擴容時,使用具備多地區節點、可按月租/季租組合的 Apple Silicon 雲主機,往往比反覆手搓臨時 Docker 主機更適合承載 OpenClaw 這類常駐自動化。MACCOME 提供物理隔離與六國區位選擇,便於把「網關常駐 + 構建/籤名機」分層部署;可先打開租賃價格說明與幫助文檔,再按本文 Runbook 綁定環境變量。

落地順序建議:先在單 Compose 項目裡跑滿六步閉環,再評估是否需要把 Gateway 與其他工作負載拆到不同遠程節點。

常見問題

1008 出現時要不要立刻改 bind 為 lan?

先完成表 1 的分診:很多時候是服務名 URL 或 trustedProxies問題,而不是盲目放大監聽面。擴大暴露必須同步 token 與防火牆策略。更多配對場景見 配對與 Token 對照清單

可以在宿主機 curl 127.0.0.1:18789 代替容器內探測嗎?

可以作宿主視角探活,但不能替代容器到 Gateway 服務名的連通性驗證,兩者網絡命名空間不同。需要幫助可查看 幫助中心

與《Docker 網絡分診》重複嗎?

網絡分診篇覆蓋 compose 命名空間與 CLI 連通;《Docker 官方一鍵》偏鏡像路徑。本文專門銜接子代理 pairing 與 trustedProxies。也可瀏覽 MCP 與 Skills 驗證 作為後續能力擴展閱讀。