Docker の実験（その１２：イメージのクリーンアップ・検索）

[その１１：イメージの調査](https://qiita.com/intrajp/items/b7d26517fb7e8d7ef609)のつづき。

コンテナを作成していくと、特に異なるイメージに関わるものであると、リポジトリからイメージを引っ張ってくることになり、vm インスタンスの容量がどんどん圧迫されてしまう。
使用されていないイメージは適当に削除しておくのがよい。
Dangling Images (タグがなく、コンテナ化もされていない) の削除。

実験を重ねていたら、Dangling images が増えてしまった。これらは vm インスタンスの容量を圧迫しており、よろしくないので、削除したい。

```bash
$ docker images -a
REPOSITORY                                     TAG       IMAGE ID       CREATED        SIZE
layerdemo2                                     latest    9f16192943d8   20 hours ago   77.8MB
<none>                                         <none>    ec0e3e38bebb   20 hours ago   77.8MB
layerdemo                                      latest    784c3f9f12e6   20 hours ago   288MB
<none>                                         <none>    8074ba695e4a   20 hours ago   288MB
<none>                                         <none>    539564a6bf0b   20 hours ago   288MB
<none>                                         <none>    a98e8ee2bdef   20 hours ago   183MB
<none>                                         <none>    f2b014774e62   35 hours ago   175MB
<none>                                         <none>    5e443cc82858   35 hours ago   175MB
<none>                                         <none>    ede4075dc036   36 hours ago   175MB
<none>                                         <none>    60ea0cbe0bb1   36 hours ago   175MB
<none>                                         <none>    4b3e66e5edd1   36 hours ago   119MB
nginx                                          latest    3f8a00f137a0   10 days ago    142MB
asia.gcr.io/<project-id>/ubuntu-image   latest    58db3edaf2be   3 weeks ago    77.8MB
ubuntu                                         latest    58db3edaf2be   3 weeks ago    77.8MB
```

以下のコマンドを実行してみる。

```bash
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
```

回復された容量がゼロ？
Dangling images が削除されたかを確認する。

```bash
$ docker images -a
REPOSITORY                                     TAG       IMAGE ID       CREATED        SIZE
layerdemo2                                     latest    9f16192943d8   20 hours ago   77.8MB
<none>                                         <none>    ec0e3e38bebb   20 hours ago   77.8MB
layerdemo                                      latest    784c3f9f12e6   21 hours ago   288MB
<none>                                         <none>    8074ba695e4a   21 hours ago   288MB
<none>                                         <none>    539564a6bf0b   21 hours ago   288MB
<none>                                         <none>    a98e8ee2bdef   21 hours ago   183MB
<none>                                         <none>    f2b014774e62   35 hours ago   175MB
<none>                                         <none>    5e443cc82858   35 hours ago   175MB
<none>                                         <none>    60ea0cbe0bb1   36 hours ago   175MB
<none>                                         <none>    ede4075dc036   36 hours ago   175MB
<none>                                         <none>    4b3e66e5edd1   36 hours ago   119MB
nginx                                          latest    3f8a00f137a0   10 days ago    142MB
asia.gcr.io/<project-id>/ubuntu-image   latest    58db3edaf2be   3 weeks ago    77.8MB
ubuntu                                         latest    58db3edaf2be   3 weeks ago    77.8MB
```

あれ、削除されなかった。
では、コンテナ化されていないイメージをすべて削除する。

```bash
$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: layerdemo2:latest
deleted: sha256:9f16192943d84def9e32a2fb9789022079c25aa7632788d18ca346086e8505ba
deleted: sha256:42caebe64de0229455c3992a1e4c334907f652ee8c39621553e349e3ad95fe66
deleted: sha256:ec0e3e38bebbdfe0cca45a88a74a936034544c8257edfc0a4a83e49fdd53897c
deleted: sha256:545b6ebc31ab3ade2892c27916c1a25ec1f96c20730223f088446732ddab518c
untagged: layerdemo:latest
deleted: sha256:784c3f9f12e6dcc7244e90ecdb5224f91d2970c5d125d751f83b3025391bea9e
deleted: sha256:b781d4178e962b29240b3d8d421c05c522cdf0c67ee0fe11cd7c54fa63bae852
deleted: sha256:8074ba695e4ab226934db3bacafee86d9668356753aa023cdbca5d98701df135
deleted: sha256:216caafc871e6d878d8e45cda843edbe4161ad6d93b7a2f69836e965a09b4901
deleted: sha256:539564a6bf0b4fb5002f50c49edce7faf39e5ff7248aae962d3c8d3c76dcef02
deleted: sha256:2b4729131cd56e82211980771de0617f1919f429beef0b8e77e7c8571638fd4e
deleted: sha256:a98e8ee2bdef5148f572b28dd020cf2c911a05f2c46606cc75705facfedc0224
deleted: sha256:85038f9baf5aa05366d783b73bc052bc0ad808ca54640e000aedc5a6a2cba210
untagged: asia.gcr.io/<project-id>/ubuntu-image:latest
untagged: asia.gcr.io/<project-id>/ubuntu-image@sha256:41c1003bfccce22a81a49062ddb088ea6478eabea1457430e6235828298593e6

Total reclaimed space: 209.7MB
```

今度は削除されたっぽい。

```bash
$ docker images -a
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
<none>       <none>    f2b014774e62   36 hours ago   175MB
<none>       <none>    5e443cc82858   36 hours ago   175MB
<none>       <none>    60ea0cbe0bb1   36 hours ago   175MB
<none>       <none>    ede4075dc036   36 hours ago   175MB
<none>       <none>    4b3e66e5edd1   36 hours ago   119MB
nginx        latest    3f8a00f137a0   10 days ago    142MB
ubuntu       latest    58db3edaf2be   3 weeks ago    77.8MB
```

しかし、タグがないイメージは、いくつか残っている（要研究）。

レイヤをまとめることにより、容量を節約することができる。

```bash
$ docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
197c1adcd755: Pull complete
45f2e353f7d2: Pull complete
68ec6ece42ef: Pull complete
cfa4d9a7b88e: Pull complete
64cab5858b1d: Pull complete
92fcd248d982: Pull complete
88635e83312d: Pull complete
43f0427259d9: Pull complete
79828698a290: Pull complete
a8854781893e: Pull complete
6c8bdf3091d9: Pull complete
Digest: sha256:8653a170e0b0df19ea95055267def2615fc53c62df529e3750817c1a886485f0
Status: Downloaded newer image for mysql:latest
docker.io/library/mysql:latest
```

レイヤを確認してみる。

```bash
$ docker image history mysql
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
57da161f45ac   10 days ago   /bin/sh -c #(nop)  CMD ["mysqld"]               0B
<missing>      10 days ago   /bin/sh -c #(nop)  EXPOSE 3306 33060            0B
<missing>      10 days ago   /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B
<missing>      10 days ago   /bin/sh -c ln -s usr/local/bin/docker-entryp…   34B
<missing>      10 days ago   /bin/sh -c #(nop) COPY file:e9c22353a1133b89…   14.2kB
<missing>      10 days ago   /bin/sh -c #(nop)  VOLUME [/var/lib/mysql]      0B
<missing>      10 days ago   /bin/sh -c set -eux;  microdnf install -y "m…   213MB
<missing>      10 days ago   /bin/sh -c #(nop)  ENV MYSQL_SHELL_VERSION=8…   0B
<missing>      10 days ago   /bin/sh -c set -eu;  . /etc/os-release;  {  …   215B
<missing>      10 days ago   /bin/sh -c set -eux;  microdnf install -y "m…   179MB
<missing>      10 days ago   /bin/sh -c set -eu;  . /etc/os-release;  {  …   225B
<missing>      10 days ago   /bin/sh -c #(nop)  ENV MYSQL_VERSION=8.0.32-…   0B
<missing>      10 days ago   /bin/sh -c #(nop)  ENV MYSQL_MAJOR=8.0          0B
<missing>      10 days ago   /bin/sh -c set -eux;  key='859BE8D7C586F5384…   3.17kB
<missing>      10 days ago   /bin/sh -c set -eux;  microdnf install -y   …   13.6MB
<missing>      10 days ago   /bin/sh -c set -eux;  arch="$(uname -m)";  c…   2.36MB
<missing>      10 days ago   /bin/sh -c #(nop)  ENV GOSU_VERSION=1.16        0B
<missing>      10 days ago   /bin/sh -c set -eux;  groupadd --system --gi…   2.77kB
<missing>      11 days ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      11 days ago   /bin/sh -c #(nop) ADD file:6a3fb962576ab4237…   110MB
```

多くのレイヤがあることを確認できる。

```bash
$ docker images | grep mysql
mysql        latest    57da161f45ac   10 days ago    517MB
```

まとめるのには、いくつかのやりかたがある。
まずは、サイズを圧縮したいイメージから、コンテナを立ち上げる。
mysql コンテナを立ち上げられなかった（要調査）ので、ubuntu イメージで実験する。

まずは、コンテナを立ち上げる。

```bash
$ docker container run -dt --name my_ubuntu ubuntu
8229282bc476d6394eee8ad64ff9e9a40a3c678f6fef1ab060c21824c61514a0
```

コンテナが立ち上がったか確認する。

```bash
$ docker container ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS                                   NAMES
8229282bc476   ubuntu    "/bin/bash"              7 seconds ago   Up 6 seconds                                            my_ubuntu
e6e93cd9f5c5   5e4       "nginx -g 'daemon of…"   36 hours ago    Up 33 minutes   0.0.0.0:8082->80/tcp, :::8082->80/tcp   mycustomnginx
67df4d402280   nginx     "/docker-entrypoint.…"   3 days ago      Up 31 hours     0.0.0.0:8080->80/tcp, :::8080->80/tcp   mynginx
```

export サブコマンドで、ファイル化する。

```bash
$ docker export my_ubuntu > my_ubuntudemo.tar
$ ls -l my_ubuntudemo.tar
-rw-r--r-- 1 xxx xxx 80328704 Feb 19 19:35 my_ubuntudemo.tar
```

import コマンドで、別イメージを作成する。

```bash
$ cat my_ubuntudemo.tar | docker import - my_ubuntu:latest
sha256:cf29e08b397543ecf7838f972a10135905eb75598b61cfa505e635f74920f688
```

イメージを確認する。

```bash
$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
my_ubuntu    latest    cf29e08b3975   22 seconds ago   77.8MB
<none>       <none>    5e443cc82858   37 hours ago     175MB
<none>       <none>    ede4075dc036   37 hours ago     175MB
nginx        latest    3f8a00f137a0   10 days ago      142MB
mysql        latest    57da161f45ac   11 days ago      517MB
ubuntu       latest    58db3edaf2be   3 weeks ago      77.8MB
```

容量が変わっていなかった。。
なぜだか確かめる。

```bash
$ docker image history my_ubuntu
IMAGE          CREATED         CREATED BY   SIZE      COMMENT
cf29e08b3975   2 minutes ago                77.8MB    Imported from -

$ docker image history ubuntu
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
58db3edaf2be   3 weeks ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>      3 weeks ago   /bin/sh -c #(nop) ADD file:18e71f049606f6339…   77.8MB
<missing>      3 weeks ago   /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
<missing>      3 weeks ago   /bin/sh -c #(nop)  LABEL org.opencontainers.…   0B
<missing>      3 weeks ago   /bin/sh -c #(nop)  ARG LAUNCHPAD_BUILD_ARCH     0B
<missing>      3 weeks ago   /bin/sh -c #(nop)  ARG RELEASE                  0B
```

一つのレイヤだけになったことは確認できた。容量が減らなかったのは、元のイメージのその他のレイヤのサイズが 0B だからのようだ。
開発者が、すでに、容量圧縮について取り組んでいたからであろうか。
レイヤをまとめることにより、通常であれば？容量が減るであろう言が確認できた。

イメージの検索方法。

```bash
$ docker search --help

Usage:  docker search [OPTIONS] TERM

Search the Docker Hub for images

Options:
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print search using a Go template
      --limit int       Max number of search results (default 25)
      --no-trunc        Don't truncate output
```

limit オプションを使ってみる。

```bash
$ docker search nginx --limit 5
NAME                               DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                              Official build of Nginx.                        18117     [OK]
bitnami/nginx                      Bitnami nginx Docker Image                      152                  [OK]
ubuntu/nginx                       Nginx, a high-performance reverse proxy & we…   79
bitnami/nginx-ingress-controller   Bitnami Docker Image for NGINX Ingress Contr…   23                   [OK]
kasmweb/nginx                      An Nginx image based off nginx:alpine and in…   4
```

オフィシャルのものを検索する方法。

```bash
$ docker search nginx --filter "is-official=true"
NAME      DESCRIPTION                STARS     OFFICIAL   AUTOMATED
nginx     Official build of Nginx.   18117     [OK]
```

[その１３：イメージの移設・ビルド（レイヤ）キャッシュ](https://qiita.com/intrajp/items/a26dc354d4167f4aba39)につづく