第4章 ボリュームとネットワーク
更新日:2025年12月27日
この章を音声で聴く
1. データ永続化
1.1 ボリュームの種類
Dockerでデータを永続化する方法は3種類ある。
Table 1. ボリュームの種類と特徴
| 種類 | 説明 | 用途 |
|---|---|---|
| 名前付きボリューム | Dockerが管理する領域 | データベース、本番データ |
| バインドマウント | ホストのディレクトリを直接マウント | 開発時のソースコード共有 |
| tmpfs | メモリ上の一時領域 | 機密情報、一時ファイル |
1.2 バインドマウント
バインドマウントは、ホストのディレクトリをコンテナにマウントする。開発時にソースコードをリアルタイムで反映させる場合に有用。
# docker runでのバインドマウント
docker run -v $(pwd)/src:/app/src my-app
# 絶対パス指定
docker run -v /home/user/project:/app my-app
# 読み取り専用
docker run -v $(pwd)/config:/app/config:ro my-app
docker-compose.ymlでの記述:
services:
app:
build: .
volumes:
# ソースコードをマウント(開発用)
- ./src:/app/src
# 設定ファイル(読み取り専用)
- ./config:/app/config:ro
# ログ出力用
- ./logs:/app/logs
1.3 名前付きボリューム
名前付きボリュームは、Dockerが管理する永続的なデータ領域である。コンテナが削除されてもデータは保持される。
# ボリュームの作成
docker volume create my-data
# ボリューム一覧
docker volume ls
# ボリュームの詳細
docker volume inspect my-data
# ボリュームの削除
docker volume rm my-data
# 未使用ボリュームの一括削除
docker volume prune
docker-compose.ymlでの記述:
services:
db:
image: postgres:15
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data: # 名前付きボリュームの宣言
データベースには名前付きボリュームを使用し、開発時のソースコード共有にはバインドマウントを使用するのが一般的なパターン。
2. ネットワーク
2.1 ブリッジネットワーク
Dockerのデフォルトネットワークドライバはブリッジである。同一ネットワーク内のコンテナは相互に通信可能。
# ネットワークの作成
docker network create my-network
# ネットワーク一覧
docker network ls
# ネットワークの詳細
docker network inspect my-network
# コンテナをネットワークに接続
docker network connect my-network my-container
# ネットワークから切断
docker network disconnect my-network my-container
2.2 コンテナ間通信
同一ネットワーク内のコンテナは、サービス名で相互に名前解決できる。
version: '3.8'
services:
app:
build: .
networks:
- backend
environment:
# サービス名で接続
- DATABASE_URL=postgres://user:pass@db:5432/mydb
- REDIS_URL=redis://cache:6379
db:
image: postgres:15
networks:
- backend
cache:
image: redis:7-alpine
networks:
- backend
networks:
backend:
driver: bridge
Table 2. ネットワークドライバの種類
| ドライバ | 説明 | 用途 |
|---|---|---|
| bridge | 単一ホスト内の隔離ネットワーク | 開発環境、単一マシン |
| host | ホストのネットワークを直接使用 | パフォーマンス重視 |
| none | ネットワーク無効 | 完全隔離 |
| overlay | 複数ホスト間のネットワーク | Docker Swarm、クラスタ |
3. Sandbox環境構築
3.1 隔離環境の設計
AIエージェントを安全に実行するためのSandbox環境をDockerで構築する。重要な設計ポイントは以下の通り。
Table 3. Sandbox環境の設計要件
| 要件 | 実装方法 | 目的 |
|---|---|---|
| プロセス隔離 | 独立したコンテナ | ホストへの影響防止 |
| ネットワーク制限 | 専用ネットワーク | 不正な外部通信防止 |
| リソース制限 | CPU/メモリ制限 | リソース枯渇防止 |
| ファイルシステム隔離 | 読み取り専用マウント | データ改ざん防止 |
3.2 自動構築スクリプト
Sandbox環境を自動構築するスクリプト例を以下に示す。
#!/bin/bash
# sandbox-setup.sh
# ネットワークの作成(外部接続制限)
docker network create --internal sandbox-network
# Sandbox用コンテナの起動
docker run -d \
--name sandbox-agent \
--network sandbox-network \
--memory="512m" \
--cpus="1.0" \
--read-only \
--tmpfs /tmp:size=100m \
--security-opt=no-new-privileges:true \
my-agent-image
echo "Sandbox environment created successfully"
docker-compose.ymlでの完全な構成:
version: '3.8'
services:
sandbox-agent:
build:
context: .
dockerfile: Dockerfile.sandbox
container_name: sandbox-agent
networks:
- sandbox-internal
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
read_only: true
tmpfs:
- /tmp:size=100m
security_opt:
- no-new-privileges:true
volumes:
- ./input:/app/input:ro
- sandbox-output:/app/output
environment:
- SANDBOX_MODE=true
volumes:
sandbox-output:
networks:
sandbox-internal:
driver: bridge
internal: true # 外部接続を禁止
実践ステップ
Step 1:Sandbox用Dockerfileを作成(最小限の依存関係)
Step 2:docker-compose.ymlでリソース制限を設定
Step 3:internal: trueで外部ネットワークを遮断
Step 4:read_only: trueでファイルシステムを保護
4. まとめ
本コンテンツでは、Dockerの基本概念からSandbox環境構築までを4章にわたって解説した。以下に各章の要点を示す。
Table 4. 各章の要点
| 章 | 主要トピック | 習得スキル |
|---|---|---|
| 第1章 | 基本概念、イメージ・コンテナ | 基本コマンド操作 |
| 第2章 | Dockerfile、Python環境 | カスタムイメージ作成 |
| 第3章 | Docker Compose | 複数コンテナ管理 |
| 第4章 | ボリューム、ネットワーク | データ永続化、Sandbox構築 |
これらの知識を活用することで、AIエージェント開発における安全な実行環境を構築し、LangChainやPlaywrightと組み合わせた自動化システムを実現できる。
本章は2025年12月時点の情報に基づいています。Dockerのセキュリティ機能やベストプラクティスは変更される可能性があります。本番環境での使用前に、公式ドキュメントおよびセキュリティガイドラインを確認してください。