DUICUO

Docker prune コマンドを使用して、ディスク データを定期的にクリーンアップします。

Dockerはオープンソースソフトウェアであり、開発者はアプリケーションを「コンテナ」にパッケージ化し、異なるオペレーティングシステムや環境に迅速かつ容易にデプロイすることができます。この柔軟性により、Dockerは開発者にとって最適なツールの一つとなっています。しかし、時間の経過とともに、特に本番環境では、Dockerコンテナとイメージがかなりのディスク容量を消費する可能性があります。ディスク容量を解放するために、この記事では、使用されていないDocker関連データを削除する方法について説明します。

まず、docker system コマンドを見てみましょう。

Docker システム コマンドには現在 4 つのサブコマンドがあります。

 docker system df docker system events docker system info docker system prune

Docker システムで最も重要なコマンドの 1 つは、イメージ データや停止したコンテナなどの未使用データをクリーンアップする `docker system prune` コマンドです。

Docker システムのヘルプを表示します:

 [root@localhost ~]# docker system --help Usage: docker system COMMAND Manage Docker Options: --help Print usage Commands: df Show docker disk usage events Get real time events from the server info Display system-wide information prune Remove unused data Run 'docker system COMMAND --help' for more information on a command.

docker システム df

イメージ、コンテナ、(ローカル)ボリュームを含むDocker全体のディスク使用量の概要を提供します。これにより、Dockerが使用しているリソースの量をいつでも確認できるようになりました。

 [root@localhost ~]# docker system df TYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 10 6 2.652GB 1.953GB (73%) Containers 6 6 6.922MB 0B (0%) Local Volumes 0 0 0B 0B

docker システムのプルーン

以前のコマンドでDockerが過剰なスペースを消費していることがわかった場合は、クリーンアップを開始します。これをワンストップで実行できるコマンドがあります。

 [root@localhost ~]# docker system prune WARNING! This will remove: - all stopped containers # 清理停止的容器- all networks not used by at least one container #清理没有使用的网络- all dangling images #清理废弃的镜像- all build cache #清理构建缓存Are you sure you want to continue? [y/N] y Total reclaimed space: 0B

警告メッセージによると、このコマンドはシャットダウン中のコンテナとdanglingイメージをすべて削除します。例では、1GBのランダムファイル3つを含むイメージの名前が既に使用されているため、danglingイメージとして削除されます。また、中間イメージもすべて削除されます。

さらに、-a オプションを使用すると、徹底的なクリーニングが可能になります。この時点で、さらに深刻な警告メッセージが表示されます。

 $ docker system prune -a WARNING! This will remove: - all stopped containers - all volumes not used by at least one container - all networks not used by at least one container - all images without at least one container associated to them Are you sure you want to continue? [y/N] y Deleted Images: untagged: test:latest deleted: sha256:c515ebfa2... deleted: sha256:07302c011... deleted: sha256:37c0c6474... deleted: sha256:5cc2b6bc4... deleted: sha256:b283b9c35... deleted: sha256:8a8b9bd8b... untagged: alpine:latest untagged: alpine@sha256:58e1a1bb75db1... deleted: sha256:4a415e366... deleted: sha256:23b9c7b43... Total reclaimed space: 2.151GB

このコマンドはシステム全体をクリーンアップし、実際に使用されているイメージ、コンテナ、データボリューム、ネットワークのみを残すため、細心の注意が必要です。例えば、バックアップやロールバックなどに使われるバックアップイメージが必要になる場合があり、これらのイメージを削除するとコンテナの実行時に再度ダウンロードが必要になるため、本番環境では「prune -a」コマンドを実行できません。

この時点で、どのコンテナにもバインドされていないすべてのイメージが削除されます。最初の「prune」コマンドですべてのコンテナが削除されたため、どのコンテナにもバインドされていないすべてのイメージも削除されます。

none オブジェクトをクリーンアップするにはどうすればよいでしょうか?

Docker は、イメージ、コンテナ、ボリューム、ネットワークなどの未使用のオブジェクト (多くの場合、「ガベージ コレクション」と呼ばれます) をクリーンアップするための保守的なアプローチを採用しています。

これらのオブジェクトは通常、Docker に明示的に削除指示がない限り削除されません。これにより、Docker が追加のディスク容量を使用する可能性があります。

Docker は、オブジェクトの種類ごとに prune コマンドを提供します。

さらに、docker system prune コマンドを使用して、複数のオブジェクトタイプを一度にクリーンアップすることもできます。このトピックでは、これらの prune コマンドの使い方を説明します。

トリムミラー

none イメージ (ぶら下がっているイメージ) をクリーンアップします。

コマンド: docker image prune

デフォルトでは、`docker image prune` コマンドは仮想イメージ (タグ付けされておらず、他のイメージから参照されていないイメージ) のみを削除します。

 root@instance-o70no2nw:~# docker image prune WARNING! This will remove all dangling images. Are you sure you want to continue? [y/N] y Total reclaimed space: 0B

コンテナで使用されていないイメージをクリーンアップする

コマンド: docker image prune -a

デフォルトでは、システムは続行を促すプロンプトを表示します。プロンプトをバイパスするには、-f または --force フラグを使用してください。

`--filter` フラグをフィルター式と組み合わせて使用​​することで、トリミングする画像を制限できます。例えば、24時間以上前に作成された画像のみを対象とする場合は、次のようにします。

 $ docker image prune -a --filter "until=24h"

トリミングコンテナ

コンテナを停止しても、起動時に `--rm` フラグが指定されていない限り、コンテナは自動的に削除されません。`docker ps -a` コマンドを使用すると、停止中のコンテナも含め、Docker ホスト上のすべてのコンテナが表示されます。特に開発環境では、コンテナの多さに驚くかもしれません。停止したコンテナの書き込み可能なレイヤーは、依然としてディスク領域を占有しています。これらをクリーンアップするには、`docker container prune` コマンドを使用します。

 $ docker container prune WARNING! This will remove all stopped containers. Are you sure you want to continue? [y/N] y

デフォルトでは、システムは続行を促すプロンプトを表示します。プロンプトをバイパスするには、-f または --force フラグを使用してください。

デフォルトでは、停止中のコンテナはすべて削除されます。`--filter` フラグを使用すると、対象範囲を絞り込むことができます。例えば、次のコマンドは、24時間以上前に作成された停止中のコンテナのみを削除します。

トリミングロール

ボリュームは1つ以上のコンテナで使用でき、Dockerホスト上のスペースを占有します。ボリュームは自動的に削除されることはありません。削除するとデータが破損する可能性があるためです。

 $ docker volume prune WARNING! This will remove all volumes not used by at least one container. Are you sure you want to continue? [y/N] y

剪定ネットワーク

Dockerネットワークはディスク容量をあまり消費しませんが、iptablesルール、ブリッジネットワークデバイス、ルーティングテーブルエントリを作成します。これらをクリーンアップするには、「docker network prune」コマンドを使用して、コンテナで使用されていないネットワークを削除します。

 $ docker network prune

すべてをトリミングする

`docker system prune` コマンドは、イメージ、コンテナ、ネットワークをプルーニングするためのショートカットです。Docker 17.06.0 以前では、ボリュームをプルーニングできました。Docker 17.06.1 以降では、`docker system prune` コマンドでボリュームをプルーニングするには、`--volumes` フラグを明示的に指定する必要があります。

 $ docker system prune WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all dangling images - all build cache Are you sure you want to continue? [y/N] y

Docker 17.06.1 以降を使用しており、ボリュームをトリミングする場合は、--volumes フラグを使用します。

 $ docker system prune --volumes WARNING! This will remove: - all stopped containers - all networks not used by at least one container - all volumes not used by at least one container - all dangling images - all build cache Are you sure you want to continue? [y/N] y

通常は、スケジュールされたタスクを削除するだけで済みます。

たとえば、私のシナリオでは、イメージが大量のディスク領域を占有するため、定期的にイメージを削除するタスクをスケジュールします。

毎日午前 1 時に、過去 72 時間以内に使用されていないすべてのミラーを削除します。

 [root@develop-server]# crontab -e 0 1 * * * docker image prune -a --force --filter "until=72h"

docker システム情報 (docker info)

このコマンドの略語である docker info は、おそらく皆さんもよくご存知でしょう。

 [root@localhost ~]# docker system info Containers: 6 Running: 6 Paused: 0 Stopped: 0 Images: 49 Server Version: 17.06.2-ce Storage Driver: overlay Backing Filesystem: xfs Supports d_type: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 6e23458c129b551d5c9871e5174f6b1b7f6d1170 runc version: 810190ceaa507aa2727d7ae6f4790c76ec150bd2 init version: 949e6fa Security Options: seccomp Profile: default Kernel Version: 3.10.0-514.26.2.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 24 Total Memory: 31.21GiB Name: localhost.localdomain ID: YTL2:6RWX:IZK6:X4XC:XKMO:WVXD:LXPR:E5GN:GEJB:WIUX:L5YH:PDFB Docker Root Dir: /var/lib/docker Debug Mode (client): false Debug Mode (server): false Registry: https://index.docker.io/v1/ Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: http://9zkjjecg.mirror.aliyuncs.com/ https://docker.mirrors.ustc.edu.cn/ Live Restore Enabled: false