フリーキーズ | 独学プログラミング

Dockerのボリュームとバインドマウントでデータ永続化!初心者でもわかる使い分けと実践方法

リンドくん

リンドくん

たなべ先生、Dockerのコンテナを削除したらデータも全部消えちゃうんですよね?
データベースのデータとか、どうやって保存すればいいんですか?

たなべ

たなべ

いい質問だね!確かにコンテナを削除すると中のデータは消えちゃうんだ。
でもボリュームバインドマウントという仕組みを使えば、データを永続化できるんだよ。今日はその使い方を詳しく教えるね。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

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 \
  nginx

Windowsの場合は、%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のデータ永続化は、最初は少し難しく感じるかもしれません。しかし、一度理解してしまえば、開発効率が大きく向上します。

ぜひ今回紹介したサンプルコードを実際に試してみて、ボリュームとバインドマウントの違いを体感してみてください。
実際に手を動かすことで、理解が深まります!

この記事をシェア

関連するコンテンツ