完全削除コマンド
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をほぼまっさらな状態に戻したい時に便利です。
ただし、便利さと危険さはセットです。特にデータベースの永続化ボリュームを使っている環境では、必要なデータまで消さないように、実行前の確認を忘れないようにします。