docker镜像文件存储驱动
docker最初用的文件存储系统是AUFS文件系统,因为AUFS文件系统本身带有文件分层的机制,这和docker镜像可以天然的配合在一起.
AUFS目前没有被纳入Linux内核代码中,而且只支持Ubuntu系统。不支持centos系统
为了解决这个问题 docker创建了文件存储驱动的机制.生产环境需要根据不同的业务场景选择合适的文件存储驱动来提高docker的性能
COW(写时复制) 针对镜像中已经存在的文件
当基于一个镜像启动多个容器的时候,如果在容器中没有对文件系统中的文件进行修改的时候,那么这些容器都是共用同一个镜像的文件系统.而不是每次启动一个新的容器就为容器分配和镜像同等大小的文件系统。
当容器有对文件有修改操作的时候,docker才会把对应的文件从镜像中复制到容器层中.这个时候才会占用具体的文件存储空间
AOD(写时分配) 针对镜像中不存在的文件
当启动一个容器的时候 并不会为这个容器预分配磁盘空间. 只有当有新文件写入的时候才会分配存储空间,并且也仅仅写入容器层,不会写入镜像层。
常用的文件存储驱动机制
AUFS
支持将不同的目录挂载到同一个文件系统下的指定目录
overlayfs
overlayfs不是块级别的文件系统,即使是对某个文件修改一个字符的时候,它也会复制整个文件.不适合大规模写入操作
overlayfs只有两层,找镜像层的文件效率要明显高于aufs文件系统
容器的文件系统是由镜像层文件加上容器层文件共同组成的
overlayfs2
性能介于overlayfs和AUFS之间
构建镜像
业务镜像打包找的基础镜像一般是用alpine linux。alpine linux是一个开源的,体积非常小的linux 内核。所以基于alpine打出来的镜像占用的空间会非常少
示例
如果alpine自带的包管理器中没有对应的软件包,就只能在alpine基础镜像中通过手动编译来安装相应的软件
docker的架构和常用命令
docker镜像操作
联合挂载技术
把多个镜像层统筹成一个可以运行的容器
把多个目录挂载到同一目录下,甚至也可以对应不同的文件系统
容器创建的时候容器层也是只读的,只有容器在启动后才会在容器层之上创建一个可读写层