The Problem: Docker Is Eating Your Disk Space
Symptoms of Docker Disk Space Issues
Your Docker host is running out of space. Again.
Youβve been spinning up containers, testing new services, building images. Everythingβs humming along nicely. Then suddenly, boom your system starts throwing errors because the root filesystem is full. You check your disk usage and see Dockerβs eaten up 200GB of space. Wait, what? How did this even happen?
Why Docker Accumulates Space
Hereβs whatβs going on
Honestly, Dockerβs trying to be helpful. Think about it: when you stop a container, what if you want to restart it later with the same data? Docker doesnβt just nuke everything. Volumes stick around even after containers are gone. Build cache hangs out to make your next build faster. Old images stay put βjust in caseβ you need them again.
This makes total sense for production. But in a home lab where youβre constantly trying new stuff? It turns into a slow pile-up of junk. That database volume from three months ago? Still there. Build cache from a project you ditched? Yep, still hanging around. Images you pulled once for curiosity and never touched again? All of it adds up.
Checking Whatβs Using Your Space
Letβs see whatβs actually eating your space. Run this:
docker system dfYouβll probably see something like this:
TYPE TOTAL ACTIVE SIZE RECLAIMABLEImages 47 12 23.5GB 15.2GB (64%) # 15GB we could get back!Containers 15 8 2.1GB 1.3GB (61%)Local Volumes 89 24 45.8GB 38.2GB (83%) # Ouch, 38GB of unused volumesBuild Cache 156 0 12.3GB 12.3GB (100%) # 100% unused. All of it.Look at that. 66GB of space just sitting there doing nothing. And hereβs the kicker: if your Docker volumes live on your root filesystem (which they probably do), your entire system starts falling apart when space runs out. Databases start refusing connections. Package managers throw errors. Containers canβt write logs. Itβs a mess.
The Risks of Manual Docker Cleanup
Built-in Docker Prune Commands
Sure, you can manually prune stuff with Dockerβs built-in commands:
# These work, but they're scary to run blindlydocker image prune # Removes unused images. Pretty safe.docker volume prune # Removes unused volumes. WAIT, ARE YOU SURE?docker system prune # Nuclear option. Add -a and you're in danger territory.Why Manual Cleanup Is Risky
But hereβs the thing. It always feels risky. Are those volumes actually unused? What if you delete something you needed? I made this mistake early on. I thought Iβd be smart and just manually deleted folders in /var/lib/docker/volumes. Big mistake. I nuked persistent data I actually cared about because I couldnβt tell what was important.
The built-in prune commands are safer than my dumb folder deletion, but theyβre still pretty blunt. Itβs all or nothing. Plus, if youβve got multiple Docker hosts? Now youβre SSHing into each one, running the same commands over and over. That gets old real quick.
Enter PruneMate: Actually sensible Docker cleanup
What Makes PruneMate Worth Using
PruneMate is an open-source tool that fixes all this. It shows you whatβs eating your space, lets you pick exactly what to clean, and runs it all on a schedule so you donβt have to think about it.
What makes it worth using:
- Visual dashboard that shows where your space is going across all your Docker hosts
- Granular control pick images, volumes, networks, containers, or build cache. Your choice.
- Preview mode see exactly whatβll get deleted before you pull the trigger
- Scheduled cleanup jobs that run automatically while you sleep
- Remote host support using Docker Socket Proxy (no SSH needed)
- Notifications via Gotify, ntfy, Discord, or Telegram
Instead of SSHing around and guessing whatβs safe to delete, you get one clean interface that manages everything. Way better.
Setting Up PruneMate
Just deploy the container on one of your Docker hosts with Docker Compose. Hereβs all you need:
services: prunemate: image: anoniemerd/prunemate:latest container_name: prunemate ports: - '7676:8080' # Access the web UI on port 7676 volumes: # Give PruneMate access to Docker on this host - /var/run/docker.sock:/var/run/docker.sock # Keep logs and config between restarts - ./prunemate/logs:/var/log - ./prunemate/config:/config environment: - PRUNEMATE_TZ=America/New_York # Change to your timezone - PRUNEMATE_TIME_24H=true # Or false if you prefer AM/PM # Optional: Add a password to protect the interface # - PRUNEMATE_AUTH_USER=admin # - PRUNEMATE_AUTH_PASSWORD_HASH=your_hash_here restart: unless-stoppedBring it up:
docker compose up -dNow just open http://your-host:7676 in your browser and youβre good to go.
Managing Multiple Docker Hosts
If you want to manage other Docker hosts remotely, just set up a Docker Socket Proxy on each one. This lets PruneMate connect safely without giving it full access to the Docker socket (which would be a security nightmare):
services: dockerproxy: image: ghcr.io/tecnativa/docker-socket-proxy:latest environment: # These control what PruneMate can do via the proxy - CONTAINERS=1 # Let it see and manage containers - IMAGES=1 # Let it manage images - NETWORKS=1 # Let it manage networks - VOLUMES=1 # Let it manage volumes - BUILD=1 # Needed for cleaning build cache - POST=1 # Needed for actually running prune commands ports: - '2375:2375' # Standard Docker API port volumes: # Read-only access to Docker socket. Much safer. - /var/run/docker.sock:/var/run/docker.sock:ro restart: unless-stoppedDeploy this on each remote host, then add them to PruneMateβs interface with their hostname and port 2375. Done. Now youβre managing your entire home lab from one place.
Using PruneMate Effectively
The Interface and Cleanup Options
The interface is super straightforward. Youβve got checkboxes for what to clean:
- All unused containers
- All unused images
- All unused networks
- All unused volumes
- All build cache
By default, only unused images are checked. Smart choice images are easy to pull again if you need them. Volumes though? Those might have data you actually care about, so PruneMate leaves them alone unless you explicitly say otherwise.
A Typical Cleanup Process
Hereβs what a typical cleanup looks like:
- Check the boxes for what you want to clean
- Hit βPreview & Runβ
- Look at what itβs about to delete (with size estimates)
- If it looks good, hit βConfirm & Executeβ
- Get a notification when itβs done
That preview step is clutch. Youβre not going in blind. Youβll see something like βAbout to delete 50 unused volumes and free up 38GBβ before anything happens. If something looks sketchy, you can bail out.
Setting Up Automated Cleanup
For automated cleanup, I set up a schedule. Hereβs mine:
- Images and containers: Weekly cleanup
- Build cache: Weekly (I rebuild often, so cache gets stale fast)
- Volumes: Manual only (way too risky to automate)
This keeps everything clean without me having to remember. The notifications tell me what got cleaned up, so I stay in the loop without babysitting it.
PruneMate vs Manual Cleanup
The Trade-offs Comparison
Letβs be real about the trade-offs:
| Manual Cleanup | PruneMate | |
|---|---|---|
| Visibility | Run docker system df on each host manually | Dashboard shows all hosts at once |
| Safety | High risk with wrong flags (-a, --volumes) | Preview before deletion, focused on unused resources |
| Granularity | All-or-nothing (especially with system prune) | Pick exactly what to clean |
| Remote hosts | SSH to each one individually | Manage all hosts from one interface |
| Automation | Requires cron jobs or CI/CD pipelines | Built-in scheduler with notifications |
| Learning curve | Forces you to understand Docker maintenance | Hides complexity (good and bad) |
| Time investment | High upfront to script it properly | 10 minutes to deploy and configure |
Why This Matters Now
Look, manual cleanup teaches you how Docker actually works under the hood, and thatβs valuable. But once you get it? Thereβs no point in running the same commands manually forever. PruneMate handles the tedious stuff while keeping you in the loop with notifications. Best of both worlds.
Hereβs the thing. Component prices are going crazy right now. A 1TB NVMe that cost $80 last year? Try $150 now. Thanks, AI boom. If you canβt just throw money at bigger drives, you need to make better use of what youβve got.
Docker disk space management is one of those problems you ignore until it bites you. Then your systemβs already falling apart. Logs wonβt write. Databases run out of room. New deployments fail because thereβs no space for images. By the time you notice, youβre in crisis mode.
PruneMate keeps you ahead of this by cleaning up automatically. Itβs not sexy, but it solves a real problem before it becomes your problem.
Bottom Line and Recommendation
If youβre running Docker anywhere (home lab, production, whatever), disk space maintenance isnβt optional. You can handle it manually with discipline and shell scripts. Or you can let PruneMate do it automatically while you work on stuff that actually matters.
Grab it here: PruneMate on GitHub
What about you?
How are you handling Docker cleanup? Manual commands? Custom scripts? Already using some automation tool? Let me know whatβs working for you!