2026 OpenClaw Docker Compose マルチコンテナ:Gateway のバインド・トークン・「サブエージェントのペアリング 1008」ネットワーク修復チェックリスト(trustedProxies 含む)

読了目安 約 14 分 · MACCOME

想定読者:Docker Compose で Gateway と CLI/エージェント関連コンテナを同時に動かしているが、ログ上 Gateway は動いているように見える一方、子セッションツールが gateway closed (1008): pairing required を出したり、RPC は healthy なのにペアリングで止まったりする場合です。本文の結論:「イメージを入れ直せば直る」単発問題ではなく、多くの場合 バインド面・トークン・信頼できるプロキシ帯域(trustedProxies)・コンテナ間 URL の組み合わせです。本稿では症状マトリクス、Compose 断片、六ステップ Runbook、KPI 三つを示します。他記事との役割分担:公式 docker-setup.sh + GHCR》《ペアリングとトークン》《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 がループバックだけを Listen していると、他コンテナが bridge IP 経由で来たとき「ローカルではない」とみなされ、認証やペアリングの分岐に入ります。
  3. trustedProxies の欠如: Gateway がリバースプロキシや bridge の背後にあるとき、Docker の帯域(例 172.16.0.0/1210.0.0.0/8、カスタムネットワークの CIDR)を信頼済みとして宣言し、クライアント身元を正しく評価する必要があります。
  4. OPENCLAW_GATEWAY_TOKEN のズレ: ゲートウェイと CLI のトークンが異なるマウントパスや env から供給されると、「ときどき通る/401 と 1008 が交互」のように見えます。
  5. アップグレード後にペアリング状態が消えた: ボリュームマウントが不完全で、子エージェントは再ペアリングが要るのにネットワーク問題と誤認されます。
  6. 公式 issue で繰り返されるパターンの見落とし: Docker では loopback bind とコンテナ分割の組み合わせで bind か trusted proxy 方針を明示変更する必要がある、というネットワーク境界の契約です。単なる不具合ラベルではありません。

三 OS インストール総覧》とは異なり、Compose で大事なのは「どの OS か」ではなくどのネットワークがどのコンテナから見て信頼されるかです。

再現するときはログの三本柱を並べて保存することをおすすめします。Gateway の起動行、サブエージェントのスタック、docker inspect で得た attachable ネットワークの Subnet です。多くの 1008 は、この三者を比較すると「信頼帯域が宣言されていない」に収まり、モデルやチャネル自体の問題ではありません。

表 1:症状スナップショット → 先に見る項目(意思決定マトリクス)

症状スナップショット優先して確認(昇順)よくある根本原因
コンテナ A が 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 モードとコンテナ間アクセス(対照)

gateway.bind(概念)向いている用途Compose との摩擦
loopback単一コンテナの all-in-one、またはホストからだけアクセス他サービスコンテナはローカルループバックとして直接使えない
lan/カスタム Listenマルチサービス、コンテナ間 RPC が要るトークン/認証と露出の絞り込みが必須
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/エージェントが同じパスか同期された内容をマウントし、片方だけ別の場所を読まないようにします。
  2. サービス名で Gateway URL を書く: CLI コンテナの env に例として OPENCLAW_GATEWAY_URL=http://openclaw-gateway:18789(名称は compose のサービス名に合わせる)。
  3. トークンを揃える: OPENCLAW_GATEWAY_TOKEN を両側で一致させる。ファイルトークンならマウントが UID から読めることを確認します。
  4. Gateway の bind と trustedProxies を設定する: 表 2/3 に沿って更新したらGateway を再起動します(bind 系はハード再起動が必要なことが多い)。
  5. 診断チェーンを走らせる: openclaw gateway statusopenclaw doctor → サブエージェント操作を再現し、ログから 1008pairing を拾います。
  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 のハッシュを比較し、不一致ならリリースを止める。
  3. Gateway 再起動コスト: bind/trustedProxies 変更後に何回再起動が必要だったかを記録し、「設定即コード」とレビューテンプレを進める。

これらの KPI はエンジニアリング上の可観測性の提案であり、上流プロジェクトの SLA を意味するものではありません。

場当たりのコンテナ環境では OpenClaw の本番主系を支えにくい理由

「イメージが立ち上がる」だけでは足りません。サブエージェントとセッションツールは安定した Gateway・予測可能なネットワーク身分・一貫した設定ボリュームを要します。ノート PC で単一コンテナの docker run を繰り返す試行と、専用リモート Mac 上で固定 Compose と永続ボリュームを使う本番に近い運用では、故障の出方がまったく違います。後者は無人運用やスケジュールジョブのシナリオに近いと言えます。

短命な VPS や共有デスクトップはデモには使えても、一貫したディスクとネットワークの基準線を欠きがちです。Gateway・リバプロ・自動化を同じ信頼ゾーンに載せて素早く拡張したい場合、月次/四半期の組み合わせがある複数地域の Apple Silicon クラウドの方が、一時的な Docker ホストを手作業で積み重ねるより向いていることが多いです。MACCOME は物理分離と六カ国の配置を用意しており、「常時 Gateway」と「ビルド/署名機」を層分けしやすくします。まず公開料金ヘルプセンターを開き、本文の Runbook に沿って環境変数を配線してください。

導入の順番は、まず単一の Compose プロジェクトで六ステップのループを完走し、そのうえで Gateway と他ワークロードを別リモートノードに分けるか判断するのがおすすめです。

よくある質問

コード 1008 が出たら、すぐに bind を LAN に変えるべきですか?

まず表 1 の切り分けを行います。多くの場合はサービス名 URL か trustedProxiesの問題であり、リッスン面を安易に広げる話ではありません。露出を広げるときはトークンとファイアウォール方針を同時に揃えてください。ペアリングの詳細は ペアリングとトークン対照表 を参照します。

ホストで 127.0.0.1:18789 に curl すれば、コンテナ内の探査の代わりになりますか?

ホスト視点の死活にはなりますが、コンテナから Gateway のサービス名で届くかの確認の代わりにはなりません。名前空間が異なるためです。サポートは クラウド Mac サポートとヘルプセンター を参照してください。

《Docker ネットワーク切り分け》と重複しませんか?

ネットワーク切り分けは compose の名前空間と CLI 疎通を扱います。《Docker 公式ワンクリック》はイメージパスが主眼です。本稿はサブエージェントのペアリングと trustedProxies をつなぐ位置づけです。続きとして MCP と Skills の検証 もご覧ください。