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.