Docker Sandbox は、Dockerエコシステムにおける新しいプリミティブで、AIエージェントやその他のワークロードを分離されたマイクロVMで実行できるようにします。強力な隔離性、便利な開発者体験、そしてネットワークプロキシで任意のインターネットホストへの接続を拒否できる強力なセキュリティ境界を提供します。ネットワークプロキシは、あなたの ANTHROPIC_API_KEYや OPENAI_API_KEY キーのようなAPIキーをネットワークプロキシに注入し、エージェントがそれらにアクセスできず、リークもできません。
以前の記事で、Docker Sandboxを使って、Javaプロジェクト用のJDKやカスタムCLIなど、AIエージェントが必要とするツールをホストから隔離されたコンテナにインストールできる方法を紹介しました。今日はさらに一歩進みます。Open ClawというオープンソースのAIコーディングエージェントを、Docker Model Runnerを通じてローカルモデル上で実行します。
APIキーもクラウドコストもかからず、完全にプライベートです。そして、それは 2-のようなコマンドで行うことができます。
クイックスタート
Docker Desktopが有効で、Docker Model Runnerが有効になっていることを確認してください(設定→Docker Model Runner→有効化)。その後、モデルを取り出してください:
docker model pull ai/gpt-oss:20B-UD-Q4_K_XL
次にサンドボックスを作成して実行します:
docker sandbox create --name openclaw -t olegselajev241/openclaw-dmr:latest shell .
docker sandbox network proxy openclaw --allow-host localhost
docker sandbox run openclaw
サンドボックスの内部:
~/start-openclaw.sh
それだけです。あなたはOpenClawのターミナルUIで、マシン上のローカルGPT-OSSモデルと会話しています。モデルはホスト上のDocker Model Runnerで動作し、OpenClawはサンドボックス内で完全に分離して動作します。割り当てられたワークスペース内のファイルのみ読み書きができ、不要なホストへの接続を拒否するネットワークプロキシもあります。
クラウドモデルも機能します
サンドボックスプロキシはホスト環境から自動的にAPIキーを注入します。ANTHROPIC_API_KEYやOPENAI_API_KEY設定があれば、OpenClawはクラウドモデルを動かせます。OpenClawの設定で指定すればいいです。プロキシは認証情報注入を担当するため、サンドボックス内でキーが露出することはありません。
つまり、実験には無料のローカルモデルを使い、本格的な作業はクラウドモデルに切り替えて同じサンドボックス内で行うことができます。クラウドモデルではホストのローカルホストにプロキシを許可する必要すらないので、 docker sandbox network proxy openclaw --allow-host localhostは実行しなくていいです。
モデルを選ぶ
スタートアップスクリプトは自動的にDocker Model Runnerで利用可能なモデルを検出します。リストアップ:
~/start-openclaw.sh list
特定のモデルを使う:
~/start-openclaw.sh ai/qwen2.5:7B-Q4_K_M
docker model pullで引いたモデルはどれでも使えます。
仕組み(少し専門的な部分)
事前構築されたイメージ(olegselajev241/openclaw-dmr:latest)は、 shell サンドボックステンプレートをベースにしており、Node.js 22、OpenClaw、そして小さなネットワークブリッジの3つの追加要素が加えられています。
ブリッジが必要なのは、Docker Model Runnerがホスト上で動作し、バインドするからです localhost:12434。しかし、サンドボックスの中 localhost はホストではなくサンドボックス自体のことを意味します。サンドボックスにはhost.docker.internal:3128にHTTPプロキシがあり、ホストサービスに到達でき、docker sandbox network proxy --allow-host localhostでlocalhostに到達できるようにしています。
問題はOpenClawがNode.jsで、Node.js環境変数 HTTP_PROXY 尊重しないことです。そこで、OpenClawが127.0.0.1:54321に接続する~20行のブリッジスクリプトを作成しました。これはホスト上のDocker Model Runnerに届くためにプロキシ経由でリクエストを明示的に転送します:
OpenClaw → bridge (localhost:54321) → proxy (host.docker.internal:3128) → Model Runner (host localhost:12434)
start-openclaw.shスクリプトはブリッジを起動し、OpenClawのゲートウェイを起動します(プロキシvarは解除されて直接ブリッジに到達します)、そしてTUIを実行します。
自分で作ろう
画像をカスタマイズしたいですか、それとも動作を試したいだけですか?こちらがビルドの全過程です。
1。ベースサンドボックスを作成し、OpenClawをインストールします
docker sandbox create --name my-openclaw shell .
docker sandbox network proxy my-openclaw --allow-host localhost
docker sandbox run my-openclaw
では、OpenClawをサンドボックスにインストールしましょう:
# Install Node 22 (OpenClaw requires it)
npm install -g n && n 22
hash -r
# Install OpenClaw
npm install -g openclaw@latest
# Run initial setup
openclaw setup
2。モデルランナーブリッジの作成
これが魔法のピースです — サンドボックスプロキシを通じてホストのDocker Model Runnerにリクエストを転送する小さなNode.jsサーバーです:
cat > ~/model-runner-bridge.js << 'EOF'
const http = require("http");
const { URL } = require("url");
const PROXY = new URL(process.env.HTTP_PROXY || "http://host.docker.internal:3128");
const TARGET = "localhost:12434";
http.createServer((req, res) => {
const proxyReq = http.request({
hostname: PROXY.hostname,
port: PROXY.port,
path: "http://" + TARGET + req.url,
method: req.method,
headers: { ...req.headers, host: TARGET }
}, proxyRes => {
res.writeHead(proxyRes.statusCode, proxyRes.headers);
proxyRes.pipe(res);
});
proxyReq.on("error", e => { res.writeHead(502); res.end(e.message); });
req.pipe(proxyReq);
}).listen(54321, "127.0.0.1");
EOF
3。OpenClawをDocker Model Runnerを使用するように設定してください
次に、Docker Model RunnerのプロバイダーをOpenClawの設定に統合します:
python3 -c "
import json
p = '$HOME/.openclaw/openclaw.json'
with open(p) as f: cfg = json.load(f)
cfg['models'] = cfg.get('models', {})
cfg['models']['mode'] = 'merge'
cfg['models']['providers'] = cfg['models'].get('providers', {})
cfg['models']['providers']['docker-model-runner'] = {
'baseUrl': 'http://127.0.0.1:54321/engines/llama.cpp/v1',
'apiKey': 'not-needed',
'api': 'openai-completions',
'models': [{
'id': 'ai/qwen2.5:7B-Q4_K_M',
'name': 'Qwen 2.5 7B (Docker Model Runner)',
'reasoning': False, 'input': ['text'],
'cost': {'input': 0, 'output': 0, 'cacheRead': 0, 'cacheWrite': 0},
'contextWindow': 32768, 'maxTokens': 8192
}]
}
cfg['agents'] = cfg.get('agents', {})
cfg['agents']['defaults'] = cfg['agents'].get('defaults', {})
cfg['agents']['defaults']['model'] = {'primary': 'docker-model-runner/ai/qwen2.5:7B-Q4_K_M'}
cfg['gateway'] = {'mode': 'local'}
with open(p, 'w') as f: json.dump(cfg, f, indent=2)
"
4。保存して共有しましょう
サンドボックスを終了して再利用可能な画像として保存します:
docker sandbox save my-openclaw my-openclaw-image:latest
誰でも使えるようにレジストリにプッシュしてください:
docker tag my-openclaw-image:latest yourname/my-openclaw:latest
docker push yourname/my-openclaw:latest
Docker Desktop(最新のサンドボックスを含む)を持っている人なら誰でも、以下のような環境で立ち上げることができます:
docker sandbox create --name openclaw -t yourname/my-openclaw:latest shell .
次のステップ
Dockerサンドボックス は、どんなAIコーディングエージェントでも孤立した再現可能な環境で簡単に実行できるようにします。Docker Model Runnerを使えば、完全にローカルのAIコーディング環境が実現します。クラウド依存なし、APIコストなし、完全なプライバシーが確保されています。
ぜひ試してみて、感想を教えてください。