Dockerボリューム完全ガイド
Dockerボリューム完全ガイド
Section titled “Dockerボリューム完全ガイド”Dockerのボリューム機能を、実務で使える実装例とともに詳しく解説します。
1. Dockerボリュームとは
Section titled “1. Dockerボリュームとは”ボリュームの役割
Section titled “ボリュームの役割”ボリュームは、コンテナのデータを永続化し、コンテナ間でデータを共有するための仕組みです。
コンテナ1 ↓(ボリューム)データ(永続化) ↓(ボリューム)コンテナ2なぜボリュームが必要か
Section titled “なぜボリュームが必要か”問題のある構成(ボリュームなし):
# 問題: コンテナを削除するとデータが失われるdocker run -d --name db postgres:14# コンテナを削除docker rm db# データが失われる解決: ボリュームによるデータ永続化
# 解決: ボリュームを使用docker volume create postgres_datadocker run -d --name db -v postgres_data:/var/lib/postgresql/data postgres:14
# メリット:# 1. データの永続化(コンテナを削除してもデータが残る)# 2. コンテナ間でのデータ共有# 3. バックアップが容易2. ボリュームの種類
Section titled “2. ボリュームの種類”名前付きボリューム
Section titled “名前付きボリューム”# ボリュームの作成docker volume create my-volume
# ボリュームの使用docker run -d -v my-volume:/data my-app:latest
# ボリュームの一覧表示docker volume ls
# ボリュームの詳細確認docker volume inspect my-volume
# ボリュームの削除docker volume rm my-volume匿名ボリューム
Section titled “匿名ボリューム”# 匿名ボリュームの作成docker run -d -v /data my-app:latest
# 匿名ボリュームの一覧表示docker volume lsバインドマウント
Section titled “バインドマウント”# バインドマウントの使用docker run -d -v /host/path:/container/path my-app:latest
# 絶対パスを使用docker run -d -v $(pwd)/data:/app/data my-app:latest3. Docker Composeでのボリューム
Section titled “3. Docker Composeでのボリューム”名前付きボリューム
Section titled “名前付きボリューム”version: '3.8'
services: db: image: postgres:14-alpine volumes: - postgres_data:/var/lib/postgresql/data
volumes: postgres_data:バインドマウント
Section titled “バインドマウント”services: app: build: . volumes: - ./src:/app/src # 開発環境でのホットリロード - ./config:/app/config匿名ボリューム
Section titled “匿名ボリューム”services: app: build: . volumes: - /app/node_modules # node_modulesを上書きしない4. ボリュームの操作
Section titled “4. ボリュームの操作”ボリュームのバックアップ
Section titled “ボリュームのバックアップ”# ボリュームのバックアップdocker run --rm -v postgres_data:/data -v $(pwd):/backup \ alpine tar czf /backup/postgres_backup.tar.gz -C /data .
# ボリュームのリストアdocker run --rm -v postgres_data:/data -v $(pwd):/backup \ alpine tar xzf /backup/postgres_backup.tar.gz -C /dataボリュームのコピー
Section titled “ボリュームのコピー”# ボリューム間でのデータコピーdocker run --rm -v source_volume:/source -v dest_volume:/dest \ alpine sh -c "cp -r /source/* /dest/"5. 実務でのベストプラクティス
Section titled “5. 実務でのベストプラクティス”パターン1: データベースの永続化
Section titled “パターン1: データベースの永続化”version: '3.8'
services: db: image: postgres:14-alpine volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql # 初期化スクリプト
volumes: postgres_data:パターン2: 開発環境でのホットリロード
Section titled “パターン2: 開発環境でのホットリロード”services: app: build: . volumes: - .:/app # ソースコードをマウント - /app/node_modules # node_modulesは上書きしないパターン3: 設定ファイルのマウント
Section titled “パターン3: 設定ファイルのマウント”services: nginx: image: nginx:alpine volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro # 読み取り専用 - ./static:/usr/share/nginx/html:ro6. よくある問題と解決策
Section titled “6. よくある問題と解決策”問題1: ボリュームがマウントされない
Section titled “問題1: ボリュームがマウントされない”原因:
- パスが正しく設定されていない
- 権限の問題
解決策:
# 絶対パスを使用docker run -v /absolute/path:/data my-app:latest
# 権限の確認ls -la /path/to/volume問題2: ボリュームのサイズが大きい
Section titled “問題2: ボリュームのサイズが大きい”原因:
- 不要なデータが蓄積している
- ログファイルが大きい
解決策:
# ボリュームの使用状況を確認docker system df -v
# 未使用のボリュームを削除docker volume pruneこれで、Dockerボリュームの基礎知識と実務での使い方を理解できるようになりました。