diff --git a/tools/cleanup-containers b/tools/cleanup-containers
index b94c5db1e3..4a539d4c8e 100755
--- a/tools/cleanup-containers
+++ b/tools/cleanup-containers
@@ -1,7 +1,33 @@
 #!/bin/bash
-CONTAINERS=`docker ps -a -q`
-if [[ -z "$CONTAINERS" ]]; then
-    echo "No containers to cleanup, exit now."
-    exit 0
+if [[ $(pgrep qemu) ]]; then
+    echo "Some qemu processes were detected."
+    echo "Docker will not be able to stop the nova_libvirt container with those running."
+    echo "Please clean them up before rerunning this script."
+    exit 1
 fi
-docker rm $@ $CONTAINERS
+
+containers_to_kill="
+    glance_{api,registry,data} \
+    haproxy \
+    heat_{api{,_cfn},engine} \
+    horizon \
+    keepalived
+    keystone \
+    kolla_ansible \
+    log_data \
+    mariadb{,_data} \
+    murano_{api,engine} \
+    neutron_{server,agents,linuxbridge_agent,openvswitch_agent} \
+    nova_{data,scheduler,novncproxy,consoleauth,conductor,api,compute,libvirt} \
+    openvswitch_{vswitchd,db} \
+    rabbitmq{,_data} \
+    rsyslog \
+    swift_{account_{auditor,reaper,replicator,server},container_{auditor,expirer,replicator,server,updater},proxy_server,rsyncd}"
+
+echo "Stopping containers..."
+(docker stop -t 2 ${containers_to_kill} 2>&1) > /dev/null
+
+echo "Removing containers..."
+(docker rm -v -f ${containers_to_kill} 2>&1) > /dev/null
+
+echo "All cleaned up!"