第4章 ボリュームとネットワーク

更新日:2025年12月27日

本章では、Dockerにおけるデータ永続化とコンテナ間通信について解説する。ボリュームの種類と使い分け、ネットワークの設定方法、およびAIエージェントのSandbox環境構築への応用を習得することを目的とする。
🎧

この章を音声で聴く

再生速度:

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のセキュリティ機能やベストプラクティスは変更される可能性があります。本番環境での使用前に、公式ドキュメントおよびセキュリティガイドラインを確認してください。