映像檔分層概念
把映像檔拆開,裡面是一層又一層的Layer,像堆疊積木一樣,堆疊而成。
容器則是在每個映像檔上面,再加上一個R/W層。

建立二個映像檔來比較看看。
映像檔cutejaneii/curl_alpine:3.7
的Dockerfile
cutejaneii/curl_alpine:3.7
的Dockerfile
FROM alpine:3.7
RUN apk add --no-cache curl
ENTRYPOINT ["/usr/bin/curl"]
映像檔cutejaneii/curl2_alpine:3.7
的Dockerfile
cutejaneii/curl2_alpine:3.7
的Dockerfile
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 pull
及docker push
時,都會略過已存在的Layer。也就是說,變動的部份在Dockerfile的愈下層,能夠共用的Layer愈多。
Last updated
Was this helpful?