Dockerはソフトウェアのコンテナ化技術で、デスクトップからクラウドまで、様々なプラットフォームでアプリケーションを開発・デプロイするのに役立ちます。

Dockerコンテナ内でアプリケーションを構築するのに必要になるソースコード、依存関係、ツールのスナップショット(またはブループリント)は、「イメージ」と呼ばれます。また、永続的なデータを必要とするDockerアプリケーションは、基盤となるオペレーティングシステムから独立した「ボリューム」と呼ばれるストレージに依存します。

Dockerを使用する際は、このイメージ、ボリューム、そしてコンテナを効率的に整理することが重要です。これらのアセットの未使用分は蓄積され、貴重なディスク容量を占有し、最終的にはシステムのパフォーマンスに影響を与えかねません。

この記事では、個別または一括でイメージ、ボリューム、コンテナを削除し、システムの整理整頓を行う方法について掘り下げます。dockerコマンドラインインターフェース(CLI)を使用して、不要なものは効率的に削除していきましょう。

Dockerイメージを削除する方法

Dockerでクリーンで整理されたシステムを維持するには、古いまたは不要なイメージを削除することは不可欠。CLIを使って特定のイメージを削除する方法を見ていきます。

まずは、docker image lsコマンドでDocker環境のイメージを確認します。

$ docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED              SIZE
my_image         latest    2cbc27836df4   60 seconds ago       7.05MB
<none>           <none>    85b412789704   2 days ago           7.05MB
demo             latest    26d80cd96d69   15 months ago        28.5MB

上のイメージには、「my_image」と「demo」という名前のイメージがあり、どちらにも「latest」タグが付いているのがわかります。3つ目のイメージには名前もタグもありません。これは現在コンテナで使用されていない「ぶら下がり」イメージで、「my_image」を再構築した結果生じたものです(これはよくあるパターン)。以前のバージョンのイメージが、現在使用されていないにもかかわらず、ファイルシステム上に残っています。

また上記には、各イメージの64文字のIDの最初の12文字、作成日、およびイメージが消費しているストレージ容量も表示されます。

未使用イメージの削除

「ぶら下がった」イメージであることを示す名前もタグもないイメージが、使用中であることもあり得ます。例えば、IDを参照してコンテナを起動するために使用されたかもしれません。

本当にぶら下がっているイメージをすべて安全に削除するには、docker image pruneコマンドを実行します。

$ docker image prune

WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y

Deleted Images:
deleted: sha256:85b412789704c17e9c5e7edc97b2f64c748bbdae7eaa44d3fe2cc21a87acad3d

Total reclaimed space: 7.05MB

削除されたかを確認するために、もう一度イメージを表示してみます。

$ docker image ls
REPOSITORY       TAG       IMAGE ID       CREATED              SIZE
my_image         latest    2cbc27836df4   70 seconds ago       7.05MB
demo             latest    26d80cd96d69   15 months ago        28.5MB

このとおり、3行目にあった名前もタグもないイメージが消えているのがわかります。

名前を指定してイメージを削除する

イメージの名前を指定して個別に削除することも可能です。

$ docker image rm <image_name>

注意)使用中のイメージを削除するには、イメージを使用している実行中のコンテナを停止または削除しなければなりません。通常は推奨されませんが、-fフラグを使えば、使用中のイメージを強制的に削除することができます。

$ docker image rm <image_name> -f

docker rmiでイメージを削除する

Docker CLIには、rmiというエイリアスでイメージを削除するコマンドがあります。削除すると次のようになります。

$ docker rmi demo
Untagged: demo:latest
Deleted: sha256:2cbc27836df4a7707e746e28368f1fdecfefbfb813aae06611ca6913116b80b4

これからご紹介するイメージの削除例では、このrmiを使用していきます。

タグ付けされていないイメージをすべて削除する

タグ付けされていないイメージは、貴重なディスク容量を占有し、徐々にシステムの速度に悪影響を与えます。

Dockerですべてのタグ無しイメージを削除するには、フィルター付きでdocker rmiコマンドを使用します。-fを使うと、特定の条件に基づいてフィルターを指定できます(image rmで強制的に実行できる-fフラグとは異なるため要注意)。

dangling=trueフィルターでタグなしイメージを識別することができます。

$ docker rmi $(docker images -f "dangling=true" -q)

上記コマンドの-qは、タグ付けされていないすべてのイメージIDを表示するものです。IDはすべてdocker rmiの引数として渡され、削除されます。

このフィルターは「dangling」(ぶら下がり)というキーワードを使用しますが、前述のように、タグ付けされていないイメージの中には、使用中のものがある可能性があります。このフィルターで選択されたイメージがぶら下がっていない場合には、警告が表示されます。

IDで特定のイメージを削除する

docker rmiコマンドで、イメージIDを参照し特定のイメージを削除できます。

$ docker rmi <image_id>

名前とタグで特定のイメージを削除する

docker rmiコマンドで、特定のイメージを名前とタグとともに削除することもできます。

例えば、同じ名前でタグが異なるイメージが複数ある場合は、これで特定のイメージを削除します。

$ docker rmi <image_name>:<tag>

あるリポジトリに関連するイメージの中で、特定のバージョンだけを削除したい場合に有用です。

最新タグを持つイメージをすべて削除する

「latest」タグは、特定のDockerイメージの最新バージョンを指し、デフォルトタグとして使用されるのが一般的です。他のタグが明示的に指定されない限り、イメージの最新ビルドに自動的に割り当てられます。

「latest」タグが付いたイメージをすべて削除するコマンドは以下のとおりです。

$ docker rmi $(docker images | grep "latest" | awk '{print $3}')

このコマンドは2つに分かれており、まずはイメージIDの一覧を取得した後、docker rmiコマンドの引数としてこの一覧を渡します。

リモートリポジトリからイメージを削除する

Docker Hubなどのリモートリポジトリからイメージを削除するには、まずDocker CLIでそのアカウントにログインします。

ログイン後は、docker rmiコマンドを使ってイメージを削除するだけでOKです。docker rmiコマンドはローカルとリモートの両方のイメージを削除できます。

docker rmi my_repo/my_image_tag

ただし、削除できるのはリポジトリにプッシュされたイメージのみ。また、実行中のコンテナで使用されているイメージを削除することはできません。

リモートリポジトリから複数のイメージを削除する

リモートリポジトリから複数のイメージを削除するには、以下のようにdocker rmiコマンドの後にイメージIDまたはタグを続けます。

docker rmi my_repo/image_tag_1 my_repo/image_tag_2 my_repo/image_tag_3

上のコマンドは、image_tag_1image_tag_2image_tag_3というタグの3つのイメージをmy_repoリポジトリから削除します。

Dockerボリュームを削除する方法

Dockerボリュームは、特に大量のデータや複数のバックアップが含まれると、多くのディスク容量を占有する可能性があります。不要になったボリュームを削除することで、データ漏洩のリスクを軽減し、権限のないユーザーから機密情報を保護することができます。定期的にボリュームを削除することで、Docker環境を最新の状態に保ち、古いデータによるエラー発生も回避可能です。

なお、これからご紹介するコマンドは、ボリュームに保存されているすべてのデータを恒久的に削除します。慎重に使用してください。

未使用のボリュームをすべて削除する

未使用のボリュームの削除は、イメージやコンテナの削除くらい重要な作業です。

ディスク容量を解放するには、docker volume pruneコマンドを使いましょう。

名前を指定して特定のボリュームを削除する

名前を指定して、特定のボリュームを削除することもできます。未使用のボリュームを削除するのに有用です。

docker volume rm my_volume_name

上のコマンドで、my_volume_nameボリュームが削除されます。使用中のボリュームを削除しようとするとエラーが発生します。利用可能なボリュームは、docker volume lsコマンドで確認可能です。

Dockerコンテナを削除する方法

Dockerで作業を重ねるうち、ディスク容量を占有する未使用のコンテナが蓄積されることがあります。コンテナを削除しないでいると、貴重なディスク容量を浪費し、システムが低下して、問題が発生する可能性があります。

停止しているコンテナをすべて削除する

docker container pruneコマンドを実行すると、停止しているコンテナをすべて削除することができます。実行すると、削除されるコンテナの一覧が生成、表示されます。重要なコンテナを削除してしまわないかを再確認することができます。

$ docker container prune

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

Deleted Containers:
4df4c47c4df4
d35bcec20bce

このコマンドで削除できるのは停止中のコンテナのみです。実行中のコンテナを削除するには、最初にコンテナを停止するか、別のコマンドを使用します。

IDで特定のコンテナを削除する

Dockerでは、コンテナIDとdocker rm commandコマンドで 、IDで特定のコンテナを削除できます。まず、docker ps commandですべてのコンテナIDを取得します。

$ docker ps -a -q
1ce3cdeb4035
06b79541e25c
fa98f1804e3e

$ docker rm 1ce3cdeb4035

上のコマンドは、コンテナが停止状態にある場合でのみ機能します。コンテナが実行中の場合は、-fフラグを使って強制的に削除してください。

$ docker rm -f 1ce3cdeb4035

名前で特定のコンテナを削除する

名前とIDの両方でコンテナを削除するための多目的なdocker rmコマンドがあります。

例えば、「web_server」という名前のコンテナは、以下で削除可能です。

$ docker rm web_server

まずは、コンテナを停止してください。特定のコンテナを停止するには、docker stopコマンドが使えます。

実行中のコンテナをすべて削除する

実行中のコンテナをすべて削除する場合も、docker rmコマンドを使用します。

$ docker rm $(docker ps -q)

docker ps -qを使うと、実行中のコンテナIDが一覧で表示されます。その後、IDがdocker rmコマンドに渡され、すべてのコンテナが削除されます。

このコマンドが削除するのは、実行中のコンテナのみです。停止中のコンテナも含めて全てのコンテナを削除するには、次のコマンドを実行してください。

$ docker rm $(docker ps -a -q)

まとめ

Dockerイメージ、ボリューム、コンテナを削除し、クリーンで整理されたシステムを維持する方法についてご紹介しました。未使用、タグなし、または特定のイメージをIDまたは名前ですべて削除するコマンドや、停止しているコンテナをすべて削除するコマンド、IDや名前で特定のコンテナを削除するコマンドなど、用途に応じて使い分けることができる様々な操作があります。

Dockerイメージ、ボリューム、コンテナを削除するのは簡単です。未使用のコンポーネントを管理し、貴重なディスク容量を取り戻し、システムのパフォーマンスを改善してみてください。

Dockerを使って開発したアプリケーションをデプロイするなら、Kinstaのアプリケーションホスティングをお試しください。無料利用枠もご用意しています。

Salman Ravoof

Salman Ravoof is a self-taught web developer, writer, creator, and a huge admirer of Free and Open Source Software (FOSS). Besides tech, he's excited by science, philosophy, photography, arts, cats, and food. Learn more about him on his website, and connect with Salman on Twitter.