Docker Prune: 実践例を交えた完全ガイド

毎日Dockerを使っていると、どれだけ迅速にディスクスペースを消費するかを知っています。

時間が経つにつれて、システムには未使用のイメージ、コンテナ、ボリューム、ネットワークが蓄積されます。これらは主にアイドル状態で、貴重なストレージを占有し、現在のプロジェクトに取り組むことを妨げる可能性があります。幸いなことに、Dockerは不要なリソースを簡単に削除するための組み込みのクリーンアップコマンドを提供しています。

これらのクリーンアップコマンドはdocker pruneファミリーの一部であり、今日はそれらについてすべて学びます。これらはすぐにディスクスペースを解放するための頼りになる解決策となるでしょう。

簡単な概要から始めて、実践的な例に進みましょう。

Docker初心者ですか?データプロフェッショナル向けにDockerをゼロから学ぶためのガイドをご覧ください。速やかに理解を深めることができます。

Docker Pruneとは何ですか?

「Docker Prune」という用語は、未使用や不要なDockerリソースを削除するのに役立つ一連のコマンドを指します。

特に複数のプロジェクトで作業している場合、数えきれないほどのイメージ、コンテナの実行、ボリュームやネットワークの設定が作成されます。これらはすべてシステム上に蓄積され、かなりのディスク容量を占有します。docker pruneの目的は、その混乱を片付け、ストレージを回収することです。

そうは言っても、docker pruneには見えない部分がもっとあります。

これは単に実行できる一つのコマンドではありません。まあ、実行することはできますが、時には詳細な制御が必要になることがあります。そこでこの記事が役立ちます。この記事では、プルーニングを効果的に管理し、意図したものだけを削除する方法と、重要なデータを誤って削除しないように安全な環境で練習する方法を紹介します。

プルーンコマンドは現在使用中ではないリソースのみを削除することに注意する価値があります。実行中のコンテナによって参照されているイメージ、ボリューム、およびネットワークは削除されません。言い換えれば、プルーニングはアクティブなワークロードに干渉しません。

次のセクションでは、さまざまな種類のプルーンコマンドについて説明し、それらがあなたのワークフローにどのように適合するかを説明します。

Dockerを履歴書やポートフォリオに追加したいですか?これらの10のDockerプロジェクトアイデアがあなたを仕事-readyにします。

すべてのDockerプルーンコマンドとハンズオンの例

Dockerは、使用していないリソースを個別にまたは一括でクリーンアップするための複数のpruneコマンドを提供します。このセクションでは、それらについて理論的な説明と実践的な例を通じて学びます。理論および実践的な例

docker system prune

これは、ディスクスペースを取り戻すための最も包括的なコマンドです。未使用のすべてのコンテナ、ネットワーク、イメージ、およびビルドキャッシュを一括で削除します。

ディスクスペースを解放するための迅速な方法を探しているなら、これがそのコマンドです。

docker system pruneコマンドにオプションを渡すことができます:

  • -aまたは--allは、ダングリングなイメージ(タグ付けされていないか、コンテナによって参照されていないイメージ)だけでなく、すべての未使用イメージを削除します。
  • --filterを使用すると、フィルター値を指定できます。
  • -fまたは--forceは、確認プロンプトをスキップします。
  • --volumesは、コンテナ、ネットワーク、イメージ、およびビルドキャッシュと一緒に匿名ボリュームも削除します。

docker system pruneはデフォルトで確認を求めるので、潜在的に破壊的な操作です:

イメージ1 – Dockerシステムプルーン確認プロンプト

プロンプトをバイパスして、未使用のイメージ、コンテナ、ネットワーク、ボリュームをすべて1つのコマンドで削除するには、次のコマンドを実行します:

docker system prune -a -f --volumes

画像2 – 1つのdocker system pruneコマンドですべてを削除

しかし、もっと細かい制御が必要な場合はどうするのか?次にその方法を説明します。

docker container prune

要するに、このコマンドはすべての停止したコンテナを削除します。

停止したコンテナは手動で削除されるまでシステムに残ります。ディスク容量を占有し、Docker Desktop Dashboardなどのツールを使用しない限り見つけにくい場合があります。

docker system pruneと同様に、このコマンドはオプションをサポートしています:

  • --filterを使用すると、削除されるコンテナを制御するためのキーと値を指定できます。
  • -fまたは--forceは確認プロンプトをスキップします。

非実行コンテナのリストです:

画像3 – 非実行コンテナのリスト

code-server(および他の停止したコンテナ)を削除するには、次のコマンドを実行してください:

docker container prune -f

これにより確認のプロンプトは表示されず、数秒以内に次のような出力が表示されます:

画像4 – コンテナのプルーニング出力メッセージ

こうして、停止したコンテナはもうありません:

画像 5 – 実行中でないコンテナのリスト (2)

次に、未使用のイメージを処理しましょう。

docker image prune

前のコマンドと同様に、docker image pruneは未使用のイメージを削除します。

デフォルトでは、ダングリングイメージのみを削除します—タグ付けされておらず、コンテナに関連付けられていないイメージです。オプションのフラグを使用すると、ダングリングイメージだけでなく、すべての未使用のイメージを削除できます。

利用可能なオプションのリストは以下の通りです

  • -a または --all は、ダングリングイメージだけでなくすべての未使用のイメージを削除します。
  • --filterを使用して、削除する画像を制御するキーと値のペアを指定できます。
  • -fまたは--forceを使用すると、確認プロンプトがスキップされます。

さて、実際に見てみましょう!

現在システムにある画像の一覧です:

Image 6 – Dockerイメージの一覧

すべてを1つのコマンドで削除するには、次のコマンドを実行します:

docker image prune -a -f

ターミナルに次のような出力が表示されます:

画像 7 – 画像のプルーニング出力メッセージ

その後、Docker Desktopには画像が残りません:

画像 8 – Dockerイメージのリスト (2)

次に、未使用のボリュームを処理しましょう。

docker volume prune

名前が示す通り、docker volume pruneコマンドは、すべての未使用のローカルボリュームを削除します。言い換えれば、いかなるコンテナからも参照されていないボリュームを削除します。

デフォルトでは、このコマンドはのみを削除します匿名ボリューム – コンテナが起動する際にDockerによって作成される名前のないボリュームです。明示的に名前が付けられたボリュームを削除するには、追加のオプションを渡す必要があります。

利用可能なオプションは以下の通りです:

  • -a または --all は、匿名ボリュームだけでなく、すべての未使用ボリュームを削除します。
  • --filter を使用すると、削除されるボリュームを制御するためのキーと値のペアを指定できます。
  • -fまたは--forceは確認プロンプトをスキップします。

当社のシステムでは、docker-compose.ymlファイルから単一のユーザー作成ボリュームがあります:

画像9 – Dockerボリュームのリスト

次のコマンドはすべてのローカルボリュームを削除します:

docker volume prune -a -f

実行した後、次のような出力が表示されます:

画像10 – ボリュームの剪定出力メッセージ

今、ボリュームは残っていません:

画像11 – Dockerボリュームのリスト(2)

最後に、未使用のネットワークを削除する方法を見てみましょう。

docker network prune

Dockerコンテナが互いに通信するとき、彼らはよくユーザー定義のネットワークを使用します。しかし、それらのコンテナが削除された後も、通常そのネットワークがシステムに残っています。

docker network pruneコマンドは、もはやどのコンテナにも使用されていないネットワークを削除します。

他のプルーンコマンドと同様に、いくつかのオプションが含まれています:

  • --filterは、どのネットワークを削除するかを制御するためにキーとバリューのペアを指定することができます。
  • -fまたは--forceは、確認プロンプトをスキップします。

イメージやコンテナ、ボリュームとは異なり、Docker Desktopを通じてネットワークを視覚的に確認することはできませんので、コマンドラインから作業する必要があります。利用可能なネットワークのリストは以下の通りです:

イメージ12 – Dockerネットワークのリスト

デフォルトのDockerインストールに関連付けられていないすべてのネットワークを削除するには、次のコマンドを実行します:

docker network prune -a -f

コマンドを実行した後、次のような出力が表示されます:

イメージ13 – ネットワークの剪定出力メッセージ

以前に実行されていたコンテナに関連付けられていたネットワークはすべて削除されました:

イメージ14 – Dockerネットワークのリスト

ただし、残りの3つのネットワークはDockerが正常に機能するために不可欠であり、削除することはできません。

これで、docker pruneコマンドの基本的な使用法は終了です! 次に、これらのコマンドを安全に使用する方法や、運用環境や重要な環境におけるベストプラクティスなどの高度なトピックを取り上げます。

Docker Pruneを安全に使用する  

docker pruneコマンドはディスクスペースを迅速に回収するのに役立ちますが、特に運用環境では注意して使用する必要があります

重要なコンテナ、イメージ、またはボリュームを誤って削除すると、データが失われ、重要なワークフローが混乱する可能性があります。これを防ぐためには、prune コマンドを実行する前に削除されるものを理解することが最善です。

このセクションでは、docker prune を安全に実行する際に注意すべき重要な点について説明します。

削除されるものを理解する

prune コマンドは、現在使用されていないリソースのみを削除するように設計されています。

例えば、docker image pruneはダングリングイメージのみを削除し、docker volume pruneはどのコンテナにも接続されていないボリュームのみを削除します。ただし、-a -fのようなオプションを追加すると、確認なしにすべてのイメージやボリュームが削除されます。  

さらに、複雑な環境では依存関係を見落としやすいため、プルーニングの前にダブルチェックすることは常に良い習慣です。  

任意のpruneコマンドを実行する前に、システムを調査して、現在使用中のリソースを確認する必要があります。これを行う方法はいくつかあり、このセクションでは最も一般的な方法を探ります。

次のコマンドを使用して、停止したコンテナを含むすべてのコンテナを表示します:  

docker ps -a

このような出力が表示されるはずです:

イメージ15 – すべてのDockerコンテナのリスト

同様に、このコマンドを使用して未使用のものを含むすべてのイメージをリストアップします:

docker images

上記のように構造化された出力になります:

イメージ16 – すべてのDockerイメージのリスト

ボリュームを確認するには、このコマンドを実行してすべてのボリュームをリストします:  

docker volume ls

画像17 – すべてのDockerボリュームのリスト

これらの出力を注意深く確認して、重要なリソースが誤って削除されないようにしてください。  

安全のためのドライラン  

残念ながら、Dockerは依然としてプルーニングコマンドのドライランのための組み込みオプションを持っていませんs、数年前に要求されたにもかかわらず

このため、プルーンコマンドを実行する前に、前のセクションにリストされているコマンドを使用してリソースを手動で検査する必要があります。

データの永続性が重要な機密環境で作業している場合は、ボリュームに影響を与えるプルーンコマンドを実行する前に、常にバックアップを作成する必要があります。

もちろん、これらは予防措置ですが、近々ドライランオプションが実装されることを期待しています。

Docker Pruneのベストプラクティス  

不要なクラスターを排除するために、pruneコマンドを定期的に実行することが重要です。自動化することも検討してください。  

このセクションでは、本番環境でのdocker pruneコマンドの実行に関するベストプラクティスを説明します。  

定期的にdocker pruneを使用する  

時間が経つにつれて、Dockerは未使用のイメージ、停止したコンテナ、不要なボリュームを蓄積します。これらはすべて、かなりのディスクスペースを消費します。  

定期的に剪定コマンドを実行することで、環境を清潔に保ち、過剰なディスク使用を防ぎます。これらをメンテナンススケジュールの一部として含めるべきです。 

数週間ごとに実行することが良いスタート地点ですが、コンテナの頻繁な作成と削除が含まれる場合は、より頻繁なスケジュールを検討してください。 

製品には注意してください 

製品環境での作業には追加の注意が必要であり、Dockerの剪定も例外ではありません。 

注意力が途切れると、停止時間やデータ損失が発生する可能性があります。そのような責任を負いたくないでしょう。本番環境でdocker pruneコマンドを実行する前に、常に前のセクションで説明したようにdocker ps -adocker imagesdocker volume lsを使用してシステムリソースを検査してください。

さらに、全体を含むdocker system pruneではなく、特定のプルーニングコマンドを使用することが良い考えです。予期せぬ削除から回復するのがより簡単になるかもしれません。

docker pruneを自動化する

さらに、スケジュールされたタスクを使用してdocker pruneコマンドを自動化することで、クリーンアップ作業を効率化するのも良い慣行です。

Linuxでは、定期的な間隔でコマンドを実行するcronジョブを設定できますが、Windowsでは同様の自動化にタスクスケジューラーを使用できます。これにより、手動介入なしでシステムを整頓するのに役立ちます。ただし、本番環境では自動的な整理が重要なワークロードに干渉しないように注意してください。

たとえば、このLinuxのcronジョブは毎週日曜日の深夜に包括的な整理コマンドを実行します:

0 0 * * 0 docker system prune -a -f

Docker Pruneの問題のトラブルシューティング

docker prune」コマンドはディスクスペースを回収するための定番の解決策ですが、新しいイメージをプルしたり新しいコンテナを実行するために十分なスペースを確保するには、必ずしも十分ではないかもしれません。

さらに、重要なリソースを誤って削除してしまう可能性があるため、復旧戦略について話し合うことが重要です。

このセクションでは、両方のトピックについて説明します。

ディスクスペースの問題に直面すること  

Dockerイメージは大きくなることがあります—最近、私たちは13GBを超えるものを持っていました—そして、もっと大きなものもあると確信しています。そのため、「docker prune」を実行した後でも、システムのディスクスペースが依然として不足していることに気づくかもしれません。

スペースの使用状況を確認するには画像、コンテナ、ボリュームがどれだけのスペースを使用しているかを正確に確認するには、次のコマンドを実行します:

docker system df

画像 18 – Dockerによる使用スペース

docker pruneコマンドでディスクスペースを回収する際は、-aフラグを追加して、すべての画像、ボリューム、またはコンテナを削除します – ただし、ダングリングまたは匿名のものだけではありません。このアプローチの潜在的な欠点も考慮してください。

ディスク容量の問題が解決しない場合、利用可能なディスク容量を増やすしかありません。

誤って削除したデータの回復

回復は簡単に言うことができますが、実際のコマンドを実行する前にどのデータが削除されるかを理解することをお勧めします。

それでも、重要なコンテナ、イメージ、またはボリュームを誤って削除してしまった状況に陥った場合は、まずログをチェックして削除されたものを特定してください。

macOSでは、次の2つのコマンドを実行することでこれが実行できます(WindowsおよびLinuxのオプション):  

pred='process matches ".*(ocker|vpnkit).*" || (process in {"taskgated-helper", "launchservicesd", "kernel"} && eventMessage contains[c] "docker")' /usr/bin/log stream --style syslog --level=debug --color=always --predicate "$pred" /usr/bin/log show --debug --info --style syslog --last 30m --predicate "$pred" >/tmp/logs.txt

これらのコマンドを実行すると、Docker関連の直近30分間のログが/tmp/logs.txtに保存されます。これらのログを検査して、削除されたコンテナやイメージを特定する必要があります。

削除されたイメージについては、おそらくDocker Hubのようなレジストリから再度取得できるでしょう。次のようなコマンドが役立つはずです:

docker pull <image_name>

そして、削除されたコンテナについては、それらが永続イメージに基づいている場合は常に再作成できます:

docker run --name <container_name> <image_name>

または、利用可能な場合はバックアップから復元することもでき、ボリュームとコンテナデータの両方を回復するために使用できます。将来的には、データ損失を防ぐためにボリュームスナップショット用のツールを使用することを検討してください。

ただし、最善の戦略は、削除されるリソースを検査してから剪定コマンドを実行し、あなたのワークフローに影響を与えないことを絶対に確信した場合のみ続行することです。

ドッカーの剪定のまとめ

最後に、docker pruneコマンドファミリーは、ディスクスペースを回収する強力な方法ですが、必要なリソースを誤って削除するリスクがあり、データ損失を引き起こす可能性があります。オプションの-a -fフラグを使用すると、すべてを強制的に削除するため、このリスクはさらに高まります。

それでも、剪定はシステムを清潔で整然とした状態に保つための主要な方法となります。

特に本番環境では注意が必要です。docker ps -adocker images、およびdocker volume lsなどのコマンドを使用して、全てのコンテナ、イメージ、およびボリュームをリストアップしてから剪定を実行してください。削除するリソースに問題がないことを確認した後に、(実行中のコンテナで使用されていないと仮定して)剪定コマンドを実行してください。

Docker、コンテナ化、およびコンテナオーケストレーションについて詳しく学びたい場合は、DataCampの以下のコースをチェックしてください:

Source:
https://www.datacamp.com/tutorial/docker-prune