docker-storage について
docker-storageは、Dockerのデータ永続化を設定する開発者や運用担当者向けのガイダンススキルです。ボリューム、バインドマウント、tmpfs、データベースの構成、バックアップ、ストレージドライバーを実用的なコマンドとともに説明します。
主な機能
- 01ボリューム、バインドマウント、tmpfsの比較
- 02名前付きボリュームの作成と確認
- 03データベースの永続化設定
- 04ボリュームデータのバックアップと復元
- 05ストレージドライバーの選択と確認
- 06よくあるストレージ問題の解決
活用シーン
- 01データベースコンテナのデータを永続化
- 02開発中のアプリコードをコンテナに同期
- 03一時データや機密データをメモリに保持
- 04Dockerボリュームをバックアップまたは復元
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ full-stack-skills/ docker-skills --skill docker-storageインストール後、Claude Code で/docker-storageを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
agents/openai.yamlexamples/01-mysql-volume-persistence.md02-backup-restore.mdreferences/01-volume-decision-guide.md02-volume-management.md03-storage-drivers.md詳細
Docker ストレージ — ストレージとデータの永続化
Docker で永続データを管理するための包括的なガイダンスです。
使用するタイミング
ユーザーが次の内容に言及した場合は、必ずこのスキルを使用してください:
- 「docker volume」、「データボリューム」、「データの永続化」
- 「bind mount」、「tmpfs」
- 「コンテナのデータをどう保存するか」、「データを失わない」
- 「データベースコンテナをどう永続化するか」
- 「バックアップと復元」、「ストレージドライバー」
ストレージタイプの比較
| タイプ | 永続性 | パフォーマンス | 用途 |
|---|---|---|---|
| Volume | ✅(Docker が管理) | 高(ネイティブ) | 本番環境のデータベース、共有データ |
| Bind Mount | ✅(ホストのファイルシステム) | 高 | 開発(コードのライブ同期)、設定ファイル |
| Tmpfs | ❌(メモリのみ) | 最高 | シークレット、一時ファイル、機密データ |
視覚的な比較
Volume: Bind Mount: Tmpfs:
Container Container Container
│ │ │
Docker-managed /host/path Memory only
/var/lib/docker/volumes/ ↕ (no disk)
↕ Container sees: ↕
Container sees: /container/path Container sees:
/data = host files /tmp (in RAM)
Volume の管理
# Create & inspect
docker volume create mydata
docker volume ls
docker volume inspect mydata
# Use in container
docker run -v mydata:/var/lib/mysql mysql:8
docker run --mount source=mydata,target=/var/lib/mysql mysql:8 # explicit syntax (recommended)
# Cleanup
docker volume prune # Remove unused volumes
docker volume rm mydata # Remove specific volume
名前付き Volume と匿名 Volume
-v mydata:/data → Named volume (mydata) — survives container removal ✅
-v /data → Anonymous volume — hard to identify later ❌
Bind Mount
# Read-write bind mount
docker run -v $(pwd)/app:/app nginx
# Read-only (protect host files)
docker run -v $(pwd)/config:/etc/nginx:ro nginx
# Explicit syntax
docker run --mount type=bind,source=$(pwd)/app,target=/app nginx
Tmpfs(メモリ)
# Ephemeral data, never touches disk
docker run --tmpfs /tmp:rw,noexec,nosuid,size=64m nginx
docker run --mount type=tmpfs,destination=/tmp,tmpfs-size=64m nginx
データベースの永続化パターン
PostgreSQL
docker volume create pgdata
docker run -d \
--name postgres \
-e POSTGRES_PASSWORD=secret \
-v pgdata:/var/lib/postgresql/data \
-p 5432:5432 \
postgres:16-alpine
MySQL
docker volume create mysqldata
docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-v mysqldata:/var/lib/mysql \
-v $(pwd)/my.cnf:/etc/mysql/conf.d/my.cnf:ro \
-p 3306:3306 \
mysql:8.4
Redis(永続化)
docker volume create redisdata
docker run -d \
--name redis \
-v redisdata:/data \
-p 6379:6379 \
redis:7-alpine redis-server --appendonly yes
バックアップと復元
# Backup (using a temporary container)
docker run --rm \
-v mysqldata:/source \
-v $(pwd):/backup \
alpine tar czf /backup/mysqldata-backup.tar.gz -C /source .
# Restore
docker run --rm \
-v mysqldata:/target \
-v $(pwd):/backup \
alpine tar xzf /backup/mysqldata-backup.tar.gz -C /target
ストレージドライバー
| ドライバー | 状態 | 備考 |
|---|---|---|
| overlay2 | ✅ デフォルト | ほとんどの用途に最適。コピーオンライト方式 |
| devicemapper | 非推奨 | - |
| aufs | 非推奨 | - |
| btrfs/zfs | 特定用途向け | ファイルシステムが一致する場合に使用 |
docker info | grep "Storage Driver" # Check current
ワークフロー — 推奨設定手順
ステップ 1:ストレージタイプを決定する:永続データ → Volume、開発時のホットリロード → Bind Mount、一時キャッシュ → tmpfs
ステップ 2:Volume を作成する:docker volume create db_data
ステップ 3:コンテナにマウントする:docker run -v db_data:/var/lib/mysql mysql
ステップ 4:確認する:docker volume inspect db_data + docker exec mysql ls /var/lib/mysql
ステップ 5:バックアップする:docker run --rm -v db_data:/source -v $(pwd):/backup alpine tar czf /backup/db.tar.gz -C /source .
注意点 — よくある落とし穴
- 匿名 Volume が蓄積する:名前を指定しない
-v /dataを使うたびに、新しい匿名 Volume が作成されます。→ 解決策:docker volume pruneですべての未使用 Volume を削除します。名前付き Volume を使用してください:-v mydata:/data。 - Bind Mount のパス:絶対パスである必要があります。→ 解決策:docker run では
-v $(pwd)/app:/appを使用してください。Compose では-v ./app:/appも使用できます。 - Bind Mount の権限問題:コンテナの UID とホストの UID が異なると、アクセスが拒否されます。→ 解決策:
--user $(id -u):$(id -g)を指定するか、Dockerfile のエントリーポイントでRUN chown 1000:1000 /dataを実行してください。 - コンテナ削除時のデータ損失:
-vを指定しないと、コンテナの削除時にデータが失われます。--rmフラグを指定すると、さらに危険です。→ 解決策:必ず名前付き Volume を使用してください:docker run -v db_data:/var/lib/mysql。 - macOS の Bind Mount のパフォーマンス:Docker Desktop for Mac の Bind Mount は遅くなります。→ 解決策:
:cachedまたは:delegatedのマウントオプションを使うか、I/O 性能を高めるために名前付き Volume を使用してください。
境界 — 能力の範囲(適用できる場面とできない場面)
| 分類 | 場面 | 説明 |
|---|---|---|
| ✅ 対応可能 | データ永続化の設定(Volume/Bind Mount/tmpfs) | 3 種類のストレージの作成、マウント、管理 |
| ✅ 対応可能 | バックアップと復元 | tar + --volumes-from によるバックアップと復元 |
| ✅ 対応可能 | ストレージドライバーの選定 | overlay2/btrfs/zfs の比較 |
| ⚠️ 条件付き | NFS/クラウドストレージの Volume ドライバー | 対応するドライバープラグインのインストールが必要 |
| ⚠️ 条件付き | macOS での Bind Mount のパフォーマンス | :cached/:delegated または名前付き Volume を使用 |
| ❌ 対象外 | K8s PersistentVolume/PVC | docker-production と K8s のドキュメントを使用 |
| ❌ 対象外 | 分散ファイルシステム(Ceph/GlusterFS) | システム管理者の担当範囲 |
| ❌ 対象外 | データベースのパフォーマンス最適化 | DBA の専門領域 |
このスキルを使用しない場合
| ❌ 使用を避けるケース | ✅ 代わりに使用 |
|---|---|
| コンテナの実行(データに関する懸念がない場合) | docker-run |
| 複数コンテナのオーケストレーション | docker-compose |
| Kubernetes ストレージ(PV/PVC) | K8s のドキュメント |
| Docker の基本 | docker-basics |
セキュリティと安定性
- コンテナによる変更を許可しない設定ファイルには
:roを使用してください。 - セキュリティ上の影響を理解せずに、Docker ソケット(
/var/run/docker.sock)を Bind Mount しないでください。 - Volume は定期的にバックアップしてください。特にデータベースの Volume は必ずバックアップしてください。
- 実行可能なスクリプトは同梱されていません。ガイダンスのみです。
📚 公式ドキュメントの参考資料
| ドキュメント | アドレス |
|---|---|
| Docker ストレージ | https://docs.docker.com/storage/ |
| Volumes | https://docs.docker.com/storage/volumes/ |
| Bind Mounts | https://docs.docker.com/storage/bind-mounts/ |
| tmpfs | https://docs.docker.com/storage/tmpfs/ |
| ストレージドライバー | https://docs.docker.com/storage/storagedriver/ |
| docker volume コマンド | https://docs.docker.com/reference/cli/docker/volume/ |
🧭 Docker Skills Journey
📍 現在の位置:
docker-storage— データの永続化
← 前へ:docker-run / docker-networking
→ 次へ:docker-compose / docker-security
FAQ
Q1:このスキルをすぐに使い始めるには? A:上記のクイックスタートのセクションを参照し、手順に沿って操作してください。
Q2:バージョンの互換性に関する問題が発生した場合は? A:依存関係のバージョンを確認し、lock ファイルで固定してください。よくある落とし穴のセクションも参照してください。
Q3:本番環境で使用するには? A:ベストプラクティスのセクションを参照し、設定が正しいことを確認して、監視とログを適切に行ってください。
Q4:パフォーマンスを最適化するには? A:パフォーマンス最適化に関するドキュメントを参照し、キャッシュやインデックスなどを活用してください。
Q5:貢献したり、問題を報告したりするには? A:GitHub リポジトリで Issue または Pull Request を提出してください。
Q6:中国語に対応していますか? A:中国語のドキュメントと中国語のコメントに対応しています。国内向け適応のセクションを参照してください。