はじめに
この実験では、docker volume create コマンドを使用して Docker でデータの永続化を効果的に管理する方法を学びます。基本的なボリュームの作成の基本プロセスを探索します。ボリュームは、Docker によって管理される性質と、バインドマウントと比較してバックアップや移行が容易であるため、コンテナデータを保存するための推奨方法です。
基本的な内容を理解したら、特定のドライバとオプションを使用してボリュームを作成し、その動作をカスタマイズする方法を学びます。さらに、この実験では、カスタムマウントオプションを使用してローカルボリュームを作成する手順を案内し、NFS を活用してローカルボリュームを作成する方法を実演します。これにより、さまざまなデータストレージシナリオに柔軟に対応できます。
基本的なボリュームを作成する
このステップでは、基本的な Docker ボリュームの作成方法を学びます。ボリュームは、Docker コンテナによって生成され、使用されるデータを永続化するための推奨方法です。バインドマウントもオプションの 1 つですが、ボリュームは Docker によって管理され、一般的にバックアップや移行が容易です。
まず、docker volume create コマンドを使用して単純なボリュームを作成しましょう。このボリュームの名前を myvolume とします。
docker volume create myvolume
コンソールにボリュームの名前が表示され、作成が確認できます。
次に、docker volume inspect コマンドを使用してボリュームの詳細を確認しましょう。これにより、ボリュームのドライバ、マウントポイント、スコープなどの情報が表示されます。
docker volume inspect myvolume
出力にはボリュームの詳細が表示されます。Mountpoint フィールドに注意してください。これは、ボリュームのデータがホストマシン上に保存されている場所を示しています。Docker がこの場所を管理しており、通常はこのディレクトリ内のファイルを直接変更することは避けるべきです。
次に、コンテナを実行し、このボリュームをコンテナにアタッチします。ubuntu イメージを使用し、myvolume をコンテナ内の /app ディレクトリにマウントします。また、マウントされたボリューム内のファイルにいくつかのデータを書き込む単純なコマンドを実行します。
まず、ubuntu イメージがローカルにない場合は、イメージを取得します。
docker pull ubuntu
次に、コンテナを実行し、ボリュームにデータを書き込みます。
docker run -d --name mycontainer -v myvolume:/app ubuntu bash -c "echo 'Hello from the volume!' > /app/greeting.txt && tail -f /dev/null"
このコマンドを分解して説明します。
docker run -d:コンテナをデタッチドモード(バックグラウンド)で実行します。--name mycontainer:コンテナにmycontainerという名前を付けます。-v myvolume:/app:myvolumeという名前のボリュームをコンテナ内の/appディレクトリにマウントします。ubuntu:使用するイメージを指定します。bash -c "echo 'Hello from the volume!' > /app/greeting.txt && tail -f /dev/null":コンテナ内で bash コマンドを実行します。文字列 "Hello from the volume!" を/appディレクトリ(マウントされたボリューム)内のgreeting.txtという名前のファイルに書き込み、その後tail -f /dev/nullを実行してコンテナを実行し続けます。
データがボリュームに書き込まれたことを確認するために、実行中のコンテナ内でコマンドを実行してファイルを読み取りましょう。
docker exec mycontainer cat /app/greeting.txt
出力として "Hello from the volume!" が表示され、コンテナ内からボリュームにデータが正常に書き込まれたことが確認できます。
最後に、コンテナを停止して削除しましょう。コンテナが削除された後もボリュームは保持されます。
docker stop mycontainer
docker rm mycontainer
特定のドライバとオプションを持つボリュームを作成する
このステップでは、特定のドライバを使用し、ドライバ固有のオプションを指定して Docker ボリュームを作成する方法を学びます。多くのユースケースではデフォルトの local ドライバで十分ですが、Docker はネットワークストレージやクラウドストレージなど、さまざまなストレージバックエンドに対応するボリュームドライバをサポートしています。
引き続き local ドライバを使用しますが、明示的に指定してオプションを渡す方法を実演します。local ドライバは、ファイルシステムの種類、マウントするデバイス、およびマウントオプションをそれぞれ指定するための type、device、o などのオプションをサポートしています。
local ドライバを使用して myvolume2 という名前のボリュームを作成し、いくつかのオプションを指定しましょう。この例では、データをメモリに保存する tmpfs ファイルシステムの種類を使用します。これは、ホストの再起動後にデータを保持する必要のない一時的なデータに便利です。
docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m myvolume2
このコマンドを分解して説明します。
docker volume create:ボリュームを作成するコマンドです。--driver local:localボリュームドライバを明示的に指定します。--opt type=tmpfs:ドライバにtype=tmpfsオプションを渡し、ファイルシステムの種類を指定します。--opt device=tmpfs:ドライバにdevice=tmpfsオプションを渡し、デバイスを指定します。tmpfsの場合、デバイスもtmpfsです。--opt o=size=100m:ドライバにo=size=100mオプションを渡します。oオプションはマウントオプションを渡すために使用されます。この場合、tmpfsボリュームの最大サイズを 100 メガバイトに設定しています。myvolume2:作成するボリュームの名前です。
作成が成功すると、コンソールにボリュームの名前が表示されます。
次に、適用されたドライバとオプションを確認するために、ボリュームを調査しましょう。
docker volume inspect myvolume2
出力では、Driver フィールドが local に設定され、Options フィールドに指定したオプション(type=tmpfs、device=tmpfs、o=size=100m)が表示されます。Mountpoint は、この tmpfs ボリュームがホスト上でマウントされている場所を示します。
次に、コンテナを実行し、この新しいボリュームをコンテナにアタッチします。再び ubuntu イメージを使用し、myvolume2 をコンテナ内の /data ディレクトリにマウントします。
まず、ubuntu イメージがローカルにない場合は取得します(前のステップで取得している可能性が高いです)。
docker pull ubuntu
次に、コンテナを実行し、ボリュームをアタッチします。
docker run -d --name mycontainer2 -v myvolume2:/data ubuntu tail -f /dev/null
このコマンドは、mycontainer2 という名前の ubuntu コンテナをデタッチドモードで実行し、myvolume2 を /data にマウントします。tail -f /dev/null はコンテナを実行し続けるために使用されます。
myvolume2 は tmpfs ボリュームであるため、コンテナ内の /data に書き込まれたすべてのデータはメモリに保存され、コンテナが停止および削除された後、またはホストが再起動された後には保持されません。
コンテナを停止して削除しましょう。
docker stop mycontainer2
docker rm mycontainer2
ボリューム myvolume2 はまだ存在しますが、その内容(書き込まれた場合)は tmpfs ボリュームであるため失われます。
マウントオプションを持つローカルボリュームを作成する
このステップでは、ローカルの Docker ボリュームを作成し、マウントオプションを指定する方法を学びます。マウントオプションを使用すると、ファイルシステムのマウント方法を制御できます。たとえば、パーミッションの設定、特定の機能の有効化、またはパフォーマンスの最適化などが可能です。
myvolume3 という名前のローカルボリュームを作成し、o オプションを使用してマウントオプションを指定します。この例では、uid と gid オプションを設定して、コンテナによってボリューム内に作成されたファイルがホスト上の特定のユーザーとグループによって所有されるようにします。これは、コンテナとホスト間でデータを共有する際のパーミッション管理に役立ちます。
まず、ボリュームのソースとして使用するディレクトリをホスト上に作成しましょう。標準的なローカルボリュームではこれは必ずしも必要ありませんが、マウントオプションが基になるファイルシステムにどのように影響するかを説明するのに役立ちます。
mkdir -p ~/project/myvolumedata
次に、local ドライバを使用して myvolume3 ボリュームを作成し、uid と gid を指定した o オプションを設定します。現在の labex ユーザーのユーザー ID とグループ ID を使用します。id -u と id -g コマンドを使用して、自分のユーザー ID とグループ ID を確認できます。
USER_ID=$(id -u)
GROUP_ID=$(id -g)
docker volume create --driver local --opt type=none --opt device=/home/labex/project/myvolumedata --opt o=bind,uid=$USER_ID,gid=$GROUP_ID myvolume3
このコマンドを分解して説明します。
docker volume create:ボリュームを作成するコマンドです。--driver local:localボリュームドライバを指定します。--opt type=none:自動的にファイルシステムの種類を作成しないことを指定します。既存のディレクトリにバインドします。--opt device=/home/labex/project/myvolumedata:マウントするデバイスを指定します。これは、ホスト上で作成したディレクトリです。絶対パス/home/labex/project/myvolumedataを使用していることに注意してください。--opt o=bind,uid=$USER_ID,gid=$GROUP_ID:マウントオプションを渡します。bind:バインドマウントを指定し、ボリュームを指定されたデバイス(ホストディレクトリ)にリンクします。uid=$USER_ID:ボリューム内に作成されるファイルのユーザー ID を現在のユーザーの ID に設定します。gid=$GROUP_ID:ボリューム内に作成されるファイルのグループ ID を現在のユーザーのグループ ID に設定します。
myvolume3:ボリュームの名前です。
コンソールにボリュームの名前が表示されるはずです。
次に、オプションを確認するためにボリュームを調査しましょう。
docker volume inspect myvolume3
出力では、Driver が local、Options に type=none、device=/home/labex/project/myvolumedata、および o=bind,uid=...,gid=...(あなたのユーザー ID とグループ ID が表示されます)が含まれているはずです。Mountpoint は device のパスと同じになります。
次に、コンテナを実行し、このボリュームをアタッチします。ubuntu イメージを使用し、myvolume3 をコンテナ内の /app にマウントします。その後、コンテナの /app ディレクトリ内にファイルを作成し、ホスト上でその所有権を確認します。
必要に応じて、ubuntu イメージを取得します。
docker pull ubuntu
次に、コンテナを実行し、マウントされたボリューム内にファイルを作成します。
docker run --rm -v myvolume3:/app ubuntu bash -c "echo 'Testing ownership' > /app/testfile.txt && ls -l /app/testfile.txt"
このコマンドは、ubuntu コンテナを実行し、myvolume3 を /app にマウントし、/app/testfile.txt に "Testing ownership" を書き込み、その後コンテナ内のファイルの詳細を表示します。コンテナは通常デフォルトで root として実行されるため、コンテナ内ではファイルが root 所有として表示されるはずです。
次に、ホストマシンの ~/project/myvolumedata ディレクトリ内のファイルの所有権を確認しましょう。
ls -l ~/project/myvolumedata/testfile.txt
ボリュームを作成する際に指定した uid と gid マウントオプションのおかげで、testfile.txt ファイルがホスト上の labex ユーザーとグループによって所有されていることがわかるはずです。
最後に、作成したディレクトリをクリーンアップしましょう。
rm -rf ~/project/myvolumedata
NFS を使用してローカルボリュームを作成する
このステップでは、NFS 共有をバックエンドストレージとして使用するローカルの Docker ボリュームを作成する方法を学びます。これにより、コンテナはネットワーク接続ストレージデバイスにデータを保存でき、複数のホストからデータにアクセスできるようになり、集中型のストレージソリューションが提供されます。
local ボリュームドライバで NFS を使用するには、device オプションを使用して NFS サーバーのアドレスと共有ディレクトリのパスを指定し、type オプションを使用してファイルシステムの種類を nfs と指定する必要があります。また、o オプションを使用して適切なマウントオプションを指定する必要があります。
この実験環境では、ループバックアドレス 127.0.0.1 とホスト上のディレクトリを使用して NFS 共有をシミュレートします。注意: 実際のシナリオでは、127.0.0.1 を NFS サーバーの実際の IP アドレスまたはホスト名に置き換え、/path/to/nfs/share を NFS サーバー上のエクスポートされたパスに置き換えます。
まず、シミュレートされた NFS 共有として機能するディレクトリをホスト上に作成しましょう。
mkdir -p ~/project/nfs_share
次に、NFS オプションを指定して local ドライバを使用して myvolume4 ボリュームを作成します。
sudo docker volume create --driver local --opt type=nfs --opt device=127.0.0.1:/home/labex/project/nfs_share --opt o=addr=127.0.0.1,rw myvolume4
このコマンドを分解して説明します。
sudo docker volume create: NFS ボリュームの作成には、ホスト上でマウント操作を実行するために root 権限が必要なことが多いため、sudoを使用します。--driver local:localボリュームドライバを指定します。--opt type=nfs: ファイルシステムの種類を NFS と指定します。--opt device=127.0.0.1:/home/labex/project/nfs_share: NFS デバイスを指定します。これはnfs_server_address:/exported_pathの形式です。ループバックアドレスと先ほど作成したディレクトリを使用しています。絶対パス/home/labex/project/nfs_shareを使用していることに注意してください。--opt o=addr=127.0.0.1,rw: NFS クライアントにマウントオプションを渡します。addr=127.0.0.1: NFS サーバーのアドレスを指定します。rw: 読み書き権限で共有をマウントします。
myvolume4: ボリュームの名前です。
作成が成功すると、コンソールにボリュームの名前が表示されるはずです。
次に、NFS 固有の詳細を確認するためにボリュームを調査しましょう。
docker volume inspect myvolume4
出力では、Driver が local、Options に type=nfs、device=127.0.0.1:/home/labex/project/nfs_share、および o=addr=127.0.0.1,rw が含まれているはずです。Mountpoint は、この NFS ボリュームが Docker によってホスト上でマウントされている場所を示します。
次に、コンテナを実行し、この NFS ボリュームをアタッチします。ubuntu イメージを使用し、myvolume4 をコンテナ内の /data にマウントします。その後、コンテナの /data ディレクトリ内にファイルを作成し、ホストのシミュレートされた NFS 共有上でその存在を確認します。
必要に応じて、ubuntu イメージを取得します。
docker pull ubuntu
次に、コンテナを実行し、マウントされたボリューム内にファイルを作成します。
docker run --rm -v myvolume4:/data ubuntu bash -c "echo 'Data on NFS' > /data/nfs_test.txt && ls -l /data/nfs_test.txt"
このコマンドは、ubuntu コンテナを実行し、myvolume4 を /data にマウントし、/data/nfs_test.txt に "Data on NFS" を書き込み、その後コンテナ内のファイルの詳細を表示します。
次に、ホストマシンの ~/project/nfs_share ディレクトリ内のファイルを確認しましょう。
ls -l ~/project/nfs_share/nfs_test.txt
nfs_test.txt ファイルが表示され、NFS ボリュームを使用してコンテナ内に書き込まれたデータがホストのシミュレートされた NFS 共有上に存在することが確認できます。
最後に、作成したディレクトリをクリーンアップしましょう。
rm -rf ~/project/nfs_share
まとめ
この実験では、docker volume create コマンドを使用して Docker ボリュームを作成および管理する方法を学びました。まず、基本的なボリュームを作成し、その詳細を調査することで、Docker がデータの保存場所をどのように管理しているかを理解しました。次に、このボリュームをコンテナにアタッチし、データを書き込む練習を行い、ボリュームがコンテナのデータに永続的なストレージを提供する仕組みを実証しました。また、この実験では、特定のドライバとオプションを指定したボリュームの作成方法も学びました。これには、マウントオプションを指定したローカルボリュームや、NFS を使用したローカルボリュームが含まれており、異なるストレージニーズに対応する Docker ボリュームの柔軟性と様々な使用例を紹介しました。



