映像檔分層概念

把映像檔拆開,裡面是一層又一層的Layer,像堆疊積木一樣,堆疊而成。

容器則是在每個映像檔上面,再加上一個R/W層。

建立二個映像檔來比較看看。

映像檔cutejaneii/curl_alpine:3.7Dockerfile

FROM alpine:3.7
RUN apk add --no-cache curl
ENTRYPOINT ["/usr/bin/curl"]

映像檔cutejaneii/curl2_alpine:3.7Dockerfile

FROM alpine:3.7
RUN apk add --no-cache curl
RUN mkdir my_data
ENTRYPOINT ["/usr/bin/curl"]

docker history觀察一下

映像檔alpine:3.7的ID是6d1ef012b567

映像檔curl_alpine:3.7是由3個Layer組成,最底下的ID是6d1ef012b567(也就是映像檔alpine:3.7),再往上每一個指令就多一個Layer

映像檔curl2_alpine:3.7是由4個Layer組成,最底下的ID是6d1ef012b567(也就是映像檔alpine:3.7),再往上每一個指令就多一個Layer

root@vm:/home/jennifer# docker history alpine:3.7
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
6d1ef012b567        15 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           15 months ago       /bin/sh -c #(nop) ADD file:aa17928040e31624c…   4.21MB

root@vm:/home/jenniferg# docker history cutejaneii/curl_alpine:3.7
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
119f0ca622ff        11 seconds ago      /bin/sh -c #(nop)  ENTRYPOINT ["/usr/bin/cur…   0B
ebd37ddf2c7c        12 seconds ago      /bin/sh -c apk add --no-cache curl              1.39MB
6d1ef012b567        15 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           15 months ago       /bin/sh -c #(nop) ADD file:aa17928040e31624c…   4.21MB

root@vm:/home/jennifer# docker history cutejaneii/curl2_alpine:3.7
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
cbf3378be8a3        11 seconds ago      /bin/sh -c #(nop)  ENTRYPOINT ["/usr/bin/cur…   0B
5dc5243126ed        11 seconds ago      /bin/sh -c mkdir my_data                        0B
ebd37ddf2c7c        2 minutes ago       /bin/sh -c apk add --no-cache curl              1.39MB
6d1ef012b567        15 months ago       /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B
<missing>           15 months ago       /bin/sh -c #(nop) ADD file:aa17928040e31624c…   4.21MB

來看建置過程中有什麼不同

映像檔curl_alpine:3.7的建置過程:

root@vm:/home/jennifer# docker build -t cutejaneii/curl_alpine:3.7 .
Sending build context to Docker daemon  4.096kB
Step 1/3 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/3 : RUN apk add --no-cache curl
 ---> Running in 4225ed3fd744
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ca-certificates (20190108-r0)
(2/4) Installing libssh2 (1.9.0-r1)
(3/4) Installing libcurl (7.61.1-r3)
(4/4) Installing curl (7.61.1-r3)
Executing busybox-1.27.2-r11.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 6 MiB in 17 packages
Removing intermediate container 4225ed3fd744
 ---> ebd37ddf2c7c
Step 3/3 : ENTRYPOINT ["/usr/bin/curl"]
 ---> Running in f36250362075
Removing intermediate container f36250362075
 ---> 119f0ca622ff
Successfully built 119f0ca622ff
Successfully tagged cutejaneii/curl_alpine:3.7

映像檔curl2_alpine:3.7的建置過程:(因為已經存在RUN apk add --no-cache curl指令的Layer,所以在這裡直接使用,就不需再建置,節省很多時間)

root@vm:/home/jennifer# docker build -t cutejaneii/curl2_alpine:3.7 .
Sending build context to Docker daemon   5.12kB
Step 1/4 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/4 : RUN apk add --no-cache curl
 ---> Using cache
 ---> ebd37ddf2c7c
Step 3/4 : RUN mkdir my_data
 ---> Running in abaf1b78c167
Removing intermediate container abaf1b78c167
 ---> 5dc5243126ed
Step 4/4 : ENTRYPOINT ["/usr/bin/curl"]
 ---> Running in 520bffdaf310
Removing intermediate container 520bffdaf310
 ---> cbf3378be8a3
Successfully built cbf3378be8a3
Successfully tagged cutejaneii/curl2_alpine:3.7

以一張示意圖來看curl_alpine:3.7,就會是這個樣子

利用docker images -a查看映像檔的資訊

root@vm:/home/jennifer# docker images -a
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
<none>                                        <none>              5dc5243126ed        2 hours ago         5.6MB
cutejaneii/curl2_alpine                       3.7                 cbf3378be8a3        2 hours ago         5.6MB
cutejaneii/curl_alpine                        3.7                 119f0ca622ff        2 hours ago         5.6MB
<none>                                        <none>              ebd37ddf2c7c        2 hours ago         5.6MB
alpine                                        3.7                 6d1ef012b567        15 months ago       4.21MB

除了docker build之外,在docker pulldocker push時,都會略過已存在的Layer。也就是說,變動的部份在Dockerfile的愈下層,能夠共用的Layer愈多。

Last updated