Docker ボリューム

作成日:
Docker container infrastructure volume

Dockerコンテナのデータを永続化するための仕組み。コンテナが削除されてもデータが保持され、ホストとコンテナ間でファイルを共有できます。

重要な概念:

  • コンテナ自体はデータを永続化できない - コンテナ削除でデータも消失
  • ボリュームでデータの永続化を実現 - コンテナとは独立してデータを保存
  • 本番環境でのデータ保護 - サーバーデプロイ時もボリューム設定でデータを保持

ボリュームの種類

  1. 名前付きボリューム(Named Volumes)

    • Dockerが管理する永続化ストレージ
    • 複数のコンテナ間でデータを共有可能
  2. バインドマウント(Bind Mounts)

    • ホストの特定のディレクトリをコンテナにマウント
    • ホストのファイルシステムに直接アクセス
  3. tmpfs マウント

    • メモリ上に一時的なファイルシステムを作成
    • コンテナ停止時にデータは消失

基本的な使い方

# 名前付きボリュームの作成
docker volume create my-volume

# ボリューム一覧の確認
docker volume ls

# ボリュームの詳細情報
docker volume inspect my-volume

# ボリュームを使ってコンテナを起動
docker run -v my-volume:/app/data nginx

# バインドマウントの例
docker run -v /host/path:/container/path nginx

# 読み取り専用でマウント
docker run -v /host/path:/container/path:ro nginx

ボリュームの実際の保存場所

名前付きボリュームの保存場所:

  • Linux: /var/lib/docker/volumes/<volume_name>/_data
  • macOS (Docker Desktop): Docker VM内の /var/lib/docker/volumes/<volume_name>/_data
  • Windows (Docker Desktop): Docker VM内の /var/lib/docker/volumes/<volume_name>/_data

Docker VMとは?

  • macOSやWindowsでは、DockerはLinuxカーネルが必要なため、仮想マシン(VM)上で動作する
  • Docker Desktopが自動的にLinux VMを作成・管理している
  • このVMは通常のFinderやエクスプローラーからは見えない隠れた仮想環境
  • VMはNATモードでホストと接続されている(詳細は VMネットワーキング を参照)

ローカルファイルからの確認について:

  • Linux: ホストマシンのファイルシステムに直接保存されるため、通常のファイルマネージャーでアクセス可能
  • macOS/Windows: Docker VM内に保存されるため、通常のFinderやエクスプローラーからは直接アクセス不可
  • ただし、Docker Desktopの設定でファイル共有を有効にしている場合、一部アクセス可能な場合もある
# ボリュームの詳細情報で保存場所を確認
docker volume inspect my-volume
# Mountpoint フィールドに実際のパスが表示される

# macOS/WindowsでDocker VM内にアクセスする場合
docker run --rm -it --privileged --pid=host alpine:latest nsenter -t 1 -m -u -n -i sh
# この後、/var/lib/docker/volumes/ を確認可能

# よりシンプルな方法:一時コンテナでボリュームをマウントしてアクセス
docker run --rm -it -v my-volume:/data alpine:latest sh
# /data ディレクトリ内でボリュームのデータを確認・編集可能

注意点:

  • macOS/WindowsのDocker Desktopでは、ボリュームはDocker VM内に保存される
  • ホストから直接アクセスするのは推奨されない
  • ボリューム内のデータにアクセスしたい場合は、コンテナ経由でアクセスすることを推奨

本番環境でのボリューム活用

データ永続化の重要性:

# 開発環境
docker run -v $(pwd)/data:/app/data myapp

# 本番環境(Docker Compose例)
version: '3.8'
services:
  web:
    image: myapp
    volumes:
      - app-data:/app/data
      - /opt/config:/app/config  # ホストの設定ファイル
  
  db:
    image: postgres
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  app-data:     # 名前付きボリューム(Dockerが管理)
  postgres-data: # DBデータの永続化

クラウド環境での考慮点:

  • AWS: EBS Volume, EFS
  • GCP: Persistent Disk
  • Azure: Azure Disk
  • Kubernetes: PersistentVolume (PV) / PersistentVolumeClaim (PVC)

関連トピック

  • Docker - Dockerの基本概念
  • Docker Compose - マルチサービス構成でのボリューム活用