Docker Sandboxes

Docker Sandboxes の使い方

最初のサンドボックスを起動したあとに必要になる、作業フォルダの渡し方、エージェントごとの起動、再接続・ポート公開などの日常操作をまとめる。Kit や独自テンプレートは応用へ。

ワークスペースエージェント別日常操作

検証: sbx v0.35.0・macOS (Apple Silicon)

初めての方へ

まだインストールしていない場合は、先に「はじめる」で最初のサンドボックスまで試す。隔離の全体像は「仕組み」、認証情報などの境界は「安全性」を参照。

1.clone かマウントか — ワークスペースの渡し方


エージェントを起動する前に決めるべきなのが、プロジェクトをどうサンドボックスに見せるか。 選択肢は「通常マウント(rw)」「読み取り専用マウント(ro)」「--clone」の 3 つで、 モードは作成時に固定され、後から切り替えられない(安全性の詳細の clone モードの節も参照)。

方式 ホストへの影響 向いている作業 成果物の回収
通常マウント(rw エージェントの書き込みが即座にホストのディレクトリへ反映 自分も並走する対話的開発。エディタで差分を見ながら進める そのまま手元のファイルにある
読み取り専用(ro なし(書き込み不可) 共有ライブラリ・参照資料・ドキュメントを「見せるだけ」(追加マウント専用。プライマリには付けられない)
--clone 作業ツリーへの直接変更なし(ホスト側は読み取り専用。外部サービスへの操作は別) 自律運用・放置・並列タスク・怪しい依存を触らせる作業 push / PR・MR または cp・fetch

判断の目安

  • 対話的にペアプロ感覚で進める → 通常マウント。変更が即ホストに現れるので、手元のエディタ・git で随時レビューできる。
  • 任せて放置する・並列に走らせる・リスクの高い作業 → clone。ホストの作業ツリーを直接変更させず、失敗時はサンドボックスを捨てられる。
  • 迷ったら「エージェントが暴走したとき、その書き込みが即ホストに反映されて困るか?」で決める。困るなら clone。
⚠️ 通常マウントは git diff だけでは監査しきれない

通常マウントでは、エージェントは作業フォルダ内のドットファイル、CI 設定、IDE のタスク定義、Makefilepackage.json の scripts なども変更できる。特に .git/hooks は通常の git diff に出ない。 セッション後にホストでビルド・Git・IDE タスクを実行する前に、これらも含めて確認する。

それぞれの起動法

通常マウント(rw + ro 併用)
$ cd ~/path/to/project
$ sbx run claude                                # カレントを同じ絶対パスに rw マウント
$ sbx run claude . ~/shared-libs:ro ~/docs:ro   # カレント+参照専用の追加マウント(公式例の形)
$ sbx run claude ~/scratch ~/project:ro         # プロジェクトを「読ませるだけ」にしたい場合
⚠️ sbx run claude .:ro はできない

パス末尾の :ro(読み取り専用マウント ro)は追加ワークスペース(2 つ目以降のパス)専用で、 第 1 パス(プライマリワークスペース)には付けられない。カレントディレクトリを書き換えさせたくないときは次のどちらか。

ダミーをプライマリに、ro で見せる

上の例のように、作業用のダミーディレクトリをプライマリに置き、カレントを ro の追加マウントで見せる。 調査・コードリーディング向け。成果はダミー側にメモやパッチ文面として書かせる。

Git なら --clone(正道)

Git リポジトリなら素直に --clone を使う。ホスト側は読み取り専用になる。

clone モード
$ cd ~/path/to/repo                             # Git リポジトリであることが必須
$ sbx run --clone --name fix-issue-123 claude   # プライベートクローン内で作業させる
# ブランチは自動で切られないので、エージェントに指示して切らせる
# clone モードからの成果物の回収 → 応用へ
$ sbx cp fix-issue-123:/Users/me/project/some-file .

成果物の回収法は 応用:成果物の回収にまとめた。

📂 clone で見えるのは起動ディレクトリ配下だけ

対象になるのは、sbx run --clone を実行した起動ディレクトリ配下だけ。 隣の兄弟フォルダや、リポジトリの外にあるパスは clone されない(VM からは見えない)。

エージェントが書き込む先はホストではなく、VM 内に作られたプライベートな Git クローンである。 ホストの作業ツリーは直接は書き換えられない。 ただし、その元ツリーが読み取り専用の別マウントとして VM 内に併存して見えることもある。 エージェントによる編集・コミットの成果はプライベート clone 側にだけ残り、ホストの作業ツリーへは直接書き込まれない。 境界の整理は 安全性の Clone モードへ。

sbx create — エージェントを開かずにサンドボックスだけ作る

ここまでの例は主に sbx run(無ければ作り、すぐエージェントに入る)だった。 sbx create はアタッチせずにサンドボックスだけを作るコマンドである (sbx create --help)。マウント構成や --name / --clone / --kitrun と同じ考え方で指定できる。作ったあとエージェントを開くときは sbx run --name …、シェルだけ入るときは sbx exec実践レシピでも対比する)。

作成とアタッチを分ける
$ sbx create --name mybox claude .
$ sbx run --name mybox                 # → Claude など、作成時に指定したエージェントを開く
$ sbx exec -it mybox bash              # → エージェントは開かず、任意コマンド(ここではシェル)

どちらも「既にある mybox に入る」点は同じで、何を起動するかが違う。 run は Kit の起動コマンド(エージェント本体)、exec はこちらが指定したコマンド。

一つのリポジトリに複数パッケージがあるとき

フロントエンド・バックエンドなどを一つの Git リポジトリ配下のサブディレクトリに並べる構成 (いわゆるモノレポ)では、サブディレクトリだけをプライマリにすると .git/ が見えず Git 操作ができない。 また、マウント点より親のパスはホストと中身を共有しない(親ディレクトリ名は見えるが、中身は別物になりうる)。 だから create / run ではリポジトリルートをマウントし、パッケージ配下での作業は sbx exec -w でカレントだけ移す。

ルートをマウントし、-w で作業ディレクトリを移す
$ cd /Users/me/monorepo                 # リポジトリルート(.git がある場所)
$ sbx create --name my-mono claude .
$ sbx exec -it -w /Users/me/monorepo/packages/app my-mono bash
# -w はマウント済みパスの中の作業ディレクトリ(ホストと同じ絶対パス)

後から構成(rw / ro / --clone・マウント一覧)を変えたくなったら

rwro の切り替えだけでなく、「どのパスを見せるか」というマウント一覧そのものも作成時に固定で、 既存のサンドボックスに対して後からディレクトリを追加・削除する手段はない。 構成はサンドボックスの spec として保存され、変えたくなったら新しいサンドボックスを作るのが答え。 同じディレクトリに対して複数のサンドボックスを --name で区別して共存させられるので、 「切り替える」というより「用途ごとに名前の違うサンドボックスを持つ」と考えるのが実態に近い。

裏を返すと、マウントパスの列挙が必要なのは初回(作成時)だけ。 2 回目以降の run は同じディレクトリから sbx run claude と打つか --name を指定すれば、保存された spec どおりのマウント構成で再アタッチされる。 exec に至ってはマウントを受け取る引数自体が存在しない (-w でマウント済みパスの中から作業ディレクトリを選ぶだけ)。

マウント構成のライフサイクル: 初回だけ列挙、以降は名前
# ―― 初回: マウント構成を列挙して作成(spec に保存される)――
$ cd ~/proj
$ sbx run claude . ~/shared-libs:ro
#   ↑ 名前を指定していないので、この時点でデフォルト名 claude-proj
#     (<agent>-<ディレクトリ名>)が自動的につく

# ―― 2回目以降: マウントするパスの列挙は不要。作成時に保存された構成が復元される ――
$ sbx run claude                    # デフォルト名 claude-proj を計算 → その名前のサンドボックスが既にあるので再アタッチ
$ sbx run --name claude-proj        # 自動命名された名前を直接指定しても同じサンドボックス
$ sbx exec -it claude-proj bash     # エージェントを開かず、既存サンドボックスで bash を実行

# ―― 後から ~/design-docs も見せたくなった。選択肢は 3 つ ――
# (a) 数ファイル要るだけ → マウントせず cp で持ち込む(構成は不変のまま)
$ sbx cp ~/design-docs/spec.md claude-proj:/Users/me/proj/

# (b) 恒久的に必要 → 作り直す(構成は変更不可のため)
$ sbx rm claude-proj
$ sbx run claude . ~/shared-libs:ro ~/design-docs:ro

# (c) 今の作業を止めたくない → 新構成のサンドボックスを別名で並行に作り、移行後に旧サンドボックスを消す
$ sbx run --name proj-v2 claude . ~/shared-libs:ro ~/design-docs:ro
$ sbx rm claude-proj                # 移行が済んだら
🔎 サンドボックスの解決は「ディレクトリ」ではなく「名前」ベース

sbx run claude が「同じディレクトリのサンドボックス」に繋がるのは、ディレクトリとサンドボックスが紐付け管理されているからではない。 名前未指定の runデフォルト名 <agent>-<ディレクトリ名>(例: claude-proj)を計算し、 その名前のサンドボックスがあれば再アタッチ、無ければ新規作成する——それだけの単純な名前解決になっている。したがって:

  • カレントディレクトリに --name で作ったサンドボックス(proj-audit 等)が何個あっても、 素の sbx run claude が開くのは常にデフォルト名のサンドボックスだけ。それ以外のサンドボックスは --name でしか開けない。
  • 逆に、最初から --name 付きでしか作っていない場合、素の sbx run claude は 「デフォルト名のサンドボックスが無い」と判断して新しいサンドボックスを勝手に作ってしまう。 名前付きで運用するサンドボックスは、起動も常に --name で。
  • デフォルト名はディレクトリ名から決まるため、名前が同じ別プロジェクト (~/work/proj~/oss/proj など)では衝突しうる。紛らわしい構成では --name を明示するのが安全。
Q&A: ディレクトリ名を変えたら?スペースや日本語だと?

デフォルト名は <agent>-<workdir>。使える文字は sbx create --help どおり英数字・ハイフン・ピリオド・プラス・マイナスだけ (以下は v0.35.0 で実機確認)。

作業フォルダの名前を後から変えたら、紐付けは外れる?

永続的な「ディレクトリ ↔ サンドボックス」紐付けは無い。あるのは作成時の絶対パスサンドボックス名だけ。

改名するとマウント先は旧パスのまま残り、改名後のフォルダで素の sbx run claude を打つと別名の新サンドボックスが作られやすい。旧名は sbx ls に残る。

動かす・改名する予定があるなら最初から --name で固定し、改名後は作り直すか旧名で sbx run --name … する。

スペース入りのフォルダ名だとどうなる?

デフォルト名ではスペースがハイフンになる。例: フォルダ with spaceshell-with-space。マウント自体はスペース入りパスのままで動く。

日本語入りのフォルダ名だとどうなる?

非 ASCII はデフォルト名に使われない。例: フォルダ 日本語フォルダshell-1 のように番号付きへ落ちる。

別名の日本語フォルダでも番号系に寄りやすく、衝突や取り違えが起きやすい。 --name my-project のように ASCII 名を明示するのが無難。

参考: ピリオドは残る(例: my.projshell-my.proj)。 紛らわしいディレクトリ名では自動命名を信じず --name を付ける。

💡 運用のコツ: 構成を「育てる」より「固定して安く作り直す」

マウント構成が変更不可である以上、構成をちょくちょく変える運用とは相性が悪い。 必要な構成が固まってきたら、初回作成コマンドを シェルのエイリアス・Makefile・Kit の spec.yaml応用)のどれかに固定化しておき、「いつでもワンコマンドで作り直せる」状態にしておくと、 (b) の作り直しが苦でなくなる(インストール済みツールも Kit に寄せれば消えて困るものは認証だけになる)。

新しいサンドボックスにはエージェントの認証・インストール済みツールは引き継がれない点だけ注意 (ツール類は Kit 化しておけば作り直しは安い。認証はサンドボックスごとに初回 1 回)。

よくあるフロー: 同じプロジェクトを用途別のサンドボックスで使い分ける
# ① ふだんの対話的開発(rw、いつものサンドボックス。デフォルト名は <agent>-<workdir> → claude-proj)
$ cd ~/proj
$ sbx run claude

# ② 見知らぬ OSS 由来のコードを「読ませて調査だけ」させたくなった
#    → ①のサンドボックスはそのまま残し、読み取り専用のサンドボックスを別名で追加
$ sbx run --name proj-audit claude ~/scratch ~/proj:ro

# ③ 大きめのリファクタを放置で走らせたくなった
#    → clone のサンドボックスをさらに別名で追加(成果は応用の回収法へ)
$ sbx run --clone --name proj-refactor claude

# ④ サンドボックスは互いに独立。一覧で確認し、不要になったものから消す
$ sbx ls
$ sbx rm proj-audit
同じ名前のまま権限だけ変えたい場合
$ sbx rm proj-audit                             # いったん削除して
$ sbx run --name proj-audit claude ~/proj       # 権限を変えて同名で作り直す(認証はやり直し)
通常マウント(rw / ro) ホストの ~/project 手元のエディタで見える /Users/me/project VM 内 rw: 書き込みが双方向に即反映 ro 追加マウント: ホスト→VM の参照のみ ⚠ rw の暴走した書き込みは即ホストに届く --clone モード ホストの Git repo 作業ツリーは読み取り専用 プライベート clone VM 内・自由に破壊可 作成時に clone 成果回収: push / PR / sbx cp 外部操作はnetwork・資格情報の範囲で可能
通常マウントと clone モードのデータの流れ

2.エージェント別の使い方


公式に対応しているエージェントは Claude Code / Codex / Copilot / Cursor / Droid / Gemini / Kiro / OpenCode / Docker Agent、それに手動セットアップ用の shell。 ここでは4つの例を示す。以下の例は通常マウントで書いているが、 どのエージェントでも前章の判断で --clone を付ければそのまま clone モードになる。初回はエージェントごとに認証(ブラウザ経由の OAuth など)を求められるが、認証状態はサンドボックス内に永続化されるので 2 回目以降は不要。

基本は --name なしでよい

初めて使うときは、以下の例のように sbx run claude だけでよい。 名前は自動的に付き、同じ作業ディレクトリから同じエージェントを起動すれば再接続できる。 --name は、同じ作業フォルダに複数のサンドボックスを作る場合や、別の場所から名前を指定して再接続する場合に使う。 詳細はワークスペースの説明を参照。

起動
$ cd ~/path/to/project
$ sbx run claude
⚠️ デフォルトで全承認スキップ (YOLO) モード

公式テンプレートのデフォルト起動コマンドclaude --dangerously-skip-permissions である。 サンドボックス内だから確認を飛ばして走らせる、という方針である。 外部への push などまで自動化されるのが怖ければ、Kit の spec.yamlentrypoint.run: [claude](フラグなし)に上書きすればよい(応用の Kit)。

デフォルトでは aiFilename: CLAUDE.md が指定されており、プロジェクトの CLAUDE.md がそのまま読まれる。

起動
$ cd ~/path/to/project
$ sbx run codex
⚠️ デフォルトで全承認スキップ (YOLO) モード

公式テンプレートのデフォルト起動コマンドcodex --dangerously-bypass-approvals-and-sandbox (別名:--yolo)である。 承認プロンプトと Codex 同梱サンドボックスの両方を外し、外側の microVM に隔離を任せる意図である。 エージェント同梱 sandbox と microVM の役割の違いは 仕組みの隔離比較を参照。 フラグを外したい場合は Kit の spec.yamlentrypoint.run: [codex] に上書きする(応用の Kit)。

初回起動時に ChatGPT アカウントでの認証(ブラウザ経由)を通せば、以後はそのまま使える。

デフォルトでは aiFilename: AGENTS.md が指定される。

起動
$ cd ~/path/to/project
$ sbx run cursor
⚠️ デフォルトで全承認スキップ (YOLO) モード

公式テンプレートのデフォルト起動コマンドcursor-agent --yolo である。 サンドボックス内だから確認を飛ばして走らせる、という方針は Claude / Codex と同様である。 フラグを外したい場合は Kit の spec.yamlentrypoint.run: [cursor-agent] に上書きする(応用の Kit)。

Cursor の CLI エージェント(cursor-agent)が起動する。Cursor はプロンプトインジェクション起点の RCE(CVE-2025-54135)が報告されたエージェントでもあり、サンドボックスに入れて使う意義が特に大きい。

デフォルトでは aiFilename: AGENTS.md が指定される。

Grok Build(xAI の CLI エージェント grok)は現時点で Docker Sandboxes の公式対応リストに 含まれていない。そこで、エージェント未同梱の shell テンプレートでサンドボックスを作り、 その中に自分でインストールする。一度作ってしまえば環境は永続化されるので、以後は普通に使える。

① shell テンプレートでサンドボックスを作成
$ sbx run --name grok-build shell
🐳 この shell でも docker run は使える

--template を付けずに sbx run … shell すると、他の組み込みエージェントと同様、 デフォルトで shell-docker テンプレート (実体は docker/sandbox-templates:shell-docker)が選ばれる。 microVM 内に専用 Docker Engine が立つので、ホストに Docker Desktop が無くても、 サンドボックス内では例えば次が使える。

サンドボックス内(例)
# docker version
            # docker run --rm hello-world
            # docker build -t my-app .
            # docker compose up

イメージ・コンテナ・ボリュームはこの grok-build サンドボックス専用で、ホストや他サンドボックスとは共有されない。 イメージの取得はネットワークポリシーに従う(レジストリが拒否されていれば失敗する)。 軽量な非 Docker 版が欲しいときだけ --template docker.io/docker/sandbox-templates:shell を明示する (その場合は VM 内に dockerd が無く、docker run は使えない)。

② サンドボックス内でインストール
# curl -fsSL https://x.ai/cli/install.sh | bash
⚠️ PATH が通らない罠

インストール直後は Bash の環境変数をリロードしないと grok コマンドに PATH が通らない。 exec bash(または source ~/.bashrc)してから起動すること。

③ 認証
# exec bash          # 環境変数をリロード
# grok               # 表示される URL をホストのブラウザで開き、認証コードを打ち込む
④ 以後の起動(環境・認証は永続化済み)
$ sbx run --name grok-build
# 注: sbx run grok-build(--name なしの旧形式)も動くが、v0.35 では deprecated 警告が出る
💡 ネットワークポリシーに注意

Balanced / Locked Down で運用している場合、インストールスクリプトの取得や API 通信のために x.ai 系ドメインの許可が必要になることがある。ブロックされたら sbx policy log で対象ドメインを確認し、 sbx policy allow network x.ai:443 のように許可する。

3.実践レシピ集


sbx create / run / exec の使い分け

Docker の create / run / exec の違いと同様 (ワークスペース節でも触れた)。

  • sbx create — サンドボックスを作るだけ(エージェントは起動しない)。docker create に相当。
  • sbx run — 無ければ作って、エージェントとの対話を始める・再開するdocker run に相当。
  • sbx exec — 既にあるサンドボックスで任意コマンドを実行する。docker exec に相当。

だから create のあとに続くのは二択になる。 sbx run --name … は作成時に決めたエージェントを開き、 sbx exec … はエージェントを開かずにシェルや単発コマンドだけを走らせる。

sbx create sbx run sbx exec
対象 新規作成のみ(アタッチしない) 無ければ新規作成、あれば再利用して再アタッチ 既存のサンドボックスのみ
起動するもの なし(サンドボックスだけ用意) Kit の起動コマンド(= エージェント本体) 指定した任意コマンド(-it でシェル)
典型的な用途 先にサンドボックスだけ用意し、あとで run / exec する エージェントに作業させる/昨日の続きを再開する エージェントの横から状態を覗く・手作業・apt install 等の環境整備・デバッグ

エージェントが作業している最中でも、別ターミナルから sbx exec -it mybox bash で同じサンドボックスに入って ログや生成物を直接確認できる。停止中なら起動してからコマンドを実行する。ポリシーでブロックされた通信の調査 (sbx policy log と合わせて)にも便利。

デフォルトのサンドボックス名は <agent>-<workdir>(例: claude-proj)。 つまり同じディレクトリでもエージェントが違えば自動的に別のサンドボックスになる。 名前未指定の run はこのデフォルト名のサンドボックスだけを見る(名前解決の詳細はワークスペース節のコラム参照)。 --name で再アタッチするときはエージェント指定を省略でき(仕様から読まれる)、 エージェント自身に渡す引数は -- の後ろに書く。

run の便利な形
$ sbx run --name mybox                    # 既存のサンドボックスへ再アタッチ(エージェント指定は省略可)
$ sbx run mybox                           # ← 旧形式。動くが v0.35 で deprecated 警告が出る(--name を使う)
$ sbx run claude -- --continue            # "--" 以降はエージェント自身への引数(例: 前回の続きから)
$ sbx create --name mybox claude .        # アタッチせず作成(前述)。後で sbx run --name mybox
$ sbx run --cpus 4 -m 8g claude           # リソース割当(デフォルト: CPU=ホスト全部 / メモリ=ホストの50%・最大32GiB)
(存在しない) 初回 or rm 後 Running ツール・認証・キャッシュを保持 Stopped 状態はそのまま保持 sbx run 作成+起動+アタッチ sbx stop sbx run(再開・再アタッチ) sbx exec -it mybox bash 既存環境でコマンド実行(停止中なら起動) sbx rm = 完全リセット(Kit 化しておけば作り直しは安い)
サンドボックスのライフサイクル。run は状態遷移+アタッチ、exec は既存環境での任意コマンド実行

サンドボックスを使い回すか、作り直すか

同じエージェントを使う場合でも「既存のサンドボックスを使い回す」か「新規に作る」かは場面で変わる。 基本方針は「1 プロジェクト = 1 サンドボックスで使い回し、怪しくなったら捨てて作り直す」。 状態(インストール済みツール・エージェントの認証・ビルドキャッシュ・取得済み Docker イメージ)は rm するまで残るので、継続作業では使い回すほど起動が速く快適になる。 一方でサンドボックスは「汚染されうる環境」でもあるので、疑わしくなった時点で捨てるのが正しい。

  • 使い回す — 同一プロジェクトの継続作業。grok-build のように手動で環境を育てたサンドボックス。認証をやり直したくない場合。
  • 新規に作る — 別プロジェクトを始めるとき(デフォルト名はエージェント名と作業ディレクトリ名から決まる)。 同一リポジトリで複数タスクを並列に走らせるとき(--clone --name task-a / task-b のように分ける)。
  • 捨てて作り直す — 実験的なインストールで環境を壊した疑いがあるとき。信頼できない依存パッケージや 怪しい入力をエージェントに触らせた後(サンドボックスごと汚染されたとみなす)。Kit 化しておけば再構築コストはほぼゼロ。
新しい作業を始める 同じプロジェクトの 続き? はい 既存を使い回す sbx run で再アタッチ。 認証・ツール・キャッシュが温存され 起動も速い いいえ 同じリポジトリで タスクを並列に? はい 新規を並列に作る --clone --name task-a / task-b ブランチ・Issue ごとに独立 いいえ 新規に作る 1 プロジェクト = 1 サンドボックスが基本 🗑 リセットの原則 環境を壊した・怪しい依存を 触らせた → ためらわず sbx rm → 作り直し。 Kit 化で再構築コスト最小化
使い回し/新規作成の判断フロー

日常操作チートシート

サンドボックスのライフサイクル
$ sbx                                # 引数なしで対話モード(概要・状態の確認。版で UI は変わりうる)
$ sbx ls                             # 一覧・状態確認
$ sbx exec -it mybox bash            # 中にシェルで入る
$ sbx exec mybox ls /Users/me/project       # 単発コマンド実行
$ sbx cp ./local.txt mybox:/Users/me/project/   # ファイル転送(双方向)
$ sbx stop mybox                     # 一時停止
$ sbx rm mybox                       # 削除(--force で強制)

パッケージ・Docker イメージ・設定などサンドボックス内の状態は、rm するまで永続する。エージェントのログイン状態もそのサンドボックスに残る。sbx rm や作り直しではサンドボックス内の認証・インストール済みツールは消える(ホスト側ブラウザのエージェント用セッションとは別)。

複数ディレクトリのマウント

第 1 パスがプライマリワークスペースになる。第 2 パス以降の追加ワークスペースは、パス末尾に :ro を付けて読み取り専用(ro)にできる(詳細と変更時の扱いはワークスペース節)。

読み取り専用マウントの併用
$ sbx run claude ~/project-a ~/shared-libs:ro ~/docs:ro

開発サーバーのポート公開

サンドボックスはネットワーク隔離されている。VM 内で npm run devpython -m http.server を起動しても、ホストのブラウザから http://localhost:… では届かないのが正常である。 ホスト側へ明示的に穴を開けるのが sbx ports --publish

  1. サンドボックス内で開発サーバーを起動する(例: 待ち受けが 3000)。
  2. ホストの別ターミナルでポートを公開する。ホスト側:VM内 の順。
  3. ホストのブラウザで 公開したホスト側ポートにアクセスする。
ポート転送
# 例: VM 内で 3000 番を待っている開発サーバーを、ホストの 8080 から見る
$ sbx ports mybox --publish 8080:3000    # ホスト8080 → VM内3000
$ open http://localhost:8080             # ホスト側は 8080(VM の 3000 ではない)

$ sbx ports mybox                        # 公開中の一覧で確認
$ sbx ports mybox --unpublish 8080:3000  # 公開を解除
🔎 つまずきやすい点
  • 番号の対応--publish 8080:3000 ならホストは localhost:8080。VM 内の 3000 をホストのアドレス欄に書いても届かない。
  • サンドボックス内ではもともと届くsbx exec mybox curl -I http://localhost:3000 が成功しても、ホストからは別問題。公開の要否はホスト側で判断する。
  • コンテナのポート — サンドボックス内 Docker で -p 8080:80 しても、それは VM 内の話。ホストから見るには、さらに sbx ports でその VM 側ポートを公開する。
ホストのブラウザ http://localhost:8080 sbx ports mybox --publish 8080:3000 サンドボックス内 開発サーバー :3000 ネットワーク隔離されたままでも、明示したポートだけホストから届く
ポート転送の経路

サンドボックス内での Docker 実行

組み込みエージェントをテンプレート指定なしで起動すると、デフォルトでは 名前が -docker で終わるテンプレート(例: shell-dockerclaude-code-docker)が選ばれる。 これを本文では -docker 版と呼ぶ。 中身は「ホストの Docker を使う設定」ではなく、 そのサンドボックス用 microVM に Docker Engine(dockerd)が同梱されたイメージである。 そのためホストに Docker Desktop / Docker Engine がなくても、サンドボックス内でコンテナをビルド・実行できる。 Engine・イメージ・コンテナ・ボリュームはホストや他のサンドボックスと共有されない。

shell テンプレートで試す
$ cd ~/path/to/project
$ sbx run --name sbx-docker-lab shell

# サンドボックス内
# docker version
# docker run --rm hello-world
# docker build -t my-app .
# docker compose up

shell のデフォルトは docker/sandbox-templates:shell-docker-docker 版)。 サンドボックス内 Docker が不要な軽量環境にしたい場合だけ、サフィックスのない非 Docker 版 --template docker.io/docker/sandbox-templates:shell を明示する (この場合 microVM 内に dockerd は無く、docker run は使えない)。

ホスト側 Docker が必要になる例外

カスタムテンプレートを作るため、ホストのシェルで docker build / docker image save を実行する場合は、 Docker Desktop などホスト側のビルド環境が別途必要になる。通常の sbx run や、完成済みテンプレートの利用には不要。 手順は応用の独自テンプレートを参照。

よくある失敗(症状 → 原因 → コマンド)

本文で触れた落とし穴を、診断用に短く並べた。

症状 原因の目安 確認・対処
Blocked by network policy や外部 API / git / npm が届かない 宛先が許可リストに無い(デフォルトは拒否) sbx policy log でブロック先を確認 → sbx policy allow network …安全性
sbx ls に似たサンドボックスが増える/別フォルダなのに同じものが開く デフォルト名 <agent>-<ディレクトリ名> の衝突・取り違え sbx ls → 以後は sbx run --name … で明示(ワークスペース
sbx run … .:ro や第 1 パスへの :ro が通らない ro(パス末尾の :ro)は追加ワークスペース専用。プライマリには付けられない sbx run claude ~/scratch ~/proj:ro、または Git なら --cloneワークスペース
--clone が linked worktree から作れない clone はメインの worktree からのみ リポジトリのメイン worktree へ移ってから sbx run --clone …Clone モード
リポジトリ配下のサブディレクトリだけで .git が見えない プライマリがリポジトリルートではない(複数パッケージを一つのリポジトリに置いている場合など) ルートマウント節 — ルートをマウントし exec -w で作業ディレクトリを移す
調子が悪い・常駐プロセスがおかしい sandboxd の不調(まず診断) sbx diagnose → 改善しなければ sbx daemon stop && sbx daemon start -dsbx reset とは破壊範囲が全く違う。最終手段にしない)
ホストの localhost から開発サーバーに届かない ポート未公開(ネットワーク隔離)。ホストと VM 内は別の localhost ポート公開の手順へ(sbx ports --publish ホスト:VM内
次の一歩

Kit で構成をコード化する、独自テンプレートを焼く、AWS 資格情報を渡す、自律運用の型を知る、は 応用へ続く。