docker volume create コマンドを使ってデータを管理する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、docker volume create コマンドを使用して Docker でデータの永続化を効果的に管理する方法を学びます。基本的なボリュームの作成の基本プロセスを探索します。ボリュームは、Docker によって管理される性質と、バインドマウントと比較してバックアップや移行が容易であるため、コンテナデータを保存するための推奨方法です。

基本的な内容を理解したら、特定のドライバとオプションを使用してボリュームを作成し、その動作をカスタマイズする方法を学びます。さらに、この実験では、カスタムマウントオプションを使用してローカルボリュームを作成する手順を案内し、NFS を活用してローカルボリュームを作成する方法を実演します。これにより、さまざまなデータストレージシナリオに柔軟に対応できます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/volume("Manage Volumes") subgraph Lab Skills docker/exec -.-> lab-555258{{"docker volume create コマンドを使ってデータを管理する方法"}} docker/inspect -.-> lab-555258{{"docker volume create コマンドを使ってデータを管理する方法"}} docker/create -.-> lab-555258{{"docker volume create コマンドを使ってデータを管理する方法"}} docker/pull -.-> lab-555258{{"docker volume create コマンドを使ってデータを管理する方法"}} docker/volume -.-> lab-555258{{"docker volume create コマンドを使ってデータを管理する方法"}} end

基本的なボリュームの作成

このステップでは、基本的な 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:/appmyvolume という名前のボリュームをコンテナ内の /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 ドライバは、ファイルシステムの種類、マウントするデバイス、およびマウントオプションをそれぞれ指定するための typedeviceo などのオプションをサポートしています。

local ドライバを使用して myvolume2 という名前のボリュームを作成し、いくつかのオプションを指定しましょう。この例では、データをメモリに保存する tmpfs ファイルシステムの種類を使用します。これは、ホストの再起動後にデータを保持する必要のない一時的なデータに便利です。

docker volume create --driver local --opt type=tmpfs --opt device=tmpfs --opt o=size=100m myvolume2

このコマンドを分解して説明します。

  • docker volume create:ボリュームを作成するコマンドです。
  • --driver locallocal ボリュームドライバを明示的に指定します。
  • --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=tmpfsdevice=tmpfso=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 はコンテナを実行し続けるために使用されます。

myvolume2tmpfs ボリュームであるため、コンテナ内の /data に書き込まれたすべてのデータはメモリに保存され、コンテナが停止および削除された後、またはホストが再起動された後には保持されません。

コンテナを停止して削除しましょう。

docker stop mycontainer2
docker rm mycontainer2

ボリューム myvolume2 はまだ存在しますが、その内容(書き込まれた場合)は tmpfs ボリュームであるため失われます。

マウントオプションを指定したローカルボリュームの作成

このステップでは、ローカルの Docker ボリュームを作成し、マウントオプションを指定する方法を学びます。マウントオプションを使用すると、ファイルシステムのマウント方法を制御できます。たとえば、パーミッションの設定、特定の機能の有効化、またはパフォーマンスの最適化などが可能です。

myvolume3 という名前のローカルボリュームを作成し、o オプションを使用してマウントオプションを指定します。この例では、uidgid オプションを設定して、コンテナによってボリューム内に作成されたファイルがホスト上の特定のユーザーとグループによって所有されるようにします。これは、コンテナとホスト間でデータを共有する際のパーミッション管理に役立ちます。

まず、ボリュームのソースとして使用するディレクトリをホスト上に作成しましょう。標準的なローカルボリュームではこれは必ずしも必要ありませんが、マウントオプションが基になるファイルシステムにどのように影響するかを説明するのに役立ちます。

mkdir -p ~/project/myvolumedata

次に、local ドライバを使用して myvolume3 ボリュームを作成し、uidgid を指定した o オプションを設定します。現在の labex ユーザーのユーザー ID とグループ ID を使用します。id -uid -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 locallocal ボリュームドライバを指定します。
  • --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

出力では、DriverlocalOptionstype=nonedevice=/home/labex/project/myvolumedata、および o=bind,uid=...,gid=...(あなたのユーザー ID とグループ ID が表示されます)が含まれているはずです。Mountpointdevice のパスと同じになります。

次に、コンテナを実行し、このボリュームをアタッチします。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

ボリュームを作成する際に指定した uidgid マウントオプションのおかげで、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

出力では、DriverlocalOptionstype=nfsdevice=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 ボリュームの柔軟性と様々な使用例を紹介しました。