docker rmコマンドの使い方(実例で解説)

docker rmコマンド解説

 本記事はDocker ver24.0.7の環境で確認しています。

 このコマンドは、コンテナを削除する際に使用します。

 また、コンテナに設定してあるリンクを削除することも可能です。

リンクは、docker runコマンドの「--link」オプションにコンテナを指定することで作成します。リンクを作成すると、指定したリンク先のコンテナ情報(IPアドレスなど)が、環境変数を介して取得できるようになります。Docker公式ドキュメントによりますと、リンク機能は将来的に無くなる方向のようです。

 それでは以下で詳細に解説いたします。

docker rmコマンドのフォーマットとオプション

フォーマット

docker rm [オプション] [コンテナ] [コンテナ]

主なオプション一覧

オプション概説
-f, --force起動中のコンテナを強制停止して強制的に削除する
-l, --linkコンテナに設定されているリンクを削除する
-v, --volumesコンテナ停止時に、コンテナにマウントされたデータボリュームも一緒に削除する
※名前付きデータボリュームは削除されません

コマンド例

docker rm testvm
docker rm testvm1 testvm2
docker rm -f testvm

docker rmコマンドの主な使い方

 以下で実例をまじえたコマンドの使い方を解説していきたいと思います。

実例では、Ubuntuの公式イメージにより起動したコンテナ(testvm)を使用します。

コンテナは「docker run -dit --init --name testvm ubuntu」で起動します。

※「--rm」オプションを付けておりませんので、ご利用後はコンテナ削除をお忘れなく。

基本事項の解説

 docker rmコマンドは、不要になったコンテナをDockerホスト内から削除する際に使用します。

 docker stopコマンドでコンテナを停止しただけですと、コンテナのリソースはDockerホスト内に残っています。

 これをキレイにするのがdocker rmコマンドの役割です。

 以下で実例をまじえて具体的に解説します。

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

 起動状態のコンテナtestvmを停止した後に削除します。

 現在コンテナtestvmは起動中です。

$ docker ps
CONTAINER ID  IMAGE  COMMAND     CREATED       STATUS        PORTS  NAMES
cd2ce92b5761  ubuntu "/bin/bash" 3 seconds ago Up 2 seconds         testvm

 まずコンテナtestvmを停止します。

$ docker stop testvm

 停止したことを確認します。

$ docker ps -a
CONTAINER ID  IMAGE   COMMAND     CREATED            STATUS                      PORTS NAMES
cd2ce92b5761  ubuntu  "/bin/bash" About a minute ago Exited (0) 28 seconds ago         testvm

 停止しているコンテナを、以下のコマンドで削除します。

$ docker rm testvm
testvm

 削除が完了しますと、削除対象のコンテナ名が出力されます。

削除対象コンテナを複数指定して一度に削除する

 3つの停止状態のコンテナtestvm1、testvm2、testvm3があります。

$ docker ps -a
CONTAINER ID  IMAGE   COMMAND     CREATED            STATUS                       PORTS  NAMES
9cc4d59f101e  ubuntu  "/bin/bash" About a minute ago Exited (0) 22 seconds ago           testvm3
e786b3c5f6d7  ubuntu  "/bin/bash" About a minute ago Exited (0) 32 seconds ago           testvm2
5c3b411db5ac  ubuntu  "/bin/bash" About a minute ago Exited (0) 42 seconds ago           testvm1

 この3つのコンテナを、以下のコマンドで一度に削除します。

$ docker rm testvm1 testvm3 testvm2

 以下の通り、削除対象のコンテナ名が表示されまして、削除が完了しました。

testvm1
testvm3
testvm2

 削除の順番を確認するために、わざと1,3,2の順番に削除してみました。

起動状態のコンテナを強制削除する

 起動状態のコンテナtestvmを強制削除します。まずは、testvmが起動状態であることを確認します。

$ docker ps
CONTAINER ID  IMAGE   COMMAND     CREATED       STATUS        PORTS  NAMES
dd2ffba8c454  ubuntu  "/bin/bash" 4 seconds ago Up 3 seconds         testvm

起動状態のコンテナをdocker rmコマンドで削除しようとした場合、以下のようなエラーが出ます。

Error response from daemon: You cannot remove a running container 
dd2ffba8c4547e0835d04c9bea548362dc463faa4acd397afe6c6d3110048948.
 Stop the container before attempting removal or force remove

 「-f」オプション付のdocker rmコマンドを使用することで、コンテナtestvmを強制的に削除することができます。

$ docker rm -f testvm
testvm

 削除が完了しますと、削除対象のコンテナ名が出力されます。

コンテナに指定したリンクを削除する

 Dockerには、コンテナのリンク機能が用意されており、他のコンテナの情報を環境変数として受け取ることが可能です。

 docker rmに「--link」オプションを付けて実行しますと、コンテナの削除ではなく、コンテナに定義したリンクを削除することができます。

 検証を行うために、まずコンテナtestvm2を起動します。

$ docker run -dit --init --name testvm2 ubuntu

 そのコンテナtestvm2をリンクさせたコンテナtestvmを起動します。

$ docker run -dit --init --name testvm --link testvm2 ubuntu

 リンクが設定されていることをdocker inspectコマンドにて確認してみます。

$ docker inspect testvm

 出力された文字列内に以下の部分があると思います。

"Links": [
 "/testvm2:/testvm/testvm2"
 ],

 docker runコマンドでリンクを設定すると、内部的には「被リンクコンテナ名:自コンテナ名/エイリアス名」のリンクエントリが生成されます。自コンテナ名は自動で付与されます。エイリアス名は被リンクコンテナを表しています。

 リンクの削除を行う場合は、後半の「自コンテナ名/エイリアス名」の部分を指定します。

 先ほどコンテナtestvmに指定したリンク「--link testvm2」を削除する場合は、以下のコマンドを実行します。

$ docker rm --link testvm/testvm2

 先ほどのdocker inspectコマンドで確認してみます。

$ docker inspect testvm

 先ほど表示されていたLinksの部分が以下の内容に変わってます。

"Links": null,

 リンクの定義を削除しても、コンテナ内で生成されたリンク用の環境変数は自動的に削除されません。対象となる環境変数を削除するためには、コンテナの再起動が必要です。

各種データボリューム毎のコンテナ削除時の処理について

 コンテナ起動時に指定可能なデータボリュームの主なものとしては、以下の3種類存在します。

  1. docker volumeコマンドで作成したデータボリューム
  2. Dockerホスト上の実ディレクトリ
  3. Dockerによる自動生成のデータボリューム

 docker rmの「-v」オプションは、コンテナの削除時に、そのコンテナが使用しているデータボリュームの削除を行ってくれるオプションですが、実際に削除されるのは3の自動生成のデータボリュームのみです。1と2については削除されません。

 また、「-v」オプションを付けずにコンテナを削除した場合は、3のデータボリュームは削除されず、再度同じコンテナを作成して起動したとしても、再利用されません。つまりゴミ領域になってしまいます。

 実際のところ、「削除」の処理を、削除対象を直接指定せず、システム任せで自動削除という運用は、一般的なシステム運用としては受け入れることは難しいと思います。

 私は、データボリュームを使う場合は、以下のように行ってます。

  • 自動生成のデータボリュームは使用しない
  • データボリュームが指定されたコンテナを削除する場合は「-v」は付けない
  • データボリュームが指定されていないコンテナを削除する場合のみ「-v」を付ける(念のためのゴミ掃除的な意味合いでの使用です)

 Dockerの仕様変更などに気付かずに、ある日突然データが消えるようになった、などのトラブルが発生しないように、上記の考え方でdocker rmを使用してます。

おわりに

  以上でdocker rmコマンドの紹介を終わります。

 ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。

 他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerコマンドの一覧(オリジナルな実例付き)」をご参照ください。

 最後までお読みいただきありがとうございました。

コメント