Docker/Kubernetes 天天弄,可是又有多少底层技术深刻的记在心里呢。
原理:COW (Copy On Write)
Docker 镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层,并在镜像栈顶部添加一个读写成。如果运行的容器修改了一个已经存在的文件。那么文件就会从只读层复制到读写层,该文件的只读版本依然存在。
理解原理后,便是要思考如何运用到工作中🥶。
容器最后的读写层,可能一般包含了修改的文件。 所以应该避免将容器,docker commit 的方式提交到registry。
docker ps -s 可以看到容器总共的size(含读写层),以及读写层的size。
docker history 看到的 某些层为missing,没有标注ID。其实是因为这些层不在这台电脑上封装。
base 镜像 - Linux最小安装的Linux发行版
在Dockerhub上拉去一个centos镜像,看到只有200mb。困惑。其实这是因为docker镜像在运行时,使用的是docker宿主机的kernel。Linux操作系统由内核空间和用户空间组成。
My Question
那么相同的两个镜像,做了少许改动后,push到harbor,客户端需要把镜像每一层都重新推到harbor上吗?答案是no。registry 会做一个判断,如果层的校验值一致,其实会提示Layer already exists。直接跳过。