Docker コンテナの削除
この記事では、Dockerコンテナの削除に関する7つのポイントをまとめている。
ここではdocker container rm
コマンドを中心に、コンテナの状態に応じた削除方法や、リカバリ方法、トラブルシューティングなど、その他の内容も含まれている。
1. Dockerコンテナ削除コマンド [#1].
docker コンテナ削除コマンドは以下の通り。
$ docker container rm [OPTIONS] CONTAINER [CONTAINER...]
この rm
コマンドは、1つまたは複数の終了したコンテナを削除する。
CONTAINER
の位置にコンテナ ID またはコンテナ名を指定して実行する。
削除されるのはコンテナだけであり、docker イメージは削除されないことに注意しよう。
docker イメージを削除するコマンドは docker image rm
で、詳しくは this post を参照。
また、[OPTIONS]の場所に3つのオプションを追加することができます: --force
, --link
, --volume
。--force
オプションは Section 4 で後述します。
--link
オプションはコンテナを含むリンクを削除する。注意すべき点は、これはコンテナ自体を削除するわけではないということである。
Dockerはリンクを使用するよりもカスタムネットワークを使用することを推奨しているため、このオプションは非推奨になる可能性が高い。今のところ、レガシーコードでのみ使用することを推奨する。
--volume
オプションは、コンテナを削除するときに、それに関連するボリュームも削除することを意味します。
別の記事で取り上げるが、コンテナのストレージとして機能するボリュームは独立したエンティティである。
そのため、コンテナが削除されても、ボリュームは自動的に削除されない。
これを例で確認してみよう。以下の例では、すべてのコンテナのリストを取得し、コンテナIDを取得して、それを削除している。
$ docker container ls --all
CONTAINER ID IMAGE COMMAND ...
6f3e40d12122 nginx "/docker-entrypoint.…" ...
$ docker container rm 6f3e
6f3e
$ docker container ls --all
CONTAINER ID IMAGE COMMAND ...
コンテナが正常に削除され、表示されなくなったことがわかる。
2. 削除されたコンテナを復元する代替手段 [#2].
Dockerはrm
コマンドで削除したコンテナを復元する方法を提供していません。そのため、予期せず削除してしまった場合は、以下の代替手段を知っておくとよいでしょう。
2.1. ボリュームによるデータ管理
Dockerボリュームは、コンテナ内に永続的に保存する必要があるデータや、共有する必要があるデータを安全に保存するための最良の方法です。 セクション1で述べたように、ボリュームはコンテナから独立してパージされるため、コンテナからパージされるべきでないデータはボリュームに保存するようにしましょう。
2.2. docker container commit コマンドを使用した新しいイメージの作成
docker container commit
コマンドは、現在のコンテナのすべての変更を反映した新しいイメージを作成します。
そのため、現在の状態を保持する必要があるコンテナでは、このコマンドを定期的に使用することができます。
3. コンテナの削除に失敗した場合の回避策
Dockerコンテナの削除に失敗する場合、さまざまな原因が考えられます。ここでは、最も一般的な5つの原因とその解決策を紹介します。
3.1. 実行中のコンテナ
Dockerでは、実行中のコンテナを削除することはできません。
そのため、削除したいコンテナが現在実行中かどうかを確認し、実行中であれば docker container stop
コマンドで kill してから削除するのがよい方法です。
コンテナを強制的に削除しても破損しないことが確認できれば、セクション4のコンテナの強制削除方法に従って削除することもできます。
3.2. コンテナが他のコンテナに使用されている
削除したいコンテナが他のコンテナによって使用されている場合も、そのコンテナを削除することはできません。
コンテナは、ボリューム(--volumes-from
オプション)、リンク(--link
オプション)、ネットワーク(--network
オプション)などで別のコンテナとリンクすることができる。
これらの場合、現在のコンテナを削除する前に、現在のコンテナを使用している他のコンテナを削除する必要があります。
3.3. 権限の問題
現在のユーザーが Docker を使用するための適切な権限設定を持っていない場合、権限の問題が原因でコンテナの削除に失敗することがあります。 Docker コンテナの停止と終了 - 7. パーミッション拒否が発生した場合の対処方法を参照してください。
3.4 その他のサーバー環境の問題
上記に加えて、サーバに十分なディスク容量がない場合、またはDockerデーモンが正常に動作していない場合、コンテナの削除が拒否されることがあります。これらの領域をチェックすることをお勧めします。
4. 実行中のコンテナを強制的に削除する [#4].
実行中のコンテナを強制的に削除することは推奨されません。しかし、コンテナが正常に動作しておらず、正常にシャットダウンできない場合は、必要な場合がある。
そこで、docker container rm
コマンドの--force
オプションの出番となる。以下のように使用できる。
$ docker container rm --force CONTAINER
コンテナを強制的に削除する場合は、必ず他のコンテナやボリュームなどに影響がないことを確認してから作業を進めること。
5. 終了したコンテナをすべて削除する
終了したコンテナがすべて使われなくなった場合、1つのコマンドですべて削除する方法がある。
$ docker container prune
このコマンドを入力すると、Dockerは本当に終了したコンテナをすべて削除するかどうかを再度尋ねてくる。 Yesと答えると、すべての終了したコンテナの削除が実行される。
セクション2で述べたように、削除されたDockerコンテナを復元する方法はないので、このコマンドは注意して使用すること。
6. コンテナ全体を削除する
これはあまりお勧めしませんが、実行中であろうと停止中であろうと、すべてのコンテナを一度に削除したい場合は...。 方法がある。
$ docker container rm --force $(docker container ls -aq)
docker container ls -aq
コマンドはすべての状態のコンテナIDを検索する。
このIDのリストをシェルスクリプトの $()
構文で rm
コマンドの引数として送る。
リスト内のコンテナのいずれかが実行中であれば、自然に削除されることはないので、強制的に削除するために --force
オプションを追加する必要がある。
7. まとめ
この記事では、Dockerコンテナを削除する方法についてまとめた。
docker container rm
コマンドを中心に、コンテナの状態に応じた削除方法、復旧方法、トラブルシューティングについて解説した。
コンテナを削除する際の参考にしていただければ幸いだ。
