docker_practice/image/list.md
2020-11-04 18:03:35 +08:00

8.7 KiB

List all Images

If you want to list all the images downloaded, you can use the command docker image ls or docker images.

$ docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
redis                latest              5f515359c7f8        5 days ago          183 MB
nginx                latest              05a60462f8ba        5 days ago          181 MB
mongo                3.2                 fe9198c04d62        5 days ago          342 MB
<none>               <none>              00285df0df87        5 days ago          342 MB
ubuntu               18.04               f753707788c5        4 weeks ago         127 MB
ubuntu               latest              f753707788c5        4 weeks ago         127 MB

You can see Repository, Tag, Image ID, Created and Size from the list.

Among these, the repository name and tag have been introduced in the basic concepts chapter. Image ID is the unique identifier for the image, and an image can correspond to multiple labels. In the exmaple above, we can see ubuntu:18:04 and ubuntu:latest having the same ID, since they are aliases for the same image.

Image Size

If you pay close attention to all of these. You may find that the disk space they occupy is different from the one at Docker Hub. For example, ubuntu:18.04 is 127MB here, but on Docker Hub, 50MB is displayed. That's because what is shown on Docker Hub is the size after compression. During image download and upload, the image is compressed, because the data transfer is the main factor taken into consideration. However, when we use the command docker image ls, that's the size after expansion. To be more precisely, the total size after expanding all the layers locally, because we care more about local space occupied when an image is on our disk.

One more thing to note is that in the docker image ls list, the total size of images is far less than the actual size. Since the Docker imags are stored in multiple layers, and there are inheritance and reuse, there might be different images using the same basic images and sharing some common layers. As we have mentioned, Docker uses Union FS, we only keep one copy for the same layers, so the actual space occupied is far less than the mere sum.

You can use the following command to see the space utilized by images, containers, data volumes.

$ docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              24                  0                   1.992GB             1.992GB (100%)
Containers          1                   0                   62.82MB             62.82MB (100%)
Local Volumes       9                   0                   652.2MB             652.2MB (100%)
Build Cache                                                 0B                  0B

Dangling Image

In the image list above, we can see a special image, the one without repository name nor tag, all being <none>:

<none>               <none>              00285df0df87        5 days ago          342 MB

This image is originally with name and tag(mongo:3.2). As the official image being maintained, and the release of new versions, when we execute docker pull mongo:3.2, the tag mongo:3.2 is transferred to the new iamge, and the name on the old image is canceled, end up being <none>. Besides, docker pull, docker build might also cause this phenomemon. Because the new and old image are of the same name, the name of the old image is canceled, thus causing the repository and tag both being <none>. These images without tags are also called dangling images, we can use the following commands to show them:

$ docker image ls -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              00285df0df87        5 days ago          342 MB

Generally speaking, the dangling images are useless, we can remove them with the following commands with ease:

$ docker image prune

Intermediate Layer Images

To accelerate the build of images and improve the resource utilization, Docker uses Intermediate Layer Images. So after using Docker for a while, you may see a list of intermediate images as dependencies. The default docker image ls only shows the top images, if you want to show all the images including intermediate images, you need to add the -a paramter.

$ docker image ls -a

You will see a lot of images without tags with this command. Differing from dangling images, these untagged images are intermediate layer images, and are what a lot of other images depend on. These untagged images should not be deleted, otherwise, it will cause missing dependencies errors for upstream images. In fact, these images are not necessary to delete, as we have mentioned, the same layers will be only stored once. These images are dependencies for other images, and their existence will not cause any redundancy, you will need them in any way. They will disappear the moment you delete all the images that reference them.

List Images Partially

Without any parameter, docker image ls lists all the top-level images, but sometimes we only want them partially. docker image ls has several parameters to help us achieve this goal.

To list images based on repository name.

$ docker image ls ubuntu
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               f753707788c5        4 weeks ago         127 MB
ubuntu              latest              f753707788c5        4 weeks ago         127 MB

To list a certain image, specifying repository name and label.

$ docker image ls ubuntu:18.04
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               f753707788c5        4 weeks ago         127 MB

Besides, docker image ls supports the --filter parameter, or simply -f. As we have seen before, using filter to list dangling image, and it has more usages. For example, if we want to see images with edition after mongo:3.2, we can use the following command:

$ docker image ls -f since=mongo:3.2
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
redis               latest              5f515359c7f8        5 days ago          183 MB
nginx               latest              05a60462f8ba        5 days ago          181 MB

If we want to see some versions of images before, we can simply replace since with before.

If we have defined the LABEL during the image build, we can also filter with the LABEL option.

$ docker image ls -f label=com.example.version=0.1
...

Show with Specified Format

By default, docker image ls will show a full list, but we do not need it all the time. For example, when we delete dangling images, we use docker image ls to list all the IDs of dangling images and then pass them over to docker image rm as parameters to remove the specified images. Under this circumstance, we can apply the -q option.

$ docker image ls -q
5f515359c7f8
05a60462f8ba
fe9198c04d62
00285df0df87
f753707788c5
f753707788c5
1e0c3dd64ccd

--filter together with -q to generate a ID list in a specified range, and then passing them over to another docker command as parameter is a common practice for Docker commands. Not only for images, we will see all this kind of combinations in other kinds of commands, with them, we can achieve great functionalities. So when you see some filters while reading the documents, please pay attention to how they are used in practice.

In some other occasions, we may not be content with the table structure and would like to reorganize the columns. In this case, we can use the Go Templates.

For example, using the following commands will list the image results, with only image ID and repository names.

$ docker image ls --format "{{.ID}}: {{.Repository}}"
5f515359c7f8: redis
05a60462f8ba: nginx
fe9198c04d62: mongo
00285df0df87: <none>
f753707788c5: ubuntu
f753707788c5: ubuntu
1e0c3dd64ccd: ubuntu

Or we may want to show the table with equal horizontal tabulations and with title, we can define them by ourselves.

$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID            REPOSITORY          TAG
5f515359c7f8        redis               latest
05a60462f8ba        nginx               latest
fe9198c04d62        mongo               3.2
00285df0df87        <none>              <none>
f753707788c5        ubuntu              18.04
f753707788c5        ubuntu              latest