Dockerコンテナを確実に削除する方法と依存関係の処理

Dockerを運用していると、不要になったコンテナが蓄積し、ディスク容量を圧迫します。本記事では、単一コンテナから関連リソースまで、実務で必要な削除パターンをすべて解説します。停止中のコンテナ削除、実行中のコンテナ強制終了、関連イメージやボリュームの一括削除など、すぐに仕事で活用できる実践的なコマンドを紹介します。

Dockerコンテナ削除の基本コマンド

停止中のコンテナを削除する

最も基本的な削除方法は、停止状態のコンテナをdocker rmコマンドで削除することです。実行中のコンテナは削除できないため、まず停止する必要があります。

# コンテナを停止してから削除
docker stop my-container
docker rm my-container

# または、コンテナIDで指定
docker rm abc123def456

複数のコンテナを一度に削除する場合は、スペースで区切って指定します。

# 複数のコンテナを同時削除
docker rm container1 container2 container3

実行中のコンテナを強制削除する

実行中のコンテナをすぐに削除したい場合、-f(--force)フラグを使用します。先に停止する手順をスキップできますが、アプリケーションの適切なシャットダウンが行われないため、データ破損のリスクがあります。緊急時のみ使用してください。

# 実行中のコンテナを強制削除(先に停止は不要)
docker rm -f my-container

# 複数のコンテナを強制削除
docker rm -f container1 container2

条件を指定して複数コンテナを一括削除

停止中のすべてのコンテナを削除

開発環境では、テスト実行後に多数の停止済みコンテナが残ります。docker container pruneコマンドで一括削除が可能です。

# 停止中のすべてのコンテナを削除(確認プロンプト付き)
docker container prune

# 確認プロンプトをスキップ
docker container prune -f

このコマンドは非常に便利ですが、意図しないコンテナを削除する可能性があるため、本番環境では慎重に使用してください。

特定のラベルを持つコンテナを削除

コンテナの作成時にラベルを付与しておくことで、プロジェクトやステージ別に管理できます。

# ラベル条件を指定して削除
docker rm $(docker ps -aq --filter "label=environment=dev")

# 複数のラベル条件を指定
docker rm $(docker ps -aq --filter "label=project=myapp" --filter "label=status=deprecated")

終了ステータスが0でないコンテナを削除

エラーで終了したコンテナのみを削除したい場合は、ステータスフィルターを使用します。

# 異常終了したコンテナのみを削除
docker rm $(docker ps -aq --filter "exited=1")

関連リソースを含めた完全削除

コンテナ、イメージ、ボリュームを一括削除

コンテナを削除してもイメージやボリュームが残ると、ディスク容量が回復しません。関連するすべてのリソースを削除する方法を解説します。

# コンテナとそれに紐付くボリュームを削除
docker rm -v my-container

# 複数コンテナのボリュームも一括削除
docker rm -v container1 container2

-vフラグは、コンテナに紐付いた匿名ボリュームを削除します。名前付きボリュームは別途削除が必要です。

使用されていないイメージを削除

コンテナ削除後も、イメージが残ります。実行中のコンテナに使用されていないイメージを削除するにはdocker image pruneを使用します。

# 使用されていないイメージを削除
docker image prune

# すべての未使用イメージを削除(ダングリングイメージ含む)
docker image prune -a

# 確認プロンプトをスキップ
docker image prune -a -f

システムワイドクリーンアップ

Dockerシステム全体の不要なリソースを一度に削除するのがdocker system pruneです。コンテナ、イメージ、ネットワークをまとめて削除できます。

# 停止済みコンテナ、ダングリングイメージ、未使用ネットワークを削除
docker system prune

# ボリュームも含めて削除(注意:データ損失の可能性)
docker system prune --volumes

# 確認なしで実行
docker system prune -f --volumes

ハマりやすいポイントと解決策

「Error response from daemon: You cannot remove a running container」エラー

このエラーは、実行中のコンテナを-fフラグなしで削除しようとした場合に発生します。

# 【誤り】実行中のコンテナを削除しようとしている
docker rm my-container
# Error response from daemon: You cannot remove a running container

# 【正解】先に停止するか、-fフラグを使用
docker stop my-container && docker rm my-container
# または
docker rm -f my-container

名前付きボリュームが削除されない

コンテナ削除時に-vフラグを使用しても、名前付きボリュームは残ります。理由は、他のコンテナで再利用される可能性があるためです。

# 名前付きボリュームは別途削除が必要
docker volume rm my-volume

# 使用されていないボリュームをすべて削除
docker volume prune

イメージ削除時の「image is being used by running container」エラー

イメージを削除する際、そのイメージから起動されているコンテナが存在するとエラーが発生します。

# 【確認】イメージを使用しているコンテナを検索
docker ps -a --filter "ancestor=my-image:latest"

# 【削除】コンテナを削除後、イメージを削除
docker rm container-id
docker rmi my-image:latest

実務で便利な削除スクリプト

開発環境向け一括クリーンアップスクリプト

開発時に頻繁に実行する削除処理をスクリプト化すると、作業効率が向上します。

#!/bin/bash
# docker-cleanup.sh - 開発環境用クリーンアップスクリプト

echo "=== Docker クリーンアップを開始 ==="

# 停止済みコンテナを削除
echo "停止済みコンテナを削除中..."
docker container prune -f

# ダングリングイメージを削除
echo "ダングリングイメージを削除中..."
docker image prune -f

# 未使用ボリュームを削除
echo "未使用ボリュームを削除中..."
docker volume prune -f

echo "=== クリーンアップ完了 ==="
docker system df

このスクリプトを~/docker-cleanup.shに保存し、chmod +x ~/docker-cleanup.shで実行権限を付与すれば、./docker-cleanup.shで実行できます。

特定プロジェクトのコンテナのみ削除

複数プロジェクトを並行開発している場合、プロジェクト別のクリーンアップが有用です。

#!/bin/bash
# delete-project-containers.sh PROJECT_NAME

PROJECT=$1

if [ -z "$PROJECT" ]; then
  echo "使用法: $0 PROJECT_NAME"
  exit 1
fi

echo "プロジェクト '$PROJECT' のコンテナを削除中..."

# プロジェクトラベルを持つコンテナを検索・削除
docker rm -v $(docker ps -aq --filter "label=project=$PROJECT")

echo "削除完了"

実行例:./delete-project-containers.sh myapp

削除する前に確認すべきポイント

削除対象のコンテナを一覧確認

削除実行前に、対象のコンテナを確認することは重要です。

# 停止済みコンテナをすべて表示
docker ps -a --filter "status=exited"

# 特定ラベルのコンテナを表示
docker ps -a --filter "label=project=myapp"

# 詳細情報を表示(作成日時、サイズなど)
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Size}}"

削除前のデータバックアップ

重要なデータを含むコンテナを削除する場合は、事前にバックアップを取得してください。

# コンテナ内のファイルをホストにコピー
docker cp my-container:/app/data ./backup/

# ボリュームをバックアップ
docker run --rm -v my-volume:/data -v $(pwd):/backup \
  alpine tar czf /backup/volume-backup.tar.gz -C /data .

Docker ComposeプロジェクトのコンテナをAll削除

Docker Composeで管理しているプロジェクトの場合、compose設定ファイルのディレクトリで実行します。

# docker-compose.ymlがあるディレクトリで実行
cd /path/to/docker-compose/project

# すべてのコンテナを停止・削除
docker-compose down

# ボリュームも含めて削除
docker-compose down -v

# イメージも削除
docker-compose down --rmi all

使うべき場面と使うべきでない場面

コンテナ削除が適切な場面:

  • 開発環境でテスト実行後の一時的なコンテナ
  • 不具合が発生したコンテナの再起動前
  • 古いバージョンのイメージから生成されたコンテナ
  • ディスク容量が不足している場合のクリーンアップ

コンテナ削除が適切でない場面:

  • 本番環境で実行中のコンテナ(停止してから確認すること)
  • 永続化すべきデータを保持しているコンテナ(バックアップ前)
  • 他のコンテナやアプリケーションに依存されているコンテナ

よくある質問

A: 基本的に同じ機能です。docker container rmはより新しい命名方式(Docker 1.13以降)で、将来性があります。本記事ではどちらを使用しても問題ありません。

A: docker system pruneで削除されたイメージは完全に削除されます。イメージレジストリ(Docker Hub等)から再度docker pullで取得してください。本番環境では-f(確認スキップ)フラグの使用は避け、必ず確認プロンプトを表示させましょう。

K
AWS・Python・生成AIを専門とするソフトウェアエンジニア。AI・クラウド・開発ワークフローの実践ガイドを執筆しています。詳しく見る →