はじめに
この実験では、docker volume prune コマンドに焦点を当て、Docker ボリュームを効果的に管理する方法を学びます。まず、名前付きボリュームやラベル付きボリュームなど、さまざまなタイプのボリュームを作成して調査し、それらの特性と Docker による管理方法を理解します。
その後、ボリュームを利用するコンテナを作成してから削除することで、コンテナでボリュームがどのように使用されるかを実演します。これにより、ボリュームに保存されたデータの永続性が明らかになります。最後に、この実験では docker volume prune コマンドを使用して未使用のボリュームを削除する方法を案内します。具体的には、匿名ボリュームの削除、すべての未使用ボリューム(名前付きボリュームを含む)の削除、およびラベルフィルタを使用したボリュームの選択的な削除について説明します。
いくつかのボリュームを作成して調査する
このステップでは、Docker ボリュームを作成して調査する方法を学びます。ボリュームは、Docker コンテナによって生成され、使用されるデータを永続化するための推奨方法です。バインドマウントはホストマシンのディレクトリ構造に依存しますが、ボリュームは Docker によって完全に管理されます。
まず、docker volume create コマンドを使用して名前付きボリュームを作成しましょう。このボリュームの名前を myvolume とします。
docker volume create myvolume
コンソールにボリュームの名前が表示され、作成が確認できます。
次に、docker volume inspect コマンドを使用して、先ほど作成したボリュームを調査しましょう。このコマンドは、ボリュームの名前、ドライバ、ホストマシン上のマウントポイントなど、ボリュームに関する詳細情報を提供します。
docker volume inspect myvolume
出力は、ボリュームに関する情報を含む JSON 配列になります。ボリュームのデータが保存されているホスト上の場所を示す "Mountpoint" フィールドを探してください。Docker がこの場所を管理しており、通常はこのディレクトリ内のファイルを直接変更することは避けるべきです。
次に、今度はラベル付きの別のボリュームを作成しましょう。ラベルは、Docker オブジェクトを整理してフィルタリングするのに便利です。labeled_volume という名前のボリュームを作成し、app=web というラベルを追加します。
docker volume create --label app=web labeled_volume
再び、作成に成功するとボリュームの名前が表示されます。
最後に、追加したラベルを確認するために labeled_volume を調査しましょう。
docker volume inspect labeled_volume
JSON 出力では、app=web ラベルを含む "Labels" フィールドが見つかるはずです。
ボリュームを使用したコンテナの作成と削除
このステップでは、Docker コンテナを作成し、前のステップで作成した myvolume をそれにアタッチします。これにより、コンテナが削除された後でもデータが永続化される仕組みを実演します。
まず、コンテナに使用する ubuntu イメージを取得しましょう。
docker pull ubuntu
このコマンドは、Docker Hub から ubuntu イメージをダウンロードします。
次に、ubuntu イメージに基づいてコンテナを実行し、myvolume をコンテナ内の /app ディレクトリにマウントします。また、マウントされたボリューム内のファイルにいくつかのデータを書き込むコマンドを実行します。
docker run -d --name mycontainer -v myvolume:/app ubuntu /bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30"
このコマンドを分解して説明します。
docker run: 新しいコンテナを実行するためのコマンドです。-d: このフラグは、コンテナをデタッチドモードで実行します。つまり、バックグラウンドで実行されます。--name mycontainer: これにより、コンテナにmycontainerという名前が割り当てられ、参照が容易になります。-v myvolume:/app: これがボリュームを使用するための重要な部分です。名前付きボリュームmyvolumeをコンテナ内の/appディレクトリにマウントします。ubuntu: コンテナに使用するイメージを指定します。/bin/bash -c "echo 'Hello from the container!' > /app/data.txt; sleep 30": これはコンテナ内で実行されるコマンドです。bashを使用して 2 つのコマンドを実行します。まず、「Hello from the container!」という文字列を/appディレクトリ(マウントされたボリューム)内のdata.txtというファイルに書き込み、次にコンテナを 30 秒間スリープさせて、しばらくの間実行状態を維持します。
docker ps コマンドを使用して、コンテナが実行中かどうかを確認できます。
docker ps
出力に mycontainer が「Up」の状態で表示されるはずです。
次に、コンテナを削除しましょう。コンテナを削除しても、ボリュームに書き込まれたデータは保持されるはずです。
docker rm -f mycontainer
-f フラグは、コンテナがまだ実行中であっても強制的に削除します。
データがボリュームに保持されていることを確認するために、新しいコンテナを実行して同じボリュームをマウントし、ファイルの内容を確認します。
docker run --rm -v myvolume:/app ubuntu cat /app/data.txt
このコマンドを分解して説明します。
docker run: 新しいコンテナを実行します。--rm: このフラグは、コンテナが終了すると自動的に削除します。-v myvolume:/app:myvolumeをこの新しいコンテナ内の/appにマウントします。ubuntu:ubuntuイメージを使用します。cat /app/data.txt: これはコンテナ内で実行されるコマンドです。catを使用して/appディレクトリにあるdata.txtファイルの内容を表示します。
コンソールに「Hello from the container!」と表示され、元のコンテナが削除された後もデータがボリュームに保持されていることが確認できます。
未使用の匿名ボリュームを削除する
このステップでは、使用されていない匿名ボリュームを削除する方法を学びます。匿名ボリュームは、コンテナにマウントする際にボリュームに明示的な名前を付けない場合に作成されます。通常、これらのボリュームは作成したコンテナが削除されると同時に削除されますが、場合によっては残ってしまうことがあります。削除操作(プルーニング)は、これらの未使用ボリュームをクリーンアップするのに役立ちます。
まず、匿名ボリュームを持つコンテナを作成しましょう。すぐに終了する単純なコンテナを実行します。
docker run --rm -v /data ubuntu ls /data
このコマンドを分解して説明します。
docker run: 新しいコンテナを実行します。--rm: このフラグは、コンテナが終了すると自動的に削除します。-v /data: これにより匿名ボリュームが作成され、コンテナ内の/dataディレクトリにマウントされます。コロンの前に名前を指定していないため、Docker はボリュームにランダムな名前を生成します。ubuntu:ubuntuイメージを使用します。ls /data: コンテナ内で実行されるコマンドで、/dataディレクトリの内容を一覧表示します。
--rm フラグによりコンテナは削除されますが、Docker によって明示的にクリーンアップされない場合、匿名ボリュームはまだ存在する可能性があります。
匿名ボリュームを含むすべてのボリュームを表示するには、docker volume ls コマンドを使用できます。
docker volume ls
前のステップで作成した myvolume と labeled_volume が表示され、長くランダムな名前のボリュームが 1 つ以上表示されることがあります。これらが匿名ボリュームです。
次に、docker volume prune コマンドを使用して、使用されていない匿名ボリュームを削除しましょう。デフォルトでは、このコマンドは現在どのコンテナにも使用されていない匿名ボリュームのみを削除します。
docker volume prune
Docker は操作を進める前に確認を求めます。y と入力して Enter キーを押してください。
出力には、どのボリュームが削除されたかが表示されます。使用されていない匿名ボリュームが削除されているはずです。
匿名ボリュームが削除されたことを確認するために、再度ボリュームを一覧表示しましょう。
docker volume ls
これで、リストには名前付きボリューム(myvolume と labeled_volume)のみが表示されるはずです。
名前付きボリュームを含むすべての未使用ボリュームを削除する
前のステップでは、未使用の匿名ボリュームを削除しました。このステップでは、現在どのコンテナにもアタッチされていない名前付きボリュームを含む、すべての未使用ボリュームを削除する方法を学びます。
まず、既存のボリュームを一覧表示して、どのボリュームがあるかを確認しましょう。
docker volume ls
myvolume と labeled_volume がリストに表示されるはずです。これらは名前付きボリュームであり、デフォルトの docker volume prune コマンドでは削除されませんでした。なぜなら、これらは名前付きボリュームだからです。
名前付きボリュームを含むすべての未使用ボリュームを削除するには、docker volume prune コマンドに --all または -a フラグを使用する必要があります。
docker volume prune --all
Docker は再び確認を求めます。y と入力して Enter キーを押してください。
出力には、どのボリュームが削除されるかが表示されます。myvolume と labeled_volume は現在どのコンテナにも使用されていないため、削除されます。
すべての未使用ボリュームが削除されたことを確認するために、再度ボリュームを一覧表示しましょう。
docker volume ls
これで、空のリストが表示されるはずです。これは、匿名ボリュームと名前付きボリュームを含むすべての未使用ボリュームが削除されたことを示しています。
ラベルフィルタを使用してボリュームを削除する
この最後のステップでは、ラベルに基づいてボリュームを削除する方法を学びます。これは、特定の条件に一致するボリュームを選択的に削除し、他のボリュームに影響を与えない強力な方法です。
まず、異なるラベルを持ついくつかの新しいボリュームを作成して、フィルタリングの対象を用意しましょう。
docker volume create --label env=dev dev_volume
docker volume create --label env=prod prod_volume
docker volume create --label type=data data_volume
3 つの新しいボリュームを作成しました。env=dev ラベルの dev_volume、env=prod ラベルの prod_volume、および type=data ラベルの data_volume です。
新しく作成されたボリュームを確認するために、ボリュームを一覧表示しましょう。
docker volume ls
リストに dev_volume、prod_volume、および data_volume が表示されるはずです。
次に、env=dev ラベルを持つボリュームのみを削除しましょう。--filter フラグと label キーを使用できます。
docker volume prune --filter label=env=dev
Docker は確認を求めます。y と入力して Enter キーを押してください。
出力には、dev_volume が削除されたことが表示されます。
dev_volume のみが削除されたことを確認するために、再度ボリュームを一覧表示しましょう。
docker volume ls
これで、prod_volume と data_volume が残っていることが表示されるはずです。
存在しないラベルでもフィルタリングできます。たとえば、type=data ラベルを持たないボリュームを削除しましょう。
docker volume prune --filter label!=type=data
Docker は確認を求めます。y と入力して Enter キーを押してください。
出力には、prod_volume が削除されたことが表示されます。
最後に、残っているボリュームを確認するために、ボリュームを一覧表示しましょう。
docker volume ls
これで、data_volume のみが残っていることが表示されるはずです。
これは、必要に応じてラベルフィルタを使用してボリュームを選択的に削除できることを示しています。
まとめ
この実験では、コンテナのデータを永続化するための推奨方法である Docker ボリュームの管理方法を学びました。まず、docker volume create と docker volume inspect を使用して、名前付きボリュームとラベル付きボリュームの作成と調査を行いました。これにより、ボリュームがどのように作成され、そのマウントポイントや関連するラベルなどの詳細を確認することができました。
続いて、名前付きボリュームを利用するコンテナを作成し、その後コンテナを削除することで、データの永続性を実証しました。これにより、コンテナを削除してもボリュームとそのデータが保持されることが明らかになりました。最後に、docker volume prune コマンドを調べ、デフォルトで未使用の匿名ボリュームを削除する方法、--all フラグを使用してすべての未使用ボリューム(名前付きボリュームを含む)を削除する方法、および --filter オプションを使用してラベルに基づいてボリュームを選択的に削除する方法を学びました。これらの手順により、未使用のボリュームをクリーンアップしてディスクスペースを解放する実践的な経験を得ることができました。



