この記事の結論下のコマンドは、停止中を含むコンテナ、イメージ、ネットワーク、ボリューム、ビルドキャッシュをまとめて削除します。データベースコンテナの永続化ボリュームも問答無用で消えるため、本番環境や必要なデータが残っている環境では実行しないでください。

完全削除コマンド

Dockerの状態をまるごと初期化したい場合は、次のように実行します。

echo "Stopping all containers..."
docker stop $(docker ps -aq)

echo "Removing all containers..."
docker rm $(docker ps -aq)

echo "Removing all images..."
docker rmi $(docker images -q)

echo "Removing all networks..."
docker network rm $(docker network ls -q)

echo "Removing all volumes..."
docker volume rm $(docker volume ls -q)

echo "Performing system prune..."
docker system prune -a --volumes -f

echo "Docker reset complete."

何が消えるのか

このコマンドは、Docker上に残っている実行環境とデータをまとめて削除します。たとえば、停止中のコンテナ、ローカルにあるイメージ、ユーザー作成ネットワーク、名前付きボリューム、未使用のビルドキャッシュなどが対象です。

対象消えるもの
コンテナ起動中・停止中を問わず、docker ps -aq で取得できるコンテナ
イメージローカルに保存されているDockerイメージ
ネットワークユーザーが作成したDockerネットワーク
ボリュームDBデータなどを保持している名前付きボリューム
prune対象未使用リソースとビルドキャッシュ

使う前に確認すること

特に注意が必要なのはボリュームです。MySQL、PostgreSQL、Redis、MinIOなどのデータをDocker volumeに保存している場合、docker volume rm や docker system prune -a --volumes -f で中身ごと削除されます。

実行前には、最低限次のコマンドで現在の状態を見ておくと安心です。

docker ps -a
docker images
docker volume ls
docker network ls

必要なデータがある場合は、先にバックアップを取るか、削除対象を絞ったコマンドに変更してください。

エラーが出る場合

対象が存在しない環境では、docker stop や docker rm に空の引数が渡ってエラーになることがあります。すでに対象がないだけなら、そのエラー自体は大きな問題ではありません。

より安全にスクリプト化したい場合は、対象がある時だけ実行するように分岐を入れると扱いやすくなります。

containers=$(docker ps -aq)
[ -n "$containers" ] && docker stop $containers
[ -n "$containers" ] && docker rm $containers

images=$(docker images -q)
[ -n "$images" ] && docker rmi $images

volumes=$(docker volume ls -q)
[ -n "$volumes" ] && docker volume rm $volumes

docker system prune -a --volumes -f

まとめ

Docker環境を検証用に何度も作り直していると、古いコンテナ、イメージ、ボリュームが残り続けることがあります。今回のコマンドは、それらをまとめて消して、Dockerをほぼまっさらな状態に戻したい時に便利です。

ただし、便利さと危険さはセットです。特にデータベースの永続化ボリュームを使っている環境では、必要なデータまで消さないように、実行前の確認を忘れないようにします。