最終更新
リンドくん
たなべ先生、Dockerのコンテナを削除したらデータも全部消えちゃうんですよね?
データベースのデータとか、どうやって保存すればいいんですか?
たなべ
いい質問だね!確かにコンテナを削除すると中のデータは消えちゃうんだ。
でもボリュームやバインドマウントという仕組みを使えば、データを永続化できるんだよ。今日はその使い方を詳しく教えるね。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
Dockerを使い始めると、多くの方が直面する問題があります。
それは「コンテナを削除したらデータも消えてしまう」という問題です。
例えば、データベースを動かすコンテナを作成して、たくさんのデータを保存したとします。
しかし、コンテナに問題が発生して削除すると、せっかく保存したデータも一緒に消えてしまうのです。
これはDockerの設計思想によるものです。Dockerコンテナは一時的で使い捨てという前提で設計されています。
そのため、コンテナ内のファイルシステムは、コンテナが削除されると一緒に消えてしまいます。
では、データベースのデータや設定ファイルなど、保持しておきたいデータはどうすればいいのでしょうか?
そこで登場するのが、Dockerのデータ永続化機能です。主に以下の2つの方法があります。
この2つを適切に使い分けることで、コンテナを削除してもデータを保持できるようになります。
また、複数のコンテナでデータを共有することも可能になるのです。
今回の記事では、これらの仕組みについて、初心者の方でも理解できるよう丁寧に解説していきます。
リンドくん
ボリュームとバインドマウントって、どう違うんですか?どっちを使えばいいのか迷っちゃいます...
たなべ
確かに最初は混乱するよね。
簡単に言うと、ボリュームはDockerが管理してくれる保管庫で、バインドマウントは自分で場所を指定する保管庫なんだ。それぞれに適した使い道があるよ。
ボリュームは、Dockerが管理する専用の保管場所です。Dockerコマンドで作成・管理でき、以下のような特徴があります。
ボリュームは、データベースのデータや重要な設定ファイルなど、コンテナとは独立して管理したいデータを保存するのに最適です。
バインドマウントは、ホストマシン(自分のパソコン)の特定のディレクトリをコンテナにマウントする方法です。以下のような特徴があります。
バインドマウントは、開発中のソースコードをコンテナで実行したり、設定ファイルを頻繁に編集したりする場合に便利です。
一般的な使い分けは以下のような感じです。
ボリュームを使うべき場面
バインドマウントを使うべき場面
それでは、実際にそれぞれの使い方を見ていきましょう。
リンドくん
ボリュームって、具体的にどうやって作るんですか?
たなべ
ボリュームの作成はとても簡単なんだ。docker volume create
コマンドで作成できるよ。実際にやってみよう!
ボリュームを作成するには、以下のコマンドを使います。
これでmy-volume
という名前のボリュームが作成されます。
作成されたボリュームを確認するには、次のコマンドを実行します。
すると、作成したボリュームが一覧表示されます。
作成したボリュームをコンテナで使用するには、-v
または--mount
オプションを使います。
この例では、my-volume
というボリュームをコンテナ内の/app/data
ディレクトリにマウントしています。
ボリュームの詳細情報を確認するには、以下のコマンドを使います。
出力例は次のようになります。
このMountpoint
の場所に実際のデータが保存されています。ただし、この場所はDocker内部の管理領域なので、通常は直接アクセスする必要はありません。
使わなくなったボリュームを削除するには、以下のコマンドを使います。
ただし、コンテナで使用中のボリュームは削除できないので注意してください。
まずコンテナを停止・削除してから、ボリュームを削除する必要があります。
リンドくん
バインドマウントは開発に便利って言ってましたけど、具体的にはどう使うんですか?
たなべ
例えば、自分のパソコンでHTMLファイルを編集して、その変更をすぐにDockerコンテナで確認したいときに使うんだ。実際にやってみるとすごく便利だよ!
バインドマウントを使用するには、ホストのディレクトリパスを指定してコンテナを起動します。
この例では、ホストの/Users/yourname/myproject
ディレクトリを、コンテナ内の/usr/share/nginx/html
にマウントしています。
カレントディレクトリをマウントしたい場合は、$(pwd)
を使うと便利です。
Windowsの場合は、%cd%
(コマンドプロンプト)または${PWD}
(PowerShell)を使います。
セキュリティのため、コンテナからファイルを変更させたくない場合は、読み取り専用でマウントできます。
:ro
オプションを付けることで、コンテナ内からはファイルの読み取りのみが可能になります。
より明示的にマウント設定を行いたい場合は、--mount
オプションも使えます。
--mount
オプションは設定が明確で読みやすいため、複雑な構成の場合におすすめです。
リンドくん
実際の開発では、どんなことに気をつければいいですか?
たなべ
いくつか重要なポイントがあるよ。特にパーミッション(権限)の問題や、データのバックアップは気をつけないといけないね。
Linuxベースのコンテナでは、ファイルの所有者やパーミッションに注意が必要です。
問題例: バインドマウントしたファイルにコンテナからアクセスできない
対策
または、docker-composeでuser
オプションを指定します。
重要なデータは定期的にバックアップを取りましょう。
このコマンドは、mysql-data
ボリュームの内容をmysql-backup.tar.gz
としてバックアップします。
バックアップから復元する場合は、以下のようにします。
使わなくなったボリュームは、ディスク容量を圧迫します。定期的にクリーンアップしましょう。
バインドマウントを使う場合、プロジェクトのルートに.gitignore
を設定しておくと安心です。
データベースのパスワードなど、機密情報は.env
ファイルで管理しましょう。
.env
ファイル:
docker-compose.yml
:
これにより、機密情報をGitにコミットしてしまうリスクを減らせます。
リンドくん
ボリュームとバインドマウント、だいぶ理解できました!でも、どっちをメインに使えばいいか迷います...
たなべ
基本的には、開発環境ではバインドマウント、本番環境やデータベースではボリュームと覚えておけば大丈夫だよ。
使い分けができるようになると、Docker開発がもっと快適になるからね!
今回は、Dockerのボリュームとバインドマウントについて詳しく解説しました。それぞれの特徴と使い分けを理解することで、Dockerをより効果的に活用できるようになります。
重要なポイントをまとめます。
Dockerのデータ永続化は、最初は少し難しく感じるかもしれません。しかし、一度理解してしまえば、開発効率が大きく向上します。
ぜひ今回紹介したサンプルコードを実際に試してみて、ボリュームとバインドマウントの違いを体感してみてください。
実際に手を動かすことで、理解が深まります!