在 docker 中,每一個鏡像都是由多個分層組成的。每個分層都包含了一個或多個文件,并且會在前一個分層的基礎上進行修改或添加。這個分層的架構使得 docker 的鏡像可以高效共享,減少了網絡傳輸和磁盤占用。
例如,我們可以通過命令查看 nginx 鏡像的分層: $ docker history nginx IMAGE CREATED CREATED BY SIZE COMMENT f4ddb660caf9 2 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B5d3bd7de5f17 2 weeks ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT0B5d3bd7de5f17 2 weeks ago /bin/sh -c #(nop) EXPOSE 800B5d3bd7de5f17 2 weeks ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0Bcc4f3d769e43 2 weeks ago /bin/sh -c #(nop) COPY file:8e0ce1d67aadb625… 1.04kB 51a192d065f1 2 weeks ago /bin/sh -c #(nop) COPY file:bc388ec119bac45d… 1.96kB a05116e12d86 2 weeks ago /bin/sh -c #(nop) COPY file:f97d0ec42e357bcf… 1.96kB 20b7227e1111 2 weeks ago /bin/sh -c #(nop) COPY dir:97988bc37e99d6bf5… 92.6kB
從上述命令的輸出結果可以看出,nginx 鏡像由多個分層組成。其中最上面的分層表示鏡像本身,其他的分層都是在該分層的基礎上添加或修改了內容。比如在該鏡像中,分層5d3bd7de5f17表示為 ENTRYPOINT、EXPOSE 和 STOPSIGNAL。
相對而言,每一個使用該鏡像的容器都會擁有自己的分層。只有那些被修改的文件屬于該容器專有的內容,其他文件都從鏡像中繼承過來。這也意味著在容器中修改的任意文件,都不會影響到其他的容器或者鏡像。