Day6:データ永続化(ボリューム)中盤
テーマ:ボリュームの種類・仕組み・実務での使い分けを深掘りし、“データが消えない環境”を自分で設計できるようになる
中盤では、前半で学んだ
「ボリューム=コンテナの外にあるデータ保存領域」
という基礎をさらに深掘りし、実務で必ず必要になる
- ボリュームの種類
- 使い分け
- 具体的な動作イメージ
- docker-compose での永続化
を理解していきます。
ここを理解すると、あなたは
「データが消えない Docker 環境」を自分で設計できるエンジニア
になります。
ボリュームには3種類ある
名前付きボリューム(named volume)
例:
docker volume create mydata
特徴:
- 名前がついている
- コンテナを消しても残る
- 実務で最もよく使う
- MySQL や PostgreSQL の永続化に最適
匿名ボリューム(anonymous volume)
例:
docker run -v /app/node_modules node
特徴:
- 名前がない
- Docker が勝手に名前をつける
- コンテナ削除時に残るが、管理しづらい
- Node.js の node_modules などに使う
bind mount(マウント)
例:
docker run -v $(pwd):/app node
特徴:
- ホストのフォルダをそのまま使う
- 開発用(ホットリロード)に最適
- データ永続化にはあまり使わない
名前付きボリュームが“データ永続化の主役”である理由
コンテナと完全に独立している
名前付きボリュームは、
コンテナとは別の場所に保存される
ため、コンテナを削除してもデータは残ります。
Docker が安全に管理してくれる
ホスト側のパスを意識する必要がなく、
Docker が安全に保存場所を管理します。
実務で最も使われる
特にデータベースでは必須です。
例:
- MySQL
- PostgreSQL
- Redis
- MongoDB
これらはすべて 名前付きボリュームで永続化 します。
ボリュームの実体を“目で見て理解する”
ボリュームの一覧を見る
docker volume ls
ボリュームの実体の場所を確認
docker volume inspect mydata
出力例(概念的):
"Mountpoint": "/var/lib/docker/volumes/mydata/_data"
ここが 実際のデータ保存場所 です。
つまり:
- コンテナは消えても
/var/lib/docker/volumes/mydata/_dataは残る
これが永続化の仕組みです。
ボリュームを使った“実務レベルの MySQL 永続化”
MySQL のデータディレクトリをボリュームに紐づける
docker run -d \
--name mydb \
-v mydata:/var/lib/mysql \
mysql:8
ポイント:
/var/lib/mysqlは MySQL のデータ保存場所- ここを mydata に紐づけることで永続化が成立
動作イメージ
- MySQL がデータを
/var/lib/mysqlに保存 - そのフォルダが mydata にマウントされている
- コンテナを削除しても mydata は残る
- 新しい MySQL コンテナを作っても mydata を再利用できる
docker-compose で永続化を設定する
実務では docker run を使わず、
docker-compose.yml に永続化を記述します。
services:
db:
image: mysql:8
volumes:
- mydata:/var/lib/mysql
volumes:
mydata:
YAMLこの構成のメリット
docker compose upだけで永続化が自動で設定される- チーム全員が同じ構成を再現できる
- ボリュームの管理が簡単
ボリュームの“よくある誤解”を深掘りして解消する
「コンテナを削除したらデータも消えるのでは?」
→ ボリュームはコンテナとは別物なので消えません。
「ボリュームはどこに保存されているの?」
→ /var/lib/docker/volumes/<名前>/_data に保存されています。
「bind mount とボリュームは何が違う?」
→ bind mount はホストのフォルダを直接使う
→ ボリュームは Docker が管理する専用領域
「本番環境でもボリュームを使うの?」
→ 使います。
特に DB は必須です。
中盤まとめ
あなたがここまで理解できていれば、中盤はクリアです。
- ボリュームには「名前付き」「匿名」「bind mount」の3種類がある
- データ永続化には名前付きボリュームを使う
- MySQL の
/var/lib/mysqlをボリュームに紐づけるとデータが残る - docker-compose で永続化を設定すると再現性が高い
- ボリュームはコンテナとは独立しているため削除しても消えない
