(最終更新月:2023年8月)
✔当記事は以下のような方に向けて書かれています
「docker volumeって何だろう?」
「docker volumeの適切なつかい方を理解したい」
「docker volumeの使用例を見てみたい」
✔当記事でお伝えすること
- docker volumeの基本的な理解
- docker volumeの規則正しい使い方とその適用
- docker volumeの事例
当記事では、docker volumeの素朴な基本から、その高度なオプションの活用方法に至るまで、具体的な例を基に細部にわたって解説します。
ぜひ最後までお読みください。
Docker Volumeの基本理解
こちらでは、DockerとそのVolumeについての基本的な理解を深めていきます。
具体的には、Docker自体の概要と、ボリューム(-v)と–mountオプションの理解、さらにそれらの動作の違いについて詳しく見ていきましょう。
- Dockerとは何か?
- ボリューム(-v)と–mountオプションの理解
- -vと–mountオプションの動作の違い
Dockerとは何か?
Dockerは、ソフトウェア開発の世界で革命を起こしたコンテナ技術のひとつです。
アプリケーションとその依存関係を「コンテナ」にパッケージングすることで、開発からテスト、本番環境への移行を迅速かつ一貫したものにします。
これにより、「私のマシンでは動作したんだけど、、、」という問題を劇的に減せます。
ボリューム(-v)と–mountオプションの理解
Dockerのボリュームとは、データを永続化し、コンテナ間で共有するためのメカニズムです。
データをコンテナ内に保存するのではなく、Dockerホスト(あなたのPC等)のファイルシステム上に存在させます。
結果として、コンテナのライフサイクルに縛られず、データはコンテナの生成と削除を超えて持続できるのです。
ボリュームは、-v フラグまたは –mount オプションにより、作成および管理できます。
-v と –mount は同じ目的(ボリュームのマウント)を持っていますが、–mount オプションはより明示的な構文を提供し、追加の設定オプションも提供します。
-vと–mountオプションの動作の違い
-v と –mount オプションの違いを見ていきましょう。
-v または –volume オプションはより簡潔な構文を持ち、以下の形式で使用されます。
docker run -v /host/path:/container/path
一方、–mount オプションはより明示的で柔軟なオプションを提供します。
以下がその例です。
docker run --mount type=bind,source=/host/path,target=/container/path
–mount オプションでは、以下を明示的に指定できます。
- マウントの種類(type)
- ソース(source)
- ターゲット(target)
ユーザーは何がおこなわれているかをより明確に理解できます。
ただし既存のDocker環境やスクリプトで -v が広く使われているため、–mount への切り替えは徐々におこなわれているのが現実です。
Docker Volumeの作成と操作
こちらでは、Docker Volumeの生成と操作について解説します。
具体的なVolumeの生成方法や管理手順など、実戦に役立つ内容です。
- Volumeの生成と管理手順
- Volume付きコンテナの起動方法
Volumeの生成と管理手順
DockerのVolumeは、以下のコマンドで作成できます。
docker volume create <ボリューム名>
例えば、次のコマンドはmyvolume
という名前の新しいVolumeを作成します。
docker volume create myvolume
Volumeの一覧を表示するには、docker volume ls
コマンドを使います。
docker volume ls
特定のVolumeの詳細情報を取得するには、docker volume inspect
コマンドを使いましょう。
次のコマンドはmyvolume
の詳細情報を表示します。
docker volume inspect myvolume
不要になったVolumeを削除するには、docker volume rm
コマンドを使います。
myvolume
を削除してみます。
docker volume rm myvolume
Volume付きコンテナの起動方法
Volumeを持つコンテナを起動するには、docker run
コマンドに-v
オプションまたは--mount
オプションを使用します。
次のコマンドは、myvolume
を/data
ディレクトリにマウントしたコンテナを起動します。
docker run -d -v myvolume:/data ubuntu
–mountオプションでは以下のとおりです。
docker run -d --mount source=myvolume,target=/data ubuntu
この場合、ubuntu
コンテナの/data
ディレクトリにデータを書き込むと、そのデータはホストマシンのmyvolume
に永続化されます。
このように、Volumeはコンテナ間でデータを共有したり、データをコンテナのライフサイクルを超えて永続化するための便利なメカニズムを提供しているのです。
Docker Composeを使ったVolumeの活用
こちらでは、Docker Composeを使用してVolumeを管理する方法について解説します。
- Docker ComposeでのVolumeの利用方針
- サービスでのVolume利用とその文法
- データコピーの方法と技巧
Docker Composeは、複数のコンテナからなるアプリケーションを、一貫した環境で開発、テスト、デプロイするために使うもの。Webサーバーとデータベースなど複数のサービスを連携させられます。
Docker ComposeでのVolumeの利用方針
Docker Composeを使用すると、YAMLファイルでVolumeを定義してサービスに割り当てられます。
一貫した環境を迅速にセットアップできるのです。
以下のdocker-compose.yml
の例では、dbdata
という名前のVolumeを作成し、db
サービスの/var/lib/mysql
ディレクトリにマウントしています。
version: "3"
services:
db:
image: mysql:5.7
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
このコンフィギュレーションを適用するには、docker-compose up
コマンドを使用します。
docker-compose up
サービスでのVolume利用とその文法
Docker ComposeのYAMLファイルでは、volumes
キーを使用してサービスごとにVolumeを割り当てます。
Volumeを割り当てるためには、以下の形式での記述が必要です。
<ボリューム名>:<マウントポイント>
またデフォルトでは、Composeは指定した名前のVolumeが存在しない場合に自動的に作成します。
既存のVolumeを使用するには、external: true
を指定しましょう。
volumes:
dbdata:
external: true
データコピーの方法と技巧
Docker Composeを使用して、ひとつのサービスから別のサービスにデータをコピーすることも可能です。
これは、volumes_from
キーを使用しておこないます。
ただしこの機能は、Composeのバージョン2でのみ利用可能であり、バージョン3では廃止されています。
例えば次のように指定すると、web
サービスはdb
サービスの全てのマウントされたボリュームを引き継ぎます。
version: '2'
services:
web:
image: nginx:latest
volumes_from:
- db
db:
image: mysql:5.7
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
この機能は、初期化スクリプトやアセットなどのデータを共有する場合に有用です。
ただし注意点として、volumes_from
はボリュームの所有権を変更しないため、ファイルのパーミッションに気をつけなければなりません。
Volumeの特殊利用法
こちらでは、Docker Volumeの特殊な利用法を学びます。
具体的には、読み取り専用ボリュームの設定と利用方法、そしてマシン間でのデータ共有方法などです。
- 読み取り専用ボリュームの設定と利用
- マシン間でのデータ共有方法
読み取り専用ボリュームの設定と利用
Dockerでは、ボリュームを読み取り専用としてマウントすることが可能です。
これは、データの不変性を確保するために重要な機能です。
読み取り専用のボリュームを作成するには、docker run
コマンドで:ro
オプションを使用します。
以下が例です。
docker run -d --name mycontainer -v myvol:/app:ro myimage
myvol
という名前のボリュームを/app
ディレクトリに読み取り専用としてマウントしています。
同様に、Docker ComposeのYAMLファイルでも読み取り専用ボリュームを設定できます。
以下の例をご覧ください。
version: "3"
services:
db:
image: mysql:5.7
volumes:
- type: volume
source: dbdata
target: /var/lib/mysql
read_only: true
volumes:
dbdata:
db
サービスの/var/lib/mysql
ディレクトリを読み取り専用としてマウントしています。
マシン間でのデータ共有方法
Dockerでは、マシン間でデータを共有する方法も提供しています。
これは、Docker SwarmモードやDocker Volumeプラグインを使用して実現可能です。
Docker Swarmモードでの共有
Docker Swarmモードでは、共有ストレージシステム上のVolumeを複数のノードで共有できます。
このための具体的な設定や手順は、使用する共有ストレージシステムやDocker Volumeプラグインにより異なります。
Docker Volumeプラグインを使う
個々のDockerホスト間でデータを共有するには、NFSやSSHFSなどのネットワークファイルシステムが利用できます。
これには、専用のDocker Volumeプラグインが必要で、docker volume create
コマンドでネットワークファイルシステムに接続しなければなりません。
以下に示す例では、vieux/sshfs
プラグインを使用して、SSH経由でリモートホストのディレクトリをマウントします。
docker volume create -d vieux/sshfs -o sshcmd=user@host:/path remote_vol
このremote_vol
ボリュームは、任意のDockerコンテナでマウントできます。
Docker Volumeドライバの利用
こちらでは、Docker Volumeドライバの利用について解説します。
Volumeドライバの基本から具体的な利用法までご覧ください。
- Volumeドライバの意義と設定
- Volumeドライバを活用したボリューム生成手順
- NFSボリュームとCIFS/Sambaボリュームの利用法
Volumeドライバの意義と設定
Docker Volumeドライバは、ストレージプロバイダーと連携し、遠隔地にあるデータをローカルのDockerホストにマウントできるようにします。
複数のDockerホスト間でデータを共有する場合や、特殊なストレージ要件を持つ場合に便利です。
Dockerでは、ローカルファイルシステムを対象とするデフォルトのVolumeドライバだけでなく、以下を対象とするドライバも利用できます。
- Amazon EBSやMicrosoft Azure File Storageなどのクラウドストレージサービス
- NFSやCIFS/Sambaなどのネットワークファイルシステム
これらのドライバはDockerプラグインとして提供されており、docker plugin install
コマンドでインストールできます。
以下の例では、vieux/sshfs
プラグインをインストールしています。
docker plugin install vieux/sshfs
Volumeドライバを活用したボリューム生成手順
インストールしたVolumeドライバは、docker volume create
コマンドの-d
オプションで指定できます。
以下の例では、vieux/sshfs
ドライバを使用してボリュームを作成しています。
docker volume create -d vieux/sshfs -o sshcmd=user@host:/path myvolume
このように作成したボリュームは、Dockerコンテナを起動する際に-v
オプションで指定することでマウントできます。
NFSボリュームとCIFS/Sambaボリュームの利用法
NFSボリュームとCIFS/Sambaボリュームは、ネットワークファイルシステムを対象とするVolumeドライバの一例です。
これらを利用することで、Dockerホスト間でデータを共有できます。
それぞれのドライバを使用するには、専用のDockerプラグインが必要で、以下のようにインストールします。
docker plugin install --grant-all-permissions vieux/sshfs
docker plugin install --grant-all-permissions sapk/plugin-volume-gluster
これらのプラグインをインストールした後、docker volume create
コマンドでネットワークファイルシステムに接続しましょう。
例えば、次のようにNFSボリュームを作成します。
docker volume create -d vieux/sshfs -o sshcmd=user@host:/path nfsvolume
また、以下のようにCIFS/Sambaボリュームを作成します。
docker volume create -d sapk/plugin-volume-gluster -o device=//server/share cifsvolume
これらのボリュームは、Dockerコンテナを起動する際に-v
オプションで指定することでマウントできます。
データボリュームの保全と管理
こちらでは、データボリュームの保全と管理について詳しく説明します。
- データボリュームのバックアップと復元
- ボリュームの削除方法: 匿名ボリュームと全ボリューム
データボリュームのバックアップと復元
Dockerボリュームのバックアップを取るには、docker cp
コマンドを使用します。
以下の例では、mycontainer
からmyvolume
ボリュームをバックアップしています。
docker cp mycontainer:/path/to/volume /host/path/to/backup
このバックアップを新しいボリュームに復元するには、以下の手順を実行します。
- 新しいボリュームを作成
docker volume create mynewvolume
- 新しいコンテナを作成し、作成した新しいボリュームをマウント
docker run -v mynewvolume:/path/to/volume --name tempcontainer -d myimage
- バックアップから新しいボリュームにデータを復元
docker cp /host/path/to/backup tempcontainer:/path/to/volume
- コンテナを停止し、削除
docker stop tempcontainer docker rm tempcontainer
この新しいボリュームは、その他のコンテナでも使用できます。
ボリュームの削除方法: 匿名ボリュームと全ボリューム
ボリュームを削除するには、docker volume rm
コマンドを使用します。
以下は、myvolume
ボリュームを削除する例です。
docker volume rm myvolume
匿名ボリュームを削除するには、docker rm -v
コマンドが利用できます。
コンテナ名を指定することで、その関連する匿名ボリュームを削除できるのです。
docker rm -v mycontainer
すべての未使用のボリュームを削除するには、docker volume prune
コマンドを使用します。
docker volume prune
こちらのコマンドでボリュームを削除すると、そのボリューム上のすべてのデータが永久に失われます。
ボリュームを削除する前に必要なデータのバックアップを取ることを忘れないでください。
Docker Volumeの選択とまとめ
このセクションでは、Dockerのストレージオプションの選択ガイドを提供し、Docker Volumeの重要性と活用についてまとめます。
- Dockerのストレージオプション選択ガイド
- Docker Volumeの重要性と活用まとめ
Dockerのストレージオプション選択ガイド
Dockerでは、バインドマウント、tmpfsマウント、そしてボリュームという三つの主要なストレージオプションがあります。
それぞれには利点と欠点があり、使用シーンにより最適なオプションが変わります。
- バインドマウント
ホストマシン上の既存のディレクトリをコンテナにマウントします。これは開発作業に便利ですが、ホストマシンのファイルシステムのセキュリティを維持するためには注意が必要です。 - tmpfsマウント
メモリ内にデータを格納する一時的なマウントポイントを提供します。これはパフォーマンスが重要な場合やデータの永続性が必要でない場合に役立ちます。 - ボリューム
Dockerが管理するディスク上の領域を提供します。これはコンテナ間でデータを共有したり、データを永続化するための最良の選択です。
選択する際には、パフォーマンス、セキュリティ、データの永続性などの要件を検討してください。
まとめ
当記事では、Docker Volumeについて学習してきました。
- Docker Volumeは、Dockerでデータを永続化するための重要なツール
- コンテナのライフサイクルに関係なく、ボリュームはデータを永続的に保持できる
- 異なるコンテナ間でデータを共有するためにも使用可能
さらに、Docker Volumeは、Docker Composeを使用して複数のコンテナ間でデータを共有したり、特定のドライバを使用してボリュームを作成したりなど、より高度な操作を可能にします。
バックアップと復元、削除など、適切なボリュームの管理は、アプリケーションのデータ保全と安全性を確保する上で不可欠です。
当記事を参考に、Docker Volumeを効果的に使用してください。