4 minute read

学んだこと

レイヤー構造とは?

  • 読み取り専用の改装的なデータの単位を表す。

イメージレイヤーとは?

  • Dockerfile 内の記述事に作成される層のことを表す。
    • レイヤーは読み取り専用
    • レイヤーにはイメージの変更差分が保存される。

レイヤーについて実際に確認

  • 以下の Dockerfile 用意する。
FROM rails:5

RUN touch hoge.txt
CMD ["ls", "-la"]
// ベースイメージはrailsでコンテナ内にhoge.txtを作成する。
// デフォルトコマンドはlsで、ディレクトリ一覧が表示される想定。
  • docker image buildでビルド実行する。
PS D:\testdocker\docker> docker image build .
[+] Building 34.1s (7/7) FINISHED                                                                                                                                                    docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                 0.0s
 => => transferring dockerfile: 90B                                                                                                                                                                  0.0s
 => [internal] load metadata for docker.io/library/rails:5                                                                                                                                           2.5s
 => [auth] library/rails:pull token for registry-1.docker.io                                                                                                                                         0.0s
 => [internal] load .dockerignore                                                                                                                                                                    0.0s
 => => transferring context: 34B                                                                                                                                                                     0.0s
 => [1/2] FROM docker.io/library/rails:5@sha256:aec52fe81ff0e99d64174001fbdf44c3bc9e1869756dec05c447f52a0fe637e7                                                                                    29.9s
 => => resolve docker.io/library/rails:5@sha256:aec52fe81ff0e99d64174001fbdf44c3bc9e1869756dec05c447f52a0fe637e7                                                                                     0.0s
 => => sha256:4cd427c44fca003d57c5ad391bc709131ed308bc8468d9b1331db3f5571bac74 23.27MB / 23.27MB                                                                                                     4.3s
 => => sha256:6bd3d457e27acefd70f4ff93b1b20794746e0a49eda0630f9e68aed3b7e910c2 13.73MB / 13.73MB                                                                                                     2.9s
 => => sha256:7dd42782d26e2bbf0d49e35860ca528b73ea72e46b787312849502fe37e9b333 2.88MB / 2.88MB                                                                                                       1.3s
 => => sha256:73729083bf6c97a21d7c753cc31a23e9cb3142f61200ba7c33a32333973e1be7 162B / 162B                                                                                                           0.8s
 => => sha256:7025772f9b601093d0f4d16474bab88bca8f180d1e3efcb47899fac48a62c86f 612.88kB / 612.88kB                                                                                                   0.5s
 => => sha256:c2807e33cf8416989005a833f0b1cf36ccb635a9c1df5b00dbc1862dfd01330c 35.11MB / 35.11MB                                                                                                     6.4s
 => => sha256:afb684ad7765258b3876f3ee6f96244f254b12c72f6bcfd97af3bd02f7912935 204B / 204B                                                                                                           0.4s
 => => sha256:871436ab7225503e9e951a7acb7b1689a91a60d033bf8cbabcd40fe5ca4cfc87 129.82MB / 129.82MB                                                                                                  22.5s
 => => sha256:4306be1e8943b446026b96c2ef7b3ab8471c760774fd1cd11334df7084fed57b 42.50MB / 42.50MB                                                                                                     7.5s
 => => sha256:57de64c72267e88e952b064236cb906c7626f7c07a1a2d5900cf6953e72632b3 18.53MB / 18.53MB                                                                                                     3.6s
 => => sha256:75a822cd7888e394c49828b951061402d31745f596b1f502758570f2d0ee79e2 51.36MB / 51.36MB                                                                                                     8.9s
 => => extracting sha256:75a822cd7888e394c49828b951061402d31745f596b1f502758570f2d0ee79e2                                                                                                            1.8s
 => => extracting sha256:57de64c72267e88e952b064236cb906c7626f7c07a1a2d5900cf6953e72632b3                                                                                                            0.4s
 => => extracting sha256:4306be1e8943b446026b96c2ef7b3ab8471c760774fd1cd11334df7084fed57b                                                                                                            1.4s
 => => extracting sha256:871436ab7225503e9e951a7acb7b1689a91a60d033bf8cbabcd40fe5ca4cfc87                                                                                                            2.7s
 => => extracting sha256:afb684ad7765258b3876f3ee6f96244f254b12c72f6bcfd97af3bd02f7912935                                                                                                            0.0s
 => => extracting sha256:c2807e33cf8416989005a833f0b1cf36ccb635a9c1df5b00dbc1862dfd01330c                                                                                                            0.9s
 => => extracting sha256:7025772f9b601093d0f4d16474bab88bca8f180d1e3efcb47899fac48a62c86f                                                                                                            0.1s
 => => extracting sha256:73729083bf6c97a21d7c753cc31a23e9cb3142f61200ba7c33a32333973e1be7                                                                                                            0.0s
 => => extracting sha256:7dd42782d26e2bbf0d49e35860ca528b73ea72e46b787312849502fe37e9b333                                                                                                            0.1s
 => => extracting sha256:6bd3d457e27acefd70f4ff93b1b20794746e0a49eda0630f9e68aed3b7e910c2                                                                                                            0.3s
 => => extracting sha256:4cd427c44fca003d57c5ad391bc709131ed308bc8468d9b1331db3f5571bac74                                                                                                            0.8s
 => [2/2] RUN touch hoge.txt                                                                                                                                                                         1.0s
 => exporting to image                                                                                                                                                                               0.4s
 => => exporting layers                                                                                                                                                                              0.2s
 => => exporting manifest sha256:33976682229c02af31b4b722fce03347fa4ef357d66b6097e6cd8cd8caa08703                                                                                                    0.0s
 => => exporting config sha256:49e3fc93e6032ae453d28d55ddad3683b0dbe0cdfc51106c013258bb4d445121                                                                                                      0.0s
 => => exporting attestation manifest sha256:6c118e0d4508f8a7c7c1bcb1c952dbfd05161ba3978742b29dfd5bda160b3db1                                                                                        0.0s
 => => exporting manifest list sha256:6aa7b968d432cb03a9910a3c9c72045bfe09e03dbf5b4239ca4c4e92e55fcfbc                                                                                               0.0s
 => => naming to moby-dangling@sha256:6aa7b968d432cb03a9910a3c9c72045bfe09e03dbf5b4239ca4c4e92e55fcfbc                                                                                               0.0s
 => => unpacking to moby-dangling@sha256:6aa7b968d432cb03a9910a3c9c72045bfe09e03dbf5b4239ca4c4e92e55fcfbc                                                                                            0.0s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/zgvt8bwuhix6rurgw5gl429kt
  • docker image hidtoryでイメージレイヤー構造を確認する。
PS D:\testdocker\docker> docker image history sha256:6aa7b968d432cb03a9910a3c9c72045bfe09e03dbf5b4239ca4c4e92e55fcfbc

IMAGE          CREATED         CREATED BY                                       SIZE      COMMENT
6aa7b968d432   2 minutes ago   CMD ["ls" "-la"]                                 0B        buildkit.dockerfile.v0
<missing>      2 minutes ago   RUN /bin/sh -c touch hoge.txt # buildkit         4.1kB     buildkit.dockerfile.v0
// 上記は先程作成したDockerfileで記述した箇所

// 下記はベースイメージのレイヤー
<missing>      8 years ago     /bin/sh -c gem install rails --version "$RAI…   65.3MB
<missing>      8 years ago     /bin/sh -c #(nop)  ENV RAILS_VERSION=5.0.1       0B
<missing>      8 years ago     /bin/sh -c apt-get update && apt-get install…   47.1MB
<missing>      8 years ago     /bin/sh -c apt-get update && apt-get install…   8.9MB
<missing>      8 years ago     /bin/sh -c #(nop)  CMD ["irb"]                   0B
// 今回はCMDを上書きしているため、この処理は呼ばれない。
// 上書きされている場合は、この処理がデフォルトコマンドで実行されている。

<missing>      8 years ago     /bin/sh -c mkdir -p "$GEM_HOME" "$BUNDLE_BIN…   20.5kB
<missing>      8 years ago     /bin/sh -c #(nop)  ENV PATH=/usr/local/bundl…   0B
<missing>      8 years ago     /bin/sh -c #(nop)  ENV BUNDLE_PATH=/usr/loca…   0B
<missing>      8 years ago     /bin/sh -c #(nop)  ENV GEM_HOME=/usr/local/b…   0B
<missing>      8 years ago     /bin/sh -c gem install bundler --version "$B…   2.36MB
<missing>      8 years ago     /bin/sh -c #(nop)  ENV BUNDLER_VERSION=1.13.7    0B
<missing>      8 years ago     /bin/sh -c set -ex   && buildDeps='   bison …   125MB
<missing>      8 years ago     /bin/sh -c #(nop)  ENV RUBYGEMS_VERSION=2.6.8    0B
<missing>      8 years ago     /bin/sh -c #(nop)  ENV RUBY_DOWNLOAD_SHA256=…   0B
<missing>      8 years ago     /bin/sh -c #(nop)  ENV RUBY_VERSION=2.3.3        0B
<missing>      8 years ago     /bin/sh -c #(nop)  ENV RUBY_MAJOR=2.3            0B
<missing>      8 years ago     /bin/sh -c mkdir -p /usr/local/etc  && {   e…   20.5kB
<missing>      8 years ago     /bin/sh -c apt-get update && apt-get install…   349MB
<missing>      8 years ago     /bin/sh -c apt-get update && apt-get install…   136MB
<missing>      8 years ago     /bin/sh -c apt-get update && apt-get install…   47.3MB
<missing>      8 years ago     /bin/sh -c #(nop)  CMD ["/bin/bash"]             0B
<missing>      8 years ago     /bin/sh -c #(nop) ADD file:1d214d2782eaccc74…   141MB

コンテナレイヤーとは?

  • コンテナ上で変更した内容を保存するレイヤーを表す。
    • イメージレイヤーとは違い、書き込み可能。

イメージレイヤーの容量を小さくする方法

  • 前提として、レイヤーの数が少ない方が容量は小さくなる。
    • なので、実行されるコマンドの数が少ないほうが良い。

比べてみる

  • 以下の Dockerfile を用意する。
FROM ubuntu:20.04

RUN apt update
RUN apt install -y curl
RUN apt install -y vim

CMD ["bash"]
  • docker image buildでビルドする。
PS D:\testdocker\docker> docker image build .
[+] Building 69.3s (9/9) FINISHED                                                                                                                                                    docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                 0.0s
 => => transferring dockerfile: 137B                                                                                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                                                    0.0s
 => => transferring context: 34B                                                                                                                                                                     0.0s
 => [1/4] FROM docker.io/library/ubuntu:20.04@sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b                                                                                1.6s
 => => resolve docker.io/library/ubuntu:20.04@sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b                                                                                1.6s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                                                        0.0s
 => CACHED [2/4] RUN apt update                                                                                                                                                                      0.0s
 => CACHED [3/4] RUN apt install -y curl                                                                                                                                                             0.0s
 => [4/4] RUN apt install -y vim                                                                                                                                                                    63.6s
 => exporting to image                                                                                                                                                                               3.7s
 => => exporting layers                                                                                                                                                                              2.6s
 => => exporting manifest sha256:bed008d14af8382617a39eb6b120c397db70d48596bce223632d8b9af8d0a7a8                                                                                                    0.0s
 => => exporting config sha256:5ee972cd55e8ebdbf2344762f2ba686633c2067f3a67145974bd115ec2725876                                                                                                      0.0s
 => => exporting attestation manifest sha256:1adcd5d15197ca7fb4341a9a7979513d504893c5d89d3d7bda34a3d64ea5ec56                                                                                        0.0s
 => => exporting manifest list sha256:43b36206b4d1cd928af3da74e21778f9853df0ef4a6e631a0388d45559216954                                                                                               0.0s
 => => naming to moby-dangling@sha256:43b36206b4d1cd928af3da74e21778f9853df0ef4a6e631a0388d45559216954                                                                                               0.0s
 => => unpacking to moby-dangling@sha256:43b36206b4d1cd928af3da74e21778f9853df0ef4a6e631a0388d45559216954                                                                                            0.9s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/sfbx2vq719vlq76c6le6t3gsl
  • 次は以下の Dockerfile を用意する。
FROM ubuntu:20.04

RUN apt update && apt install -y curl vim

CMD ["bash"]
  • docker image buildでビルドする。
PS D:\testdocker\docker> docker image build .
[+] Building 158.2s (7/7) FINISHED                                                                                                                                                   docker:desktop-linux
 => [internal] load build definition from Dockerfile                                                                                                                                                 0.0s
 => => transferring dockerfile: 115B                                                                                                                                                                 0.0s
 => [internal] load metadata for docker.io/library/ubuntu:20.04                                                                                                                                      0.0s
 => [internal] load .dockerignore                                                                                                                                                                    0.0s
 => => transferring context: 34B                                                                                                                                                                     0.0s
 => CACHED [1/2] FROM docker.io/library/ubuntu:20.04@sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b                                                                         1.6s
 => => resolve docker.io/library/ubuntu:20.04@sha256:8e5c4f0285ecbb4ead070431d29b576a530d3166df73ec44affc1cd27555141b                                                                                1.6s
 => [auth] library/ubuntu:pull token for registry-1.docker.io                                                                                                                                        0.0s
 => [2/2] RUN apt update && apt install -y curl vim                                                                                                                                                149.7s
 => exporting to image                                                                                                                                                                               6.6s
 => => exporting layers                                                                                                                                                                              5.2s
 => => exporting manifest sha256:68e7d58e37296ad896513952bfd0bfeefac4295e649f0872039268e0888bb3b3                                                                                                    0.0s
 => => exporting config sha256:d8f08e471afd0d93af1778d402d51c1579aabd3d6041de0114d9378ba1830b3d                                                                                                      0.0s
 => => exporting attestation manifest sha256:ff7820f18245b543d18f589b2f2d0d08b1459b4fb9907059d9a3b9933717d62f                                                                                        0.0s
 => => exporting manifest list sha256:d1886c5cd1c6a69c64f512a3d53d4623ccc94a6c72e34ce6dcc9f98c16bf439d                                                                                               0.0s
 => => naming to moby-dangling@sha256:d1886c5cd1c6a69c64f512a3d53d4623ccc94a6c72e34ce6dcc9f98c16bf439d                                                                                               0.0s
 => => unpacking to moby-dangling@sha256:d1886c5cd1c6a69c64f512a3d53d4623ccc94a6c72e34ce6dcc9f98c16bf439d                                                                                            1.2s

View build details: docker-desktop://dashboard/build/desktop-linux/desktop-linux/tzyp8gy20fhobx6saidbnr10c
  • 両方ともビルド出来たため、docker image lsで容量を見比べる。
PS D:\testdocker\docker> docker image ls

REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
<none>          <none>    d1886c5cd1c6   2 minutes ago    318MB
// 最後にビルドしたイメージ

<none>          <none>    43b36206b4d1   19 minutes ago   319MB
// 最初にビルドしたイメージ

// 結果最後にビルドしたイメージが一番容量が小さい事がわかった。
// 実行結果は同じだが、レイヤー構造を意識することでイメージのサイズを小さくすることができる事がわかった。

Tags:

Updated: