Visualizing and pruning the docker image tree
Visualizing the Docker image dependency tree is a useful way of checking image sizes and inter-image dependencies. Since images occupy a lot of disk space, we may also want to prune unused images.
Visualizing image dependencies
In version 1.2.0 of Docker, the image dependency tree is available via
the docker images --tree
command:
$ docker images --tree
Warning: '--tree' is deprecated, it will be removed soon. See usage.
├─511136ea3c5a Virtual Size: 0 B
│ ├─5bc37dc2dfba Virtual Size: 192.5 MB
│ │ └─61cb619d86bc Virtual Size: 192.7 MB
│ │ └─3f45ca85fedc Virtual Size: 192.7 MB
│ │ └─78e82ee876a2 Virtual Size: 192.7 MB
│ │ └─dc07507cef42 Virtual Size: 192.7 MB
│ │ └─86ce37374f40 Virtual Size: 192.7 MB
│ │ └─d76983dc2ebd Virtual Size: 213.3 MB
│ │ └─04a01662a6a8 Virtual Size: 214.5 MB
│ │ └─7769c00dfefe Virtual Size: 525.9 MB
│ │ └─6ac8d6e449b1 Virtual Size: 525.9 MB
│ │ └─e3a84ca24205 Virtual Size: 525.9 MB
│ │ └─26f10d07659d Virtual Size: 525.9 MB
│ ├─e12c576ad8a1 Virtual Size: 198.9 MB
│ │ └─102eb2a101b8 Virtual Size: 199.1 MB
│ │ └─530dbbae98a0 Virtual Size: 199.1 MB
│ │ └─37dde56c3a42 Virtual Size: 199.1 MB
│ │ └─8f118367086c Virtual Size: 228.5 MB
│ │ └─277eb4304907 Virtual Size: 228.5 MB Tags: ubuntu:utopic, ubuntu:14.10
...
However, the Docker team is trying to streamline its client, and has scheduled this feature for deprecation. How, then, do we replicate its behavior?
Enter DockerViz. Grab a binary from gobuild.io and place it somewhere on your path.
Querying the Docker image status
The Docker server can be queried via its
public API.
It is typically available either on http://localhost:4243
or
/var/run/docker.sock
.
One of the following two calls should therefore extract the image status:
curl -s http://localhost:4243/images/json?all=1
echo -e "GET /images/json?all=1 HTTP/1.0\r\n" | nc -U /var/run/docker.sock
On my machine, the second query returns:
HTTP/1.0 200 OK
Content-Type: application/json
Date: Sun, 18 Jan 2015 17:41:34 GMT
[{"Created":1421528518,"Id":"d6244a9e8b5ff885579c8c7d203e4da703e3e80621449dbbd58c365dba5c83b1","ParentId":"b68521997660ae8a6916037696cf716ca415bba0766487bfa5b79cda4adfb62c","RepoTags":["datascience-base:latest"],"Size":0,"VirtualSize":2041562468}
,{"Created":1421528517,"Id":"b68521997660ae8a6916037696cf716ca415bba0766487bfa5b79cda4adfb62c","ParentId":"d3cb571e5e16fce16a59c16c87e01ea4051d7cae016dba90688c9e4a53a921c4","RepoTags":["\u003cnone\u003e:\u003cnone\u003e"],"Size":0,"VirtualSize":2041562468}
...
DockViz parses this JSON and outputs a formatted tree:
$ cat ~/scripts/docktree
echo -e "GET /images/json?all=1 HTTP/1.0\r\n" | nc -U /var/run/docker.sock | tail -n +5 | dockviz images --tree
$ docktree
├─511136ea3c5a Virtual Size: 0.0 B
│ ├─5bc37dc2dfba Virtual Size: 192.5 MB
│ │ └─61cb619d86bc Virtual Size: 192.7 MB
│ │ └─3f45ca85fedc Virtual Size: 192.7 MB
│ │ └─78e82ee876a2 Virtual Size: 192.7 MB
│ │ └─dc07507cef42 Virtual Size: 192.7 MB
│ │ └─86ce37374f40 Virtual Size: 192.7 MB
│ │ └─d76983dc2ebd Virtual Size: 213.3 MB
│ │ └─04a01662a6a8 Virtual Size: 214.5 MB
│ │ └─7769c00dfefe Virtual Size: 525.9 MB
│ │ └─6ac8d6e449b1 Virtual Size: 525.9 MB
│ │ └─e3a84ca24205 Virtual Size: 525.9 MB
│ │ └─26f10d07659d Virtual Size: 525.9 MB
│ ├─e12c576ad8a1 Virtual Size: 198.9 MB
│ │ └─102eb2a101b8 Virtual Size: 199.1 MB
│ │ └─530dbbae98a0 Virtual Size: 199.1 MB
│ │ └─37dde56c3a42 Virtual Size: 199.1 MB
│ │ └─8f118367086c Virtual Size: 228.5 MB
│ │ └─277eb4304907 Virtual Size: 228.5 MB Tags: ubuntu:14.10, ubuntu:utopic
Note that, on my system, the first branch of the tree is dangling, i.e. not associated with a tagged image–I must have removed a tagged image earlier, and these are its remaining dependencies.
Pruning unusued images
Built and downloaded Docker images quickly gobble up a lot of space:
$ sudo du -hcs /var/lib/docker/
10G /var/lib/docker/
10G total
The docker images
command allows us to
list dangling images:
docker images --filter dangling=true --quiet
And we obtain a list of containers (images that were fired up and modified) using:
docker ps -aq
I remove both of these with the following script (WARNING: This will delete ALL containers and any unused, downloaded images, so use with caution!):
#!/bin/bash
CONTAINERS=$(docker ps -aq)
IMAGES=$(docker images --filter dangling=true --quiet)
if [[ $CONTAINERS ]]; then
docker rm $CONTAINERS
else
echo "No containers to remove"
fi
if [[ $IMAGES ]]; then
docker rmi $IMAGES
else
echo "No dangling images to remove"
fi
Then:
$ docker-clean
$ sudo du -hcs /var/lib/docker/
6.6G /var/lib/docker/
6.6G total
$ docktree
└─511136ea3c5a Virtual Size: 0.0 B
├─e12c576ad8a1 Virtual Size: 198.9 MB
│ └─102eb2a101b8 Virtual Size: 199.1 MB
│ └─530dbbae98a0 Virtual Size: 199.1 MB
│ └─37dde56c3a42 Virtual Size: 199.1 MB
│ └─8f118367086c Virtual Size: 228.5 MB
│ └─277eb4304907 Virtual Size: 228.5 MB Tags: ubuntu:utopic, ubuntu:14.10
├─d497ad3926c8 Virtual Size: 192.5 MB
│ └─ccb62158e970 Virtual Size: 192.7 MB
│ └─e791be0477f2 Virtual Size: 192.7 MB
...
Note that, now, all branches of the tree are associated with tagged
images. If I remove ubuntu:utopic
, I can again run the pruning
process to get rid of its left-over dependencies.