As developers, we know the pain all too well. You‘re humming along building containerized apps with Docker when suddenly – the dreaded “no space left on device” error grinds your progress to a halt.
Docker needs available disk space to run containers, store images, write logs and more. So running out cripples all Docker operations on your infrastructure.
In this epic 2600+ word guide, you‘ll learn exactly why Docker runs out of disk space and how to fix it for good.
We’ll cover:
- Common causes of Docker‘s “no space left” error
- Clearing out unused containers, volumes, images & networks
- Pruning & deleting large Docker image files
- Controlling container logging outputs
- Removing orphaned data volumes
- Setting Docker disk usage quotas
- Optimizing storage drivers for efficiency
- Relocating Docker‘s storage location entirely
- And complementary approaches for a robust, long-term solution.
Ready to finally conquer the "out of disk" error once and for all? Let‘s dig in…
Why Docker Runs Out of Space: Root Causes & Contributing Factors
Like any technology, we need to begin by understanding the root causes of Docker‘s disk space issues before applying fixes like duct tape over a leaky pipe.
There are 4 main contributors to the "no space left" error:
1. Accumulation of Unused Docker Objects
- Docker retains stopped containers, cached images, orphaned volumes and obsolete networks unless explicitly removed
- This digital "junk" piles up quickly, consuming GBs of disk space
2. Large Base Images & Dockerfiles
- Stacking layers and dependencies leads to corpulent underlying images
- Images over 1-2+ GB each become commonplace
3. Container Logs & Temporary Data
- STDOUT/STDERR logs can consume megabytes per app per day
- Writable container layers store temporary data that lingers after exit
4. Inefficient Storage Driver Configurations
- Non-ideal disk formats, volumes, graph drivers degrade Docker‘s filesystem performance over time
Critically, these factors compound each other too. Installing 5GB+ images while logs and temp data accrue from layers based on those same underlying images. Like a snake eating its tail, available disk space keeps disappearing.
Reclaiming Space from Unused Docker Objects
The most effective first step is clearing out accumulated container clutter – the digital equivalents of dust bunnies clogging your Docker host.
Here’s how to clean up unused containers, images, volumes, networks and cache:
docker system prune
This tidies up:
- All stopped containers
- All unused networks
- All dangling images
- All build cache
You‘ll see Docker reclaim GBs almost instantly in some cases:
Total reclaimed space: 1.746GB
For even more vigorous garbage collection, add the -a
parameter:
docker system prune -a
Now all stopped containers, dangling images, and crucially, unused local volumes get removed.
Be advised -a
will likely break running containers still needing those volumes. So verify workloads aren‘t disrupted before innocently prune -a
-ing!
You can selectively prune just images, containers or volumes too:
docker image/container/volume prune
Regularly pruning your Docker hosts – with caution – prevents unused digital artifacts from hogging your precious, constrained disk space forever.
Managing Large Base Images & Dockerfiles
Okay, you‘ve pruned unused containers and images. But Docker still reports that pesky “no space left” error.
Chances are there are bulky base images and overweight Dockerfiles taking up the lion‘s share of disk real estate.
Luckily, Docker makes it easy to inspect image sizes:
docker images
This lists all images on your system along with file sizes:
Whoa! No wonder my 1TB volume feels cramped. Those CUDA/Tensorflow builds are 800+ MB each!
Time for some Marie Kondo-style digital minimalism.
Identify images wasting space that containers no longer use and delete them:
docker rmi <image-id>
For slimming down existing Dockerfiles, best practices include:
- Multi-stage builds to keep only essential runtime artifacts
- Leveraging small base images like Alpine
- Avoiding unnecessary tools & bloat during compilation
- Flattening layers with careful
RUN
instruction ordering - Not re-installing dependencies that never change
Building optimized Dockerfiles saves GBs of disk space per host over time.
Controlling Container Logging Outputs
Here‘s another insidious disk space creep – verbose container logging sucking up GBs.
By default, Docker‘s json-file
logging driver lets container STDOUT/STDERR logs grow infinitely large.
See for yourself – spin up a test container:
docker run -d --name test alpine bash -c "while true; do echo hello world; sleep 1; done"
Eventually Docker reports available storage vanishing yet again.
Check the logging directory:
sudo du -sh /var/lib/docker/containers
Who knew hello world
could consume 10+ GB?
Thankfully, we can set log rotation policies at container startup:
docker run --log-opt max-size=10m --log-opt max-file=5 alpine ping 8.8.8.8
This caps logs at 10 MB per container, rotating through 5 separate log files.
Further tuning write throttles, log expiry durations and more staves off this sneaky disk space attack vector.
Alternatively, aggregate container logs centrally with remote logging services like Datadog or AWS CloudWatch. More cost but prevents logfile buildup locally.
Removing Orphaned Docker Volumes
Next up – orphaned volumes strangling available storage.
When containers using mounted volumes crash unexpectedly, sometimes links between the container and volume break.
The volume itself persists, now orphaned – occupying your rapidly shrinking storage pool without any application to access it.
Finding these broken volumes is easy:
docker volume ls -qf dangling=true
Then prune each orphaned volume specifically:
docker volume rm <volume id or name>
Repeat for all unused volumes to reclaim capacity.
Prevent future orphans by mapping known named volumes rather than unnamed anonymous volumes when possible using the --name
flag.
Regular orphan hunts keep wasted space from piling up with unused volumes that escaped deletion. Just be very sure they’re truly not utilized anymore!
Setting Docker Disk Usage Quotas
Even with cleaning unused objects, slimming images and controlling logs, you may need to actively restrict how much disk space Docker itself or containers can consume.
Thankfully, Docker provides args for capping disk usage via:
- Per-container storage request/limits
- Global daemon quota enforcement
For instance, create a container limiting its writable layer, container logs and other local disk usage to fixed thresholds:
docker run -it --name test
--memory="200m"
--memory-swap="1g"
--cpu-shares=100
--blkio-weight=10 ubuntu bash
This limits memory, swap, CPU and importantly – blkio disk weight for just this container.
You can further tune disk requests and limits per container with --storage-opt
:
--storage-opt size=120G
For even stricter organization-wide limits, enable Docker daemon quota support:
https://docs.docker.com/config/containers/resource_constraints/
Set global soft and hard limits for physical storage consumed across all Docker resources – images, containers, volumes – preventing rampant disk capacity erosion.
Mix container-specific policies and cluster-wide constraints to keep Docker disk usage on a diet.
Optimizing Storage Drivers & Configuration
Getting advanced now – hang tight!
Carefully configuring how Docker utilizes available storage optimizes disk performance and access efficiency.
Because even if you have disk space…slow, bloated storage drivers introduce friction that grinds Docker ops to a crawl.
For instance, Ubuntu defaults to aufs
while RHEL uses devicemapper
. Both work but have drawbacks for durability and speed.
Benefits of overlay2
over aufs
:
- Better performance for image and container read-write ops
- Native Linux union filesystem – leverages OS page cache
Benefits of direct-lvm
mode device mapper config:
- Avoids known performance issues with loopback devices
- Designed from ground-up for container images/writable layers
Consult official guidelines based on your Linux distribution, Kubernetes specs and cloud provider to pick ideal graph drivers and usage policies tailored to your Docker environment.
No one-size fits all – but unoptimized storage config = eventual Docker system failure when (not if) you run out of disk when needed most!
Relocating Docker‘s Storage Location
Despite your best efforts pruning images, right-sizing containers, and tuning storage drivers – available disk space may still dwindle to zero.
On Linux systems, Docker stores image layers, writable container data and volumes under /var/lib/docker
by default.
If your root partition lacks capacity, consider moving /var/lib/docker
to a mounted drive with ample room.
For example, dedicate a spacious 1TB /dev/vdb
solely for Docker‘s storage location:
service docker stop
mv /var/lib/docker /bigdockerdrive
ln -s /bigdockerdrive /var/lib/docker
service docker start
With datasets exceeding 100+ GB even for small projects, relocating Docker‘s storage home warrants serious consideration – especially in cloud environments with burst-prone boot disks.
Just know host OS reinstalls may break symlinks. Plan accordingly.
Fix Docker Disk Issues FOR GOOD – Best Practices
We‘ve covered 8 battle-tested techniques to eliminate Docker‘s literal and figurative "disk full" errors.
To recap, in order:
1. Prune unused containers, volumes, images & networks
2. Remove large, outdated Docker images
3. Control container log file outputs
4. Delete orphaned anonymous volumes
5. Set Docker daemon and per-container disk quotas
6. Optimize Docker storage drivers & configurations
7. Relocate Docker‘s storage volume/directory
8. Monitor disk usage actively via docker system df
But no single method represents a silver bullet.
Docker disk space management demands persisting vigilance across all vectors.
I recommend crafting a Docker Disk Usage Policy – an organizational manifesto codifying protocols like:
- Scheduled community pruning days
- Automated volume & image gc workflows
- Preferred storage drivers per Linux distribution
- Max image size guidance
- Disk usage alerting thresholds
- And more…
By declaring "This is how we keep Docker lean and performant", teams avoid one-off symptomatic treatments at the expense of holistic health.
Adopting an integrated blizzard of best practices makes running out of precious Docker disk capacity a worry of the past.
Now go – enjoy the containerized future freely again!