Docker storage drivers
Storage drivers 与 Docker volume
storage drivers
Docker使用storage drivers用来存储镜像层,并将数据存储到容器的可写层,但是容器的可写层不是持久性的(比如容器发生重启 、删除)数据跟随丢失,适合保存在容器运行时产生的临时数据文件
storage drivers优化了存储空间的效率(取决于你使用的什么storage drivers)storage drivers使用了 copy-on-write filesystem,但是它的效率还是无法与native file system的性能相比
特别是遇到写入密集型应用程序(write-intensive applications),比如数据库类型的应用在存储数据时,对存储的性能开销有一定影响,特别是遇到已有的数据已经存在了只读层(particularly if pre-existing data exists in the read-only layer)
Docker volume
针对上面写入密集型应用程序,可以使用docker volume保存写入密集数据,数据的持久有效性大于容器的生命期(container‘s lifespan)
而且 volume的读写性能高于docker overlayFS
总结
-
storage drivers是docker存储驱动接口,主要功能用来管理镜像层内容变更与容器writable layer的写操作
-
Docker volume 实际是外接存储个逻辑卷(文件系统是操作系统所指定)
imges and layers
-
一个docker images是由一个或者多个layers所组成,镜像的每个层可以看作成Dockerfile的一条指令,如下
# syntax=docker/dockerfile:1 FROM ubuntu:18.04 LABEL org.opencontainers.image.authors="org@example.com" //LABEL只是修改镜像中的元数据,并不会新生成一个镜像层 COPY . /app RUN make /app RUN rm -r $HOME/.cache CMD python /app/app.py
- 镜像是由多个镜像层堆叠形成的,当创建一个新的container时,就会生成一个writable layer(可写层),通常把这层称之为Container layer,这一层通常位于镜像层最顶层的上一层
什么是镜像顶层,就是在构建镜像时,Dockerfile的最后一条指令即为镜像的顶层
- 容器层
什么是容器层,在容器运行时所有的修改操作(换而言之,就是容器运行时发生文件变化)通常指生成新文件、修改已存在的文件、删除文件所在的层
Container and layers
Container与images的主要区别在于顶层的writable layer,所有写入容器的操作(新生成文件、修改文件)都存储在writable layer,writable layer随容器删除面随之删除, 但是底层的镜像则保持不变
每个Container都有独自的writable layer,所有修改操作都存储中这一层(container layer),多个容器可以共享访问同一个underlying image并且有自己的数据状态,下图展示多个容器共享一个镜像
Container size on disk
查看运行容器所使用空间,可以执行docker ps -s查看,但是会看到二个不同的SIZE列,含义如下
-
SIZE 统计在容器运行时,在writable layer发生的文件变化SIZE
-
virtual size 统计城容器运行时,使用的read-only image data + container wirtabl layer的总和
-
多个容器共享同样镜像数据
-
二个或者多个容器使用同一个镜像(share 100 of the read-only data)
但是还有一种情况是,二个容器使用不同的镜像,但是二个镜像会有公共镜像层,因为很难统计出容器在运行时真实使用空间大小,通常virtaul size会高估一点,但是不代表他实际的使用量
-
除此之外,SIZE&virtaul size还不统计以下产生的磁盘空间
-
使用logging-driver存储的日志文件
-
docker volume产生的文件
-
内存写入到磁盘的文件
-
Checkpoints