Docker ベースのエージェントサンドボックス
エージェントが生成したコードを実行するため、使い捨てコンテナを起動します。
「Docker ベースのエージェントサンドボックス」はCoddyKit上の無料AI Agentsレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Agents学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Agentsコースには全4レッスンが含まれています。
エージェントにサンドボックスが必要な理由
エージェントがLLMによって書かれたコードを実行するとき、そのコードは信頼できないものです。機密ファイルの読み取り、外部への接続の確立、リソースの無制限な消費などを試みる可能性があります。
サンドボックスはコードの実行を隔離するため、コードが何をしても被害を封じ込めることができます。
サンドボックス層としてのDocker
Dockerコンテナは、軽量なOSレベルの隔離を提供します。各コードスニペットは、明示的なリソース上限とネットワーク制限が設定された新しいコンテナ内で実行されます。
docker Python SDKを使用すると、エージェント内部からプログラムでコンテナを起動・破棄できます。
import docker
client = docker.from_env()
print(client.version()['Version'])基本的なコンテナの実行
client.containers.run()はコンテナを起動し、コマンドを実行して、出力をバイト列として返します。auto_remove=Trueを設定すると、コンテナの終了後にコンテナが削除されます。
import docker
client = docker.from_env()
output = client.containers.run(
'python:3.12-slim',
'python -c "print(2 + 2)"',
auto_remove=True
)
print(output.decode()) # '4'メモリとCPUの制限
制限がないと、悪意のあるスクリプトによってホストのメモリが枯渇する可能性があります。mem_limitとnano_cpusを渡して、リソース使用量に上限を設定します。
プロセスがmem_limitを超えると、コンテナはOOMキルされ、例外が発生します。
output = client.containers.run(
'python:3.12-slim',
'python -c "x = [0]*10**8"', # tries to allocate ~800 MB
mem_limit='256m',
nano_cpus=1_000_000_000, # 1 CPU
auto_remove=True
)
# Raises docker.errors.ContainerError if OOM-killedネットワークの無効化
network_disabled=Trueを設定すると、コンテナからの外向き通信とコンテナへの内向き通信がすべて禁止されます。DNSルックアップさえ失敗します。これにより、データの外部流出やコマンド&コントロールサーバーへのコールバックを阻止できます。
output = client.containers.run(
'python:3.12-slim',
'python -c "import urllib.request; urllib.request.urlopen(\"http://example.com\")"',
network_disabled=True,
auto_remove=True
)
# Raises ContainerError: network unreachable実行タイムアウト
サンドボックス内の無限ループによって、エージェントが永久にブロックされる可能性があります。containers.run()にタイムアウト(秒)を渡すと、期限を過ぎた後にDockerがコンテナを強制終了します。
import docker
from docker.errors import ContainerError
client = docker.from_env()
try:
output = client.containers.run(
'python:3.12-slim',
'python -c "while True: pass"',
mem_limit='256m',
network_disabled=True,
auto_remove=True,
timeout=30
)
except Exception as e:
print(f'Sandbox timeout or error: {e}')完全なサンドボックスヘルパー関数
すべての設定を再利用可能な関数にまとめると、エージェントのツールから簡単に呼び出せます。標準出力とステータスフラグの両方を返すことで、エージェントが失敗に対処できるようにします。
import docker
client = docker.from_env()
def run_in_sandbox(code: str, timeout: int = 30) -> dict:
cmd = f'python -c "{code.replace(chr(34), chr(39))}"'
try:
out = client.containers.run(
'python:3.12-slim',
cmd,
mem_limit='256m',
nano_cpus=500_000_000,
network_disabled=True,
auto_remove=True,
timeout=timeout
)
return {'success': True, 'output': out.decode()}
except Exception as e:
return {'success': False, 'error': str(e)}一時ワークスペースのマウント
コードで入力ファイルの読み取りや出力ファイルへの書き込みが必要な場合は、ホストの一時ディレクトリをコンテナにマウントします。ワークスペースにはモード'rw'のvolumesを使用し、それ以外は何もマウントしません。
import tempfile, os
with tempfile.TemporaryDirectory() as tmpdir:
# Write input data
with open(os.path.join(tmpdir, 'data.txt'), 'w') as f:
f.write('hello sandbox')
output = client.containers.run(
'python:3.12-slim',
'python -c "print(open(\"/workspace/data.txt\").read())"',
volumes={tmpdir: {'bind': '/workspace', 'mode': 'rw'}},
mem_limit='256m',
network_disabled=True,
auto_remove=True
)
print(output.decode())読み取り専用ファイルシステム
read_only=Trueを設定すると、コンテナのルートファイルシステムが読み取り専用でマウントされます。コードが書き込めるのは、明示的にマウントされたボリュームだけです。これにより、イメージ内の/etc、/usrなどの機密性の高いパスへの書き込みを防止できます。
import tempfile
with tempfile.TemporaryDirectory() as tmpdir:
output = client.containers.run(
'python:3.12-slim',
'python -c "open(\"/output/result.txt\",\"w\").write(str(1+1))"',
volumes={tmpdir: {'bind': '/output', 'mode': 'rw'}},
read_only=True,
mem_limit='256m',
network_disabled=True,
auto_remove=True
)
print(open(f'{tmpdir}/result.txt').read()) # '2'エージェントツールへのサンドボックスの統合
サンドボックスのランナーを、LLMが呼び出せるツールとして登録します。エージェントがコードを生成し、ツールがそのコードを隔離環境で実行すると、出力が次の推論ステップに渡されます。
tools = [
{
'type': 'function',
'function': {
'name': 'execute_python',
'description': 'Run a Python snippet in an isolated Docker sandbox.',
'parameters': {
'type': 'object',
'properties': {
'code': {'type': 'string', 'description': 'Python code to execute.'}
},
'required': ['code']
}
}
}
]
def handle_tool_call(name, args):
if name == 'execute_python':
return run_in_sandbox(args['code'])エラー処理とクリーンアップ
Dockerデーモンが実行されていない場合や、イメージがキャッシュされていない場合、コンテナの起動に失敗することがあります。必ずdocker.errors.DockerExceptionを処理し、例外が発生した場合でもコンテナがクリーンアップされるようにしてください。
from docker.errors import DockerException, ImageNotFound
def safe_run(code: str) -> dict:
try:
return run_in_sandbox(code)
except ImageNotFound:
# Pull the image first
client.images.pull('python:3.12-slim')
return run_in_sandbox(code)
except DockerException as e:
return {'success': False, 'error': f'Docker unavailable: {e}'}
except Exception as e:
return {'success': False, 'error': str(e)}データ流出を防ぐうえで最も重要なサンドボックス設定はどれですか
エージェントのサンドボックスでは、実行したコードが盗んだデータを外部サーバーに送信できないようにする必要があります。外向きのネットワークアクセスを直接ブロックするDockerパラメータはどれですか。
Dockerサンドボックスのまとめ
Dockerベースのサンドボックスは、メモリとCPUの制限、ネットワーク分離、実行タイムアウト、読み取り専用ファイルシステムを組み合わせることで、エージェントに安全な実行環境を提供します。
これらの設定を再利用可能なヘルパーにまとめ、エージェントツールとして公開すると、ホストシステムに危険を及ぼすことなく、LLMが生成したコードを安全に実行できます。
よくある質問
「Docker ベースのエージェントサンドボックス」レッスンは無料ですか?
はい。「Docker ベースのエージェントサンドボックス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Agentsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Agentsコースには全4レッスンが含まれています。
「Docker ベースのエージェントサンドボックス」で何を学びますか?
エージェントが生成したコードを実行するため、使い捨てコンテナを起動します。 ブラウザで直接実行するハンズオンコードでAI Agentsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Agentsを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Agentsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Docker ベースのエージェントサンドボックス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Agentsレッスンでコードを書いて実行できますか?
はい。すべてのAI Agentsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Docker ベースのエージェントサンドボックス
- 高セキュリティなコードエージェントのための VM 分離
- E2B とクラウドサンドボックスサービス
- コード実行のセキュリティポリシー