リンドくんたなべ先生、Dockerのコンテナを削除したらデータも全部消えちゃうんですよね?
データベースのデータとか、どうやって保存すればいいんですか?
たなべいい質問だね!確かにコンテナを削除すると中のデータは消えちゃうんだ。
でもボリュームやバインドマウントという仕組みを使えば、データを永続化できるんだよ。今日はその使い方を詳しく教えるね。
Dockerのデータ永続化が必要な理由
Dockerを使い始めると、多くの方が直面する問題があります。
それは「コンテナを削除したらデータも消えてしまう」という問題です。
例えば、データベースを動かすコンテナを作成して、たくさんのデータを保存したとします。
しかし、コンテナに問題が発生して削除すると、せっかく保存したデータも一緒に消えてしまうのです。
これはDockerの設計思想によるものです。Dockerコンテナは一時的で使い捨てという前提で設計されています。
そのため、コンテナ内のファイルシステムは、コンテナが削除されると一緒に消えてしまいます。
では、データベースのデータや設定ファイルなど、保持しておきたいデータはどうすればいいのでしょうか?
そこで登場するのが、Dockerのデータ永続化機能です。主に以下の2つの方法があります。
- ボリューム(Volume) - Docker自身が管理する永続化領域
- バインドマウント(Bind Mount) - ホストのディレクトリをコンテナにマウントする方法
この2つを適切に使い分けることで、コンテナを削除してもデータを保持できるようになります。
また、複数のコンテナでデータを共有することも可能になるのです。
今回の記事では、これらの仕組みについて、初心者の方でも理解できるよう丁寧に解説していきます。
ボリュームとバインドマウントの違いを理解しよう
リンドくんボリュームとバインドマウントって、どう違うんですか?どっちを使えばいいのか迷っちゃいます...
たなべ確かに最初は混乱するよね。
簡単に言うと、ボリュームはDockerが管理してくれる保管庫で、バインドマウントは自分で場所を指定する保管庫なんだ。それぞれに適した使い道があるよ。
ボリューム(Volume)とは
ボリュームは、Dockerが管理する専用の保管場所です。Dockerコマンドで作成・管理でき、以下のような特徴があります。
- Dockerが保存場所を管理 - ユーザーは保存場所を意識する必要がない
- 複数コンテナで共有可能 - 複数のコンテナから同じボリュームにアクセスできる
- バックアップや移行が容易 - Dockerコマンドで簡単に操作できる
- 本番環境に適している - Dockerの管理下にあるため安全性が高い
ボリュームは、データベースのデータや重要な設定ファイルなど、コンテナとは独立して管理したいデータを保存するのに最適です。
バインドマウント(Bind Mount)とは
バインドマウントは、ホストマシン(自分のパソコン)の特定のディレクトリをコンテナにマウントする方法です。以下のような特徴があります。
- 任意の場所を指定可能 - 自分のパソコン内の好きな場所を使える
- ファイルの直接編集が可能 - ホスト側で編集した内容がすぐにコンテナに反映される
- 開発環境に適している - ソースコードの変更がリアルタイムで反映される
- パスの指定が必要 - フルパスでの指定が必要
バインドマウントは、開発中のソースコードをコンテナで実行したり、設定ファイルを頻繁に編集したりする場合に便利です。
どちらを使うべきか?
一般的な使い分けは以下のような感じです。
ボリュームを使うべき場面
- データベースのデータ保存
- 本番環境でのデータ管理
- バックアップが重要なデータ
- 複数コンテナでのデータ共有
バインドマウントを使うべき場面
- 開発中のソースコードの実行
- 設定ファイルの頻繁な編集
- ログファイルの直接確認
- ホストとコンテナでファイルを同期したい場合
それでは、実際にそれぞれの使い方を見ていきましょう。
ボリュームの基本的な使い方
リンドくんボリュームって、具体的にどうやって作るんですか?
たなべボリュームの作成はとても簡単なんだ。docker volume createコマンドで作成できるよ。実際にやってみよう!
ボリュームの作成
ボリュームを作成するには、以下のコマンドを使います。
docker volume create my-volumeこれでmy-volumeという名前のボリュームが作成されます。
作成されたボリュームを確認するには、次のコマンドを実行します。
docker volume lsすると、作成したボリュームが一覧表示されます。
DRIVER VOLUME NAME
local my-volume
コンテナでボリュームを使用する
作成したボリュームをコンテナで使用するには、-vまたは--mountオプションを使います。
docker run -d \
--name my-container \
-v my-volume:/app/data \
nginxこの例では、my-volumeというボリュームをコンテナ内の/app/dataディレクトリにマウントしています。
ボリュームの詳細情報を確認
ボリュームの詳細情報を確認するには、以下のコマンドを使います。
docker volume inspect my-volume出力例は次のようになります。
[
{
"CreatedAt": "2025-10-03T09:00:00Z",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
"Name": "my-volume",
"Options": {},
"Scope": "local"
}
]このMountpointの場所に実際のデータが保存されています。ただし、この場所はDocker内部の管理領域なので、通常は直接アクセスする必要はありません。
ボリュームの削除
使わなくなったボリュームを削除するには、以下のコマンドを使います。
docker volume rm my-volumeただし、コンテナで使用中のボリュームは削除できないので注意してください。
まずコンテナを停止・削除してから、ボリュームを削除する必要があります。
バインドマウントの基本的な使い方
リンドくんバインドマウントは開発に便利って言ってましたけど、具体的にはどう使うんですか?
たなべ例えば、自分のパソコンでHTMLファイルを編集して、その変更をすぐにDockerコンテナで確認したいときに使うんだ。実際にやってみるとすごく便利だよ!
基本的なバインドマウントの使い方
バインドマウントを使用するには、ホストのディレクトリパスを指定してコンテナを起動します。
docker run -d \
--name my-web \
-v /Users/yourname/myproject:/usr/share/nginx/html \
-p 8080:80 \
nginxこの例では、ホストの/Users/yourname/myprojectディレクトリを、コンテナ内の/usr/share/nginx/htmlにマウントしています。
重要な注意点
バインドマウントでは絶対パスを指定する必要があります。相対パスは使えません。
現在のディレクトリをマウントする
カレントディレクトリをマウントしたい場合は、$(pwd)を使うと便利です。
docker run -d \
--name my-web \
-v $(pwd):/usr/share/nginx/html \
-p 8080:80 \
nginxWindowsの場合は、%cd%(コマンドプロンプト)または${PWD}(PowerShell)を使います。
# PowerShellの場合
docker run -d `
--name my-web `
-v ${PWD}:/usr/share/nginx/html `
-p 8080:80 `
nginx読み取り専用でマウントする
セキュリティのため、コンテナからファイルを変更させたくない場合は、読み取り専用でマウントできます。
docker run -d \
--name my-web \
-v $(pwd):/usr/share/nginx/html:ro \
-p 8080:80 \
nginx:roオプションを付けることで、コンテナ内からはファイルの読み取りのみが可能になります。
--mountオプションの使用
より明示的にマウント設定を行いたい場合は、--mountオプションも使えます。
docker run -d \
--name my-web \
--mount type=bind,source=$(pwd),target=/usr/share/nginx/html \
-p 8080:80 \
nginx--mountオプションは設定が明確で読みやすいため、複雑な構成の場合におすすめです。
ボリュームとバインドマウントのベストプラクティス
リンドくん実際の開発では、どんなことに気をつければいいですか?
たなべいくつか重要なポイントがあるよ。特にパーミッション(権限)の問題や、データのバックアップは気をつけないといけないね。
パーミッション(権限)に注意
Linuxベースのコンテナでは、ファイルの所有者やパーミッションに注意が必要です。
問題例: バインドマウントしたファイルにコンテナからアクセスできない
対策
# ホスト側でファイルのパーミッションを確認
ls -la
# 必要に応じて権限を変更
chmod 755 myfile.txtまたは、docker-composeでuserオプションを指定します。
services:
web:
image: nginx
user: "${UID}:${GID}"
volumes:
- ./html:/usr/share/nginx/htmlボリュームの定期的なバックアップ
重要なデータは定期的にバックアップを取りましょう。
# ボリュームのバックアップ
docker run --rm \
-v mysql-data:/source \
-v $(pwd):/backup \
busybox \
tar czf /backup/mysql-backup.tar.gz -C /source .このコマンドは、mysql-dataボリュームの内容をmysql-backup.tar.gzとしてバックアップします。
ボリュームの復元
バックアップから復元する場合は、以下のようにします。
# ボリュームの復元
docker run --rm \
-v mysql-data:/target \
-v $(pwd):/backup \
busybox \
tar xzf /backup/mysql-backup.tar.gz -C /target不要なボリュームの定期的なクリーンアップ
使わなくなったボリュームは、ディスク容量を圧迫します。定期的にクリーンアップしましょう。
# 未使用のボリュームを一覧表示
docker volume ls -f dangling=true
# 未使用のボリュームをすべて削除
docker volume prune.gitignoreの設定
バインドマウントを使う場合、プロジェクトのルートに.gitignoreを設定しておくと安心です。
# Docker関連
docker-compose.override.yml
.env
# データベースのバックアップ
*.sql
*.tar.gz
# ログファイル
*.log
環境変数の管理
データベースのパスワードなど、機密情報は.envファイルで管理しましょう。
.envファイル:
MYSQL_ROOT_PASSWORD=mypassword
MYSQL_DATABASE=mydb
docker-compose.yml:
services:
db:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}これにより、機密情報をGitにコミットしてしまうリスクを減らせます。
まとめ
リンドくんボリュームとバインドマウント、だいぶ理解できました!でも、どっちをメインに使えばいいか迷います...
たなべ基本的には、開発環境ではバインドマウント、本番環境やデータベースではボリュームと覚えておけば大丈夫だよ。
使い分けができるようになると、Docker開発がもっと快適になるからね!
今回は、Dockerのボリュームとバインドマウントについて詳しく解説しました。それぞれの特徴と使い分けを理解することで、Dockerをより効果的に活用できるようになります。
重要なポイントをまとめます。
- ボリュームはDocker管理の永続化領域で、本番環境やデータベースに最適
- バインドマウントはホストのディレクトリを直接マウントし、開発環境に最適
- docker-composeを使うことで、複雑な設定も簡単に管理できる
- パーミッションやバックアップなど、運用面での注意点も把握しておくことが重要
Dockerのデータ永続化は、最初は少し難しく感じるかもしれません。しかし、一度理解してしまえば、開発効率が大きく向上します。
ぜひ今回紹介したサンプルコードを実際に試してみて、ボリュームとバインドマウントの違いを体感してみてください。
実際に手を動かすことで、理解が深まります!





