LoginSignup
0
0

More than 1 year has passed since last update.

Docker の実験(その10:コンテナのレイヤ)

Last updated at Posted at 2023-02-18

その9:Container Registry に登録するのつづき。

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

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

これを確認する。

$ 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 イメージをビルドしてみる。

$ 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

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

$ 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 の中を確認してみる。

$ 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 を変更して、ファイルサイズを小さくするには、&& でつなげていけばよい。

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

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

$ 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

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

$ 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

その11:イメージの調査につづく。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0