Docker の実験（その１０：コンテナのレイヤ）

[その９：Container Registry に登録する](https://qiita.com/intrajp/items/f5bd729027bc4c8e691b)のつづき。

Doker コンテナが、ベースイメージを共有出来るのは、Docker がレイヤ構造になっており、最上のレイヤのみが異なっているためである。

なお、RUN インストラクションでファイルを作成して、次に削除しても、レイヤとして残ってしまうので、コンテナのサイズは同じになっている。
コンテナのファイルサイズを小さくして、パフォーマンスをよくするには、Docerfile において RUN インストラクションを、いくつも書くのではなく、&& でつなげて書くのがよい。

これを確認する。

```bash
$ cd demo_layer
$ vim Dokerfile
（以下、ファイルの内容）
FROM ubuntu
RUN dd if=/dev/zero of=/root/file1.txt bs=1M count=100
RUN dd if=/dev/zero of=/root/file2.txt bs=1M count=100
RUN rm -f /root/file1.txt
RUN rm -f /root/file2.txt
```

では、layerdemo というタグをつけて、Docker イメージをビルドしてみる。

```bash
$ docker build -t layerdemo .
Sending build context to Docker daemon  2.048kB
Step 1/5 : FROM ubuntu
 ---> 58db3edaf2be
Step 2/5 : RUN dd if=/dev/zero of=/root/file1.txt bs=1M count=100
 ---> Running in 88c7259bb82f
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.265441 s, 395 MB/s
Removing intermediate container 88c7259bb82f
 ---> a98e8ee2bdef
Step 3/5 : RUN dd if=/dev/zero of=/root/file2.txt bs=1M count=100
 ---> Running in 9621dec7ce4c
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.603125 s, 174 MB/s
Removing intermediate container 9621dec7ce4c
 ---> 539564a6bf0b
Step 4/5 : RUN rm -f /root/file1.txt
 ---> Running in a4441f55e453
Removing intermediate container a4441f55e453
 ---> 8074ba695e4a
Step 5/5 : RUN rm -f /root/file2.txt
 ---> Running in b3a804ae4940
Removing intermediate container b3a804ae4940
 ---> 784c3f9f12e6
Successfully built 784c3f9f12e6
Successfully tagged layerdemo:latest
```

ファイルサイズを確認してみる。

```bash
$ docker images
REPOSITORY                                     TAG       IMAGE ID       CREATED         SIZE
layerdemo                                      latest    784c3f9f12e6   9 minutes ago   288MB
<none>                                         <none>    5e443cc82858   15 hours ago    175MB
<none>                                         <none>    ede4075dc036   16 hours ago    175MB
nginx                                          latest    3f8a00f137a0   9 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
```

では、leyerdemo の中を確認してみる。

```bash
$ docker history layerdemo
IMAGE          CREATED          CREATED BY                                      SIZE      COMMENT
784c3f9f12e6   11 minutes ago   /bin/sh -c rm -f /root/file2.txt                0B
8074ba695e4a   11 minutes ago   /bin/sh -c rm -f /root/file1.txt                0B
539564a6bf0b   11 minutes ago   /bin/sh -c dd if=/dev/zero of=/root/file2.tx…   105MB
a98e8ee2bdef   11 minutes ago   /bin/sh -c dd if=/dev/zero of=/root/file1.tx…   105MB
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
```

Dockerfile の RUN インストラクションがそのままファイルサイズとなっていて、次の　RUN インストラクションで削除しても、全体の大きさは変わらない。
Dockerfile を変更して、ファイルサイズを小さくするには、&& でつなげていけばよい。

```bash
FROM ubuntu
RUN dd if=/dev/zero of=/root/file1.txt bs=1M count=100 && rm -f /root/file1.txt
RUN dd if=/dev/zero of=/root/file2.txt bs=1M count=100 && rm -f /root/file2.txt
```

イメージをビルドしよう。

```bash
$ docker build -t layerdemo2 .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM ubuntu
 ---> 58db3edaf2be
Step 2/3 : RUN dd if=/dev/zero of=/root/file1.txt bs=1M count=100 && rm -f /root/file1.txt
 ---> Running in 6a17a2bf6af3
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.212157 s, 494 MB/s
Removing intermediate container 6a17a2bf6af3
 ---> ec0e3e38bebb
Step 3/3 : RUN dd if=/dev/zero of=/root/file2.txt bs=1M count=100 && rm -f /root/file2.txt
 ---> Running in b2ce82a0e2d3
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.115999 s, 904 MB/s
Removing intermediate container b2ce82a0e2d3
 ---> 9f16192943d8
Successfully built 9f16192943d8
Successfully tagged layerdemo2:latest
```

以下のように、サイズが小さく（ベースイメージと同じ）なった。

```bash
$ docker images
REPOSITORY                                     TAG       IMAGE ID       CREATED          SIZE
layerdemo2                                     latest    9f16192943d8   32 seconds ago   77.8MB
layerdemo                                      latest    784c3f9f12e6   16 minutes ago   288MB
<none>                                         <none>    5e443cc82858   15 hours ago     175MB
<none>                                         <none>    ede4075dc036   16 hours ago     175MB
nginx                                          latest    3f8a00f137a0   9 days ago       142MB
asia.gcr.io/<project-name>/ubuntu-image   latest    58db3edaf2be   3 weeks ago      77.8MB
ubuntu                                         latest    58db3edaf2be   3 weeks ago      77.8MB
```

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