はじめに
Dockerでイメージをビルドしたり、コンテナを起動したりしていると、使い終わったデータが残ることがあります。実習が終わった後は、不要になったものを整理しておきましょう。
この記事では、次の2つのコマンドを使った後片付けを解説します。
docker image prune:不要なイメージを整理するdocker system prune:停止済みコンテナなども含めて整理する
どちらも不要なものを削除するコマンドですが、対象範囲が異なります。何が削除されるのかを理解してから実行しましょう。
イメージの作成方法を先に確認したい場合は、Dockerfile入門をご覧ください。
削除前に押さえておきたいこと
イメージとコンテナは別のもの
イメージは、コンテナを作成する元になるものです。一方、コンテナは、そのイメージをもとに作成して実行する環境です。
コンテナの処理が終了しても、通常はコンテナ自体や元のイメージが自動的に削除されるわけではありません。使い終わったデータを整理する操作が必要になります。
ただし、Dockerが「未使用」と判断することと、自分にとって「今後も不要」であることは同じではありません。後で再利用したいものが残っていないか確認しましょう。Docker Docs
実習用のフォルダだけが削除対象になるわけではない
この記事で紹介するpruneコマンドは、現在開いている作業フォルダだけを対象にするものではありません。接続先のDocker環境が管理するデータを対象にします。
同じDocker環境で複数のプロジェクトを動かしている場合は、ほかのプロジェクトで使っていたデータも削除対象になり得ます。
手元のイメージを確認する
現在保存されているイメージは、次のコマンドで確認できます。
docker images
一覧には、イメージの名前やタグ、IDなどが表示されます。表示形式はDockerのバージョンなどによって異なります。
ただし、この一覧だけで、これから削除される対象をすべて確認できるわけではありません。次に説明する、それぞれのコマンドの削除条件も確認してください。
docker image pruneで不要なイメージを削除する
イメージを整理するときは、次のコマンドを使います。
docker image prune
オプションを付けない場合、主な削除対象はタグが付いておらず、どのコンテナからも参照されていないイメージです。このようなイメージをdanglingイメージと呼びます。
例えば、イメージを同じタグで作り直した結果、以前のイメージがタグを失い、コンテナからも参照されなくなることがあります。こうしたイメージが整理の対象になります。
実行時には確認メッセージが表示される
コマンドを実行すると、削除対象の種類と、続行するかを尋ねるメッセージが表示されます。
Are you sure you want to continue? [y/N]
表示内容を確認し、削除してよければyを入力してEnterキーを押します。中止する場合はnを入力するか、そのままEnterキーを押してください。
使っていないイメージがすべて削除されるわけではない
docker image pruneを実行しても、タグ付きのイメージは標準の削除対象になりません。
例えば、実習で作ったmy-nginx-page:latestを今は使っていなくても、タグが付いていれば、このコマンドだけでは通常削除されません。
また、このコマンドはコンテナを削除するものではありません。イメージの整理と、停止済みコンテナの整理を区別しておきましょう。Docker Docs
docker system pruneで不要なデータをまとめて削除する
イメージ以外も含めて整理する場合は、次のコマンドを使います。
docker system prune
オプションを付けない場合、次のものが削除対象になります。
| 削除対象 | 内容 |
|---|---|
| 停止済みコンテナ | 処理を終了したコンテナや、停止して残っているコンテナ |
| 未使用ネットワーク | どのコンテナからも参照されていない、削除可能なネットワーク |
| danglingイメージ | タグがなく、コンテナからも参照されていないイメージ |
| 未使用のビルドキャッシュ | ビルドの処理結果などを再利用するために保存された、未使用のキャッシュ |
こちらも、実行すると削除対象の種類と確認メッセージが表示されます。内容を読んでから続行してください。Docker Docs
停止済みコンテナも削除される
docker system pruneでは、停止済みコンテナが削除されます。削除すると、そのコンテナを再起動して使うことはできなくなります。
コンテナ内の書き込み領域にだけ保存していたファイルも、コンテナの削除によって失われます。後で使いたいファイルがある場合は、削除前に取り出しておく必要があります。
なお、実行中のコンテナは、このコマンドで停止・削除される対象ではありません。
ボリュームは標準では削除されない
オプションなしのdocker system pruneでは、ボリュームは削除されません。
ボリュームは、データベースなどのデータをコンテナの外に保存するために使われます。コンテナ自身の書き込み領域とは別の保存先です。
「コンテナ内にだけ保存したファイル」と「ボリュームに保存したデータ」では、削除時の扱いが異なる点に注意しましょう。Docker Docs
ビルドキャッシュを削除すると次回のビルドに時間がかかることがある
ビルドキャッシュは、以前のビルド結果を再利用するためのものです。削除後は同じ処理をやり直すことがあるため、次回のビルドに時間がかかる場合があります。
不要なデータを減らせる一方で、ビルド時の再利用にも影響することを覚えておきましょう。
image pruneとsystem pruneの違い
ここまでの内容を整理すると、次のようになります。どちらも、オプションを付けない場合の比較です。
| 比較項目 | docker image prune | docker system prune |
|---|---|---|
| danglingイメージ | 削除対象 | 削除対象 |
| タグ付きの未使用イメージ | 標準では対象外 | 標準では対象外 |
| 停止済みコンテナ | 対象外 | 削除対象 |
| 未使用ネットワーク | 対象外 | 削除対象 |
| 未使用ビルドキャッシュ | 直接の整理対象ではない | 削除対象 |
| ボリューム | 対象外 | 標準では対象外 |
イメージだけを整理したい場合はdocker image prune、停止済みコンテナなども含めて整理したい場合はdocker system pruneを使います。
2つのコマンドを必ず順番に実行する必要はありません。 整理したい対象に合わせて選んでください。
削除後にイメージが残っていても異常ではない
削除後は、もう一度イメージの一覧を確認できます。
docker images
タグが付いているイメージや、コンテナから参照されているイメージが残ることがあります。削除対象がなければ、コマンドが正常に終了しても何も削除されない場合があります。
pruneは、Docker内のすべてを初期化するコマンドではありません。それぞれの条件に当てはまるものを整理するコマンドです。
まとめ
この記事では、Dockerの実習後に使える2つの後片付けコマンドを紹介しました。
docker image pruneは、標準ではdanglingイメージを削除するdocker system pruneは、停止済みコンテナ、未使用ネットワーク、danglingイメージ、未使用ビルドキャッシュをまとめて整理する- タグ付きのイメージは、どちらのコマンドでも標準では削除対象にならない
docker system pruneでも、ボリュームは標準では削除されない- 作業フォルダ単位の削除ではないため、同じDocker環境で使っているほかのプロジェクトにも注意する
まずはイメージとコンテナの違いを押さえ、整理したい対象に合うコマンドを選びましょう。
Dockerの基本操作はDocker入門、自分のイメージを作成する方法はDockerfile入門で解説しています。