How to Check Disk Space Usage for Docker Images, Containers and Volumes
Wondering how much space does Docker consume on your Linux system?
Primarily, all Docker images, containers and other related entities are located at /var/lib/docker
. You can check the size of this directory and get the total disk space used by Docker:
avimanyu@iborg-desktop:~$ sudo du -sh /var/lib/docker
4.9G /var/lib/docker
But that's not very descriptive and you may have to go further in this directory to see which component uses what space.
Thankfully, Docker has provided tools to get this information in more useful way.
Checking Docker disk space usage [The Docker Way]
The most basic, "Docker" way to know how much space is being used up by images, containers, local volumes or build cache is:
docker system df
When you run this command (use sudo
if necessary), you get all disk usage information grouped by Docker components.
avimanyu@iborg-desktop:~$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 4 4 1.065GB 0B (0%)
Containers 4 4 5.705kB 0B (0%)
Local Volumes 7 7 1.108GB 0B (0%)
Build Cache 0 0 0B 0B
This is definitely better than looking at the total size of /var/lib/docker. You can see how much space is consumed by images, containers and volumes.
However, this still does provide a clear picture on which image or volume takes more space.
Actually, it does. The docker system df
command has the verbose option -v
that gives all these details.
docker system df -v
Here's the verbose output:
avimanyu@iborg-desktop:~$ docker system df -v
Images space usage:
REPOSITORY TAG IMAGE ID CREATED SIZE SHARED SIZE UNIQUE SIZE CONTAINERS
ghost 4.32.0 b40265427368 8 weeks ago 468.8MB 0B 468.8MB 1
jrcs/letsencrypt-nginx-proxy-companion latest 037cc4751b5a 13 months ago 24.35MB 0B 24.35MB 1
jwilder/nginx-proxy latest 509ff2fb81dd 15 months ago 165MB 0B 165MB 1
mariadb 10.5.3 f5d2bcaf057b 20 months ago 407MB 0B 407MB 1
Containers space usage:
CONTAINER ID IMAGE COMMAND LOCAL VOLUMES SIZE CREATED STATUS NAMES
899cc90e85d9 ghost:4.32.0 "docker-entrypoint.s…" 1 0B 8 weeks ago Up 8 weeks ghost_ghost_6
17b58fdafbce jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 4 571B 3 months ago Up 2 months letsencrypt-proxy-companion
58f99f46ee03 jwilder/nginx-proxy "/app/docker-entrypo…" 5 5.13kB 3 months ago Up 2 months jwilder-nginx-proxy
fb907286b60e mariadb:10.5.3 "docker-entrypoint.s…" 1 2B 3 months ago Up 2 months ghost_db_1
Local Volumes space usage:
VOLUME NAME LINKS SIZE
ghostdb 1 434.7MB
jwilder-nginx-with-ssl_acme 2 36.09kB
jwilder-nginx-with-ssl_certs 2 25.12kB
jwilder-nginx-with-ssl_dhparam 1 1.525kB
jwilder-nginx-with-ssl_html 2 1.106kB
jwilder-nginx-with-ssl_vhost 2 556B
ghost 1 674MB
Build cache usage: 0B
CACHE ID CACHE TYPE SIZE CREATED LAST USED USAGE SHARED
That's nice, right? There are other ways too.
Checking docker image sizes
If you just want to see the Docker images and their sizes, you may also use this command:
docker image ls
It lists all the Docker images on your system with a few details that include the size:
avimanyu@iborg-desktop:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest beae173ccac6 6 weeks ago 1.24MB
ubuntu latest fb52e22af1b0 5 months ago 72.8MB
alpine latest 49f356fa4513 10 months ago 5.61MB
hello-world latest d1165f221234 11 months ago 13.3kB
Checking running container sizes
Similarly, if you want to know the size of running Docker containers, you can use the docker ps command:
docker ps --size
You should see a SIZE column added to the output of the command:
avimanyu@iborg-desktop:~$ docker ps --size
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
1171dcfb7e06 alpine "sleep 10" 10 months ago Up 9 seconds always-policy 0B (virtual 5.61MB)
Do you notice how it says 0B and then shows a virtual 5.61 MB? The virtual size includes the shared underlying image.
Let us go back to the Linux approach into it more specifically, with the Alpine image and container as a hands-on example.
Using standard Linux commands to analyze Docker disk space usage
Whenever you use the docker pull
command or run docker-compose up -d
to prepare the launch of applications, this is how you look for image space usage, actually stored on an Ubuntu 20.04 server:
sudo du -sh /var/lib/docker/overlay2/<hash-named-directory>/
Here, Overlay2 is the default Docker storage driver on Ubuntu. You can confirm this by running the docker info
command and looking for the Storage Driver:
Storage Driver: overlay2
If this is different than yours, then you're using a different storage driver for Docker. Likewise, the directory location would be named as per the same storage driver. Availability of the storage driver depends upon kernel support.
Specific Image Disk Usage
If you are looking for the locations of specific images, you can use the Docker inspect command for the pulled image. Say, for example, I've pulled the alpine image with docker pull alpine
. Run the following command to inspect it:
$ docker inspect alpine
Once you run the command, you'll notice three fields inside the Data
subsection under GraphDriver
:
...
"GraphDriver": {
"Data": {
"MergedDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/merged",
"UpperDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
"WorkDir": "/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/work"
},
...
Based on the above information, you can see that the (mentioned earlier in the du
command syntax) in this case is 64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
.
Here, you can run the following command to reveal the amount of space being used by the Alpine image:
avimanyu@iborg-desktop:~$ sudo du -sh /var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
6.0M /var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e
Similarly, like images, containers are also stored inside the same storage driver based directory.
/var/lib/docker/overlay2
Specific Container Disk Usage
If you are looking for the locations of specific containers, you can again use the inspect
command on Docker for the running container. Say, for example, I've run the alpine container with docker run -ti -d alpine
. When you run docker ps
, you'll see that it's running:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb341d6a28fa alpine "/bin/sh" 6 seconds ago Up 5 seconds confident_banzai
Here, the container has been randomly named confident_banzai
. So let's inspect it:
$ docker inspect confident_banzai
Once you run the above command, you'll notice all the four fields mentioned earlier inside the Data
subsection under GraphDriver
. These locations are where the container data is physically stored on your host system just as you saw for images:
...
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3-init/diff:/var/lib/docker/overlay2/64c9c0cf8c9cfb0e2168071df0652a317d49f58a68fe86e4a9a9a525ab9e365e/diff",
"MergedDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/merged",
"UpperDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/diff",
"WorkDir": "/var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3/work"
},
"Name": "overlay2"
},
...
Now you can use the du
command again:
avimanyu@iborg-desktop:~$ sudo du -sh /var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3
32K /var/lib/docker/overlay2/d734685e284c92bdcb6063ac292a48813f30f4b0b2dd6fa2882279c569e506a3
Unlike Docker images and containers, the physical locations for volumes is pretty straightforward. Volumes are located at:
/var/lib/docker/volumes/
Therefore, you can run the following command to know the entire Docker volume disk space usage on your system:
avimanyu @iborg-desktop:~$ sudo du -sh /var/lib/docker/volumes/
60K /var/lib/docker/volumes/
Specific Volume Disk Usage
In this case, there are two types primarily. One is regular Docker volumes and the other is bind mounts.
Docker Volumes
If you are looking for the locations of specific volumes, you can use the docker volume ls
command first and check the volume name or ID. Say, for example, I've run the alpine container with the following command with a volume:
docker run -ti -d --name alpine-container -v test-data:/var/lib/app/content alpine
Now, a volume named test-data
will automatically get created. Let's now create a file named test.md
inside this location:
$ docker exec alpine-container sh -c "touch /var/lib/app/content/test.md"
Verify the file has indeed been created:
$ docker exec -ti alpine-container sh
/ # ls /var/lib/app/content/
test.md
/ # exit
When you run docker volume ls
, the volume named test-data
would be listed:
$ docker volume ls
DRIVER VOLUME NAME
local d502589845f7ae7775474bc01d8295d9492a6c26db2ee2c941c27f3cac4449d1
local e71ee3960cfef0a133d323d146a1382f3e25856480a727c037b5c81b5022cb1b
local test-data
Finally, you can confirm the actual location of the file on your host system:
$ sudo ls -l /var/lib/docker/volumes/test-data/_data
total 0
-rw-r--r-- 1 root root 0 Oct 6 23:20 test.md
Therefore, the path for the mounted volume is always located inside a directory named _data
inside the respective volume directory.
So, you can use the du
command here again for specific volumes!:
avimanyu@iborg-desktop:~$ sudo du -sh /var/lib/docker/volumes/test-data/_data
4.0K /var/lib/docker/volumes/test-data/_data
Always remember to note the volume name every time you want to find out how much space your volume is using.
Bind Mounts
This is the only exception in Docker where you have to use a Linux approach to monitor disk space usage. At the same time, it is always preferable to stop the running containers first.
$ mkdir /home/avimanyu/test-data
$ docker run -ti -d --name alpine-container -v /home/avimanyu/test-data:/var/lib/app/content alpine
In this case, a bind mounted volume named test-data
will become available on the container side as /var/lib/app/content
.
avimanyu@iborg-desktop:~$ sudo du -sh /home/avimanyu/test-data
4.0K /home/avimanyu/test-data
You can also test the same thing inside the container:
avimanyu@iborg-desktop:~$ sudo docker exec -ti alpine-container sh
/ # du -sh /var/lib/app/content
4.0K /var/lib/app/content
As you can see, both the sizes reported above are the same because they are actually bind mounts.
Docker logs on the host are always stored in volumes. Using the described way in this section, users can also navigate and find that out by looking at docker volumes disk space usage. This varies from app to app and the location of log files in the app volumes.
Bonus Tips
Based on what you learned till now, very obviously, you can also use the following command to fetch the disk usage of images and containers together:
sudo du -sh /var/lib/docker/overlay2
Docker logs on the host are always stored in volumes. A usually large Docker volume would most likely indicate that logs have been piling up and are being managed inefficiently.
Using the described way in the volumes' section of this article, users can also navigate and mitigate this by looking at docker volumes disk space usage. This varies from app to app and the location of log files in the app volumes.
Summary
In this tutorial, I've taken a generic Linux based approach to show you how to find out disk space occupancy of Docker images, containers and volumes residing on your Linux server at the host level. You also learned how to do it the preferred (Docker) way.
If you want to share any feedback, comment or suggestion towards this approach, please leave your thoughts in the comment section below