Docker makes it easy to wrap your applications in containers and run them anywhere. However, as you work with Docker, you quickly accumulate unused volumes that pile up on your system and eat through your disk space.
Every time you test a container, deploy a database, or rebuild an environment, Docker creates volumes to store persistent data. When you remove those containers, the volumes stay behind. After weeks of development, you’re left with hundreds of orphaned volumes consuming gigabytes of storage.
Docker gives you all the tools you need to clean up your system from the command line. This guide provides a complete reference to commands for identifying unused volumes, removing them safely, and keeping your environment organized. Practical commands you can use immediately.
What Are Docker Volumes and Why Clean Them Up
Docker volumes work like external storage attached to your containers. When your application writes data, it goes to the volume instead of the container itself. This separation matters. Your database data, uploaded files, and logs persist even when containers get rebuilt or replaced. Without volumes, restarting a container wipes everything.
But volumes stick around after containers die. You remove a test container, the volume stays. Repeat this fifty times during development and you’ve got fifty orphaned volumes eating your disk space. Regular cleanup solves three problems. First, you reclaim disk space before storage fills up. Second, you identify which volumes actually matter when you’re not scrolling through hundreds of old test volumes. Third, your system stays organized. Development environments need weekly or monthly cleanups. Production systems require careful planning but benefit from scheduled maintenance to remove truly unused volumes.
Listing and Identifying Docker Volumes
You can’t delete what you can’t see. Start by listing all volumes on your system.
View all volumes:
docker volume ls
You’ll see output like this:
DRIVER VOLUME NAME
local my_database_volume
local wordpress_data
local 3f8d9c4e5b2a1d6f7e8c9b0a1d2e3f4g5h6i7j8k9l0m1n2o3p4q5r6s7t8u9v0w
local test_volume
The first column shows the driver (usually “local”). The second column shows volume names. Named volumes display the names you gave them. Anonymous volumes show long hexadecimal strings.
Filter for specific volumes:
docker volume ls -f name=data
This shows only volumes with “data” in their name. The -f flag applies filters to narrow your results.
Find dangling volumes (volumes not attached to containers):
docker volume ls -f dangling=true
These dangling volumes are prime deletion candidates since no container uses them. But verify first in case they hold data you need.
Get detailed information about a volume:
docker volume inspect volume_name
This returns JSON output showing creation date, storage location on the host (Mountpoint), and any labels. On Linux systems, the mountpoint typically lives in /var/lib/docker/volumes/.
How to Delete Specific Docker Volumes
You’ve identified volumes to remove. Deletion is straightforward once you know the exact volume name.
Delete a single volume:
docker volume rm volume_name
Docker removes the volume and confirms by returning its name.
Delete multiple specific volumes:
docker volume rm volume_name1 volume_name2 volume_name3
List volume names separated by spaces. Faster than deleting one at a time.
Critical restriction: You cannot delete volumes in use by containers. Docker throws an error if you try. Stop and remove the container first.
For running containers, follow this sequence:
docker stop container_name
docker rm container_name
docker volume rm volume_name
Stop the container, remove it, then delete the volume. This ensures no active processes access the data.
Double-check volume names before deletion. Unlike containers you can recreate from images, deleted volume data is gone permanently without backups.
Removing Dangling and Unused Volumes
Dangling volumes accumulate naturally during development. They exist, but no container connects to them anymore.
List all dangling volumes:
docker volume ls -f dangling=true
Review this list before deleting anything. Verify you don’t need the data.
Remove all dangling volumes:
docker volume prune
Docker prompts with a warning showing what gets removed. Type y to proceed.
Skip the confirmation prompt:
docker volume prune -f
The -f flag bypasses confirmation. Use carefully in production.
As of Docker 23.0 and later, docker volume prune by default only removes anonymous dangling volumes. Named volumes stay unless you explicitly target them.
Remove both anonymous and named unused volumes:
docker volume prune -a
The -a flag extends cleanup to all unused volumes.
Delete volumes older than 48 hours:
docker volume prune --filter "until=48h"
The until filter accepts Go duration strings like 24h or 1h30m. This protects recently created volumes from accidental deletion.
Docker Compose Volume Management
Most modern Docker setups use Docker Compose. Managing volumes through Compose requires different commands than standalone Docker.
Note: Docker Compose v2 uses docker compose (space) while v1 uses docker-compose (hyphen). Both work the same way, so use whichever version you have installed.
When you run docker compose up, Compose creates volumes defined in your docker-compose.yml file. These volumes persist after you stop containers.
Stop containers but keep volumes:
docker compose down
This stops and removes containers but leaves volumes intact. Your data stays safe for the next time you start services.
Remove containers and their volumes:
docker compose down -v
The -v flag tells Compose to remove volumes along with containers. Use this when you want a complete cleanup of a project.
For a specific service’s volumes:
docker compose rm -v service_name
This removes stopped containers for a specific service and their anonymous volumes.
Remove all volumes defined in the compose file:
docker volume rm $(docker volume ls -q -f name=project_name)
Replace project_name with your actual project name. Compose prefixes volume names with the project directory name by default.
If you’re running multiple Compose projects, volumes can pile up fast. Regular cleanup after finishing a project prevents storage bloat. Just make sure you’ve backed up any data you need before running -v flags.
Removing Containers with Their Volumes
Docker offers automatic volume cleanup when deleting containers. This keeps your system clean without manual intervention.
Remove a container with its anonymous volumes:
docker rm -v container_name
This deletes both the container and any unnamed volumes attached to it. Only works with anonymous volumes created automatically.
Named volumes stay even with the -v flag. Docker assumes you want to preserve explicitly named volumes.
Auto-remove containers after they exit:
docker run --rm image_name
Perfect for one-off tasks or testing. The container and its anonymous volumes disappear when it stops.
Remove all stopped containers with volumes:
docker rm -v $(docker ps -a -q -f status=exited)
Note: This command may fail if no stopped containers exist. For safer execution, use:
docker ps -a -q -f status=exited | xargs -r docker rm -v
The -r flag prevents xargs from running if the input is empty.
Just remember, these methods only handle anonymous volumes. So, manually remove named volumes after deleting containers.
Bulk and Pattern-Based Volume Deletion
Managing hundreds of volumes one by one wastes time. Docker supports bulk operations through command substitution.
Remove volumes matching a pattern:
docker volume ls -q | grep "pattern" | xargs docker volume rm
The -q flag returns only volume names. grep filters for your pattern. xargs passes each result to the removal command.
Remove all volumes with “test” in the name:
docker volume ls -q | grep "test" | xargs docker volume rm
Remove all volumes (dangerous in production):
docker volume rm $(docker volume ls -q)
This nukes every volume on your system. Only use on development machines where no important data exists.
Safer bulk deletion targeting only dangling volumes:
docker volume rm $(docker volume ls -qf dangling=true)
Removes only unused volumes while leaving active ones intact.
Combine multiple filter criteria:
docker volume prune --filter "until=72h" --filter "label=environment=testing"
This targets volumes older than 72 hours with the label environment=testing. Labels provide a powerful organization for bulk operations.
Common Errors and Troubleshooting
Even with correct commands, you’ll hit errors during volume cleanup. Here’s how to handle the most common issues.
Volume Is In Use Error
This means a container still references the volume. Find which containers use it:
docker ps -a --filter volume=volume_name
Stop and remove those containers before deleting the volume:
docker stop container_id
docker rm container_id
docker volume rm volume_name
Permission Denied Error
Volume permissions might block deletion, especially on Linux. Try running with sudo:
sudo docker volume rm volume_name
For bind mounts, check file permissions on the host directory and adjust if needed.
Volume Not Found Error
You’re trying to delete a volume that doesn’t exist. List all volumes to verify the name:
docker volume ls
Double-check for typos in the volume name.
Volume Takes Too Much Disk Space
Check Docker’s disk usage breakdown:
docker system df -v
This shows exactly how much space each volume consumes. Focus cleanup efforts on the largest volumes.
Cannot Remove Multiple Volumes
If bulk deletion fails partway through, some volumes might be in use. Remove containers first:
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
Then retry volume deletion.
Windows PowerShell Issues
The $(pwd) syntax doesn’t work in PowerShell. Use ${PWD} instead:
docker run --rm -v volume_name:/data -v ${PWD}:/backup alpine tar czf /backup/volume-backup.tar.gz /data
Precautions and Best Practices
Volume deletion is permanent. Once removed, data is gone unless you have backups. Follow these safety practices.
Verify volumes aren’t in use before deletion:
docker ps -a --filter volume=volume_name
If containers appear, stop and remove them first.
Backup critical volumes before cleanup:
docker run --rm -v volume_name:/data -v $(pwd):/backup alpine tar czf /backup/volume-backup.tar.gz /data
This creates a compressed archive in your current directory. On Windows PowerShell, use ${PWD} instead of $(pwd).
Use filters to protect recent volumes:
docker volume prune --filter "until=48h"
This prevents deleting newly created volumes you might still need.
Test prune commands in development first. Run the exact command in a safe environment to understand what gets removed before touching production.
Organize volumes with labels:
docker volume create --label environment=dev --label project=api my-volume
Filter by labels during cleanup:
docker volume prune --filter "label=environment=dev"
This targets only volumes from specific environments or projects.
Schedule maintenance windows for production cleanup. Don’t run aggressive prune operations during peak usage.
Check disk usage before and after cleanup:
docker system df
This shows how much space you’ve reclaimed.
Broader Docker Cleanup
Volume management is one piece of Docker maintenance. Other resources accumulate and need periodic cleanup.
Remove stopped containers:
docker container prune
Containers that exist still consume disk space until you remove them.
Clean up unused images:
docker image prune
This removes only dangling images. For thorough cleanup:
docker image prune -a
This removes all images not associated with running containers. If you’re running a storage server hosting multiple applications, keeping unused images speeds up future deployments.
Remove unused networks:
docker network prune
Networks create iptables rules and routing entries. Cleaning them reduces system clutter.
Comprehensive cleanup of everything:
docker system prune -a --volumes
This removes all stopped containers, unused networks, all unused images, and all unused volumes. Maximum disk space reclamation.
Make system-wide pruning safer with filters:
docker system prune -a --volumes --filter "until=168h"
Only removes resources older than one week.
Follow proper cleanup order: containers first, then volumes, then images. This prevents trying to delete resources still in use. For production Docker environments, proper infrastructure matters. Learn how to host Docker on your server with best practices for security and performance.
Conclusion
Regular volume management keeps your Docker environment running smoothly. List volumes to see what exists, identify dangling volumes, and remove what you don’t need. Always backup important data before cleanup and use filters to protect recent volumes. Beyond volumes, clean up unused containers, images, and networks with docker system prune. Make cleanup part of your weekly routine for development and schedule maintenance windows for production systems.
Need reliable infrastructure for containerized workloads? Our cloud servers provide NVMe storage and generous bandwidth built for Docker deployments. For additional guidance, check our security checklist for production environments.
