plsql存储过程修改后怎么保存_docker系列二 数据卷和存储驱动(三)

1、如何选择存储驱动?

docker 设计了一套存储驱动插件框架,开发者可以根据这套框架的标准,设计开发自己的存储驱动。每种存储驱动都是基于linux文件系统或卷管理工具的。存储驱动只要实现了框架中的接口,就可以自己管理镜像层和容器层。不同的用户场景需要使用不同的存储驱动,因为不同的存储驱动有自己擅长的方面。

用户需要根据自己的需求选择存储驱动,在Docker Daemon 中配置特定的存储驱动。该存储驱动会管理所有的Docker Daemon生成的容器。

(1)、通过docker info 命令可以查看当前h环境下使用的存储驱动:

20be1402d8f348ea9b7c53926b7147c5.png
docker info

后端文件系统标明Overlay存储驱动工作在extfs文件系统上。Docker Daemon 会在宿主机/var/lib/docker目录下分配一块存储空间,使用指定的后端文件系统格式化这块存储空间。

使用那种存储驱动取决于用户在宿主机上使用何种文件系统。一些存储驱动可以工作在不同的后端文件系统上,另一些存储驱动必须使用相同的后端文件系统。例如,Btrfs存储驱动要求后端文件系统必须是Btrfs。

(2)、下表是目前支持的存储驱动名称及其支持的后端文件系统:

9e5a05d8bc9ac5ade25adbf3cb1a7b34.png
存储驱动

可以在启动Docker Daemon的时候,加入 --storage-driver=<name> 设置存储驱动。

2、存储驱动的作用?

(1)、使用共享技术减小镜像体积

所有镜像层和容器层都保存在宿主机的文件系统中,通过docker的存储驱动管理这些层。在linux系统中,宿主机使用/var/lib/docker保存容器和镜像。

用户使用docker pull下载镜像,使用docker push上传镜像。在这两个过程中,docker 命令会打印出镜像层信息。例如:

[root@VM_0_5_centos ~]# docker run -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
7ddbc47eeb70: Pull complete
c1bbdc448b72: Pull complete
8c3b70e39044: Pull complete
45d437916d57: Pull complete
Digest: sha256:6e9f67fa63b0323e9a1e587fd71c561ba48a034504fb804fd26fd8800039835d
Status: Downloaded newer image for docker.io/ubuntu:latest
root@b2ca7b248b17:/#

从上面的输出中可以发现,ubuntu:latest 的镜像是由四个镜像层组成。下载镜像时,实际是下载了这 4 个镜像层。每个镜像层都有一个UUID,这个ID通过加密哈希算法得到。

这些镜像层都保存在宿主机的文件系统中,每层都有独立的目录。在docker 1.10以前的版本中,这些目录的名字与镜像层的ID相同。而1.10后续的版本,采取了新的存储方式,所以镜像层的目录名和镜像ID不同。

下载镜像时,Docker Daemon 会检查镜像中的镜像层,与宿主机的文件系统中的镜像层进行比较。如果发现这些镜像层已经存在,Dokcer Daemon 将会忽略这些镜像层,只下载不存在的镜像层。

(2)、使用写时复制技术加快容器启动时间

启动容器时,Docker Daemon 会在镜像层上加一个容器层。在容器中,所有的写操作都发生在容器层中,下面的镜像层都是只读模式,不能修改其中的数据。通过这种方式,多个容器可以共享底部的镜像层。

在容器中修改文件时,Docker通过存储驱动,发起一个写时复制操作。不同的存储驱动使用不同的步骤。AUFS和OverlayFS使用下面的步骤:

(1)、在镜像层中寻找需要修改的文件;

(2)、把这个文件从镜像层复制到容器层中;

(3)、在容器层中修改这个文件。

Btrfs,ZFS和其他存储驱动使用不同的步骤实现写时复制。

不同容器占用的存储空间不同。如果在容器中有很多与修改文件、新建文件相关的操作,这些容器会占用更多的存储空间。因为,每次修改文件都会在容器层中分配新的存储空间。如果在容器中,需要大量的写操作,最好使用挂在卷,把这些数据写在挂在卷中。

把文件从镜像层中复制到容器层会带来额外的系统开销,不同的存储驱动产生的开销也不同。一些因素会引起明显的系统开销,如修改大文件,新建大文件,镜像中存在很多镜像层,很深的目录树等。但是这些系统开销仅发生一次,就是在文件第一次被修改时,一旦docker发现文件被修改,就会把文件从镜像层复制到容器层。其后的操作都是在容器层中完成,不会带来额外的开销。
每启动一个容器,Docker Daemon 都会添加一个容器层,并未这个容器层分配一个随机的UUID,这个ID就是Docker run返回的ID。
通过命令 ls /var/lib/docker/containers 可以在宿主机中看到这些容器层。docker 使用写时复制技术,不仅节约了容器的存储空间(不用为每个启动的容器复制镜像层),同时也减少了容器的启动时间。启动容器时,Docker Daemon 只需要为m每个容器新建一个可写的数据层,而不用复制所有的镜像层。

3、为什么数据卷可以保存容器数据而不被清理?

docker 使用数据卷保证数据持久性。删除容器时,所有不在数据卷中的数据都会被删除,而是会保留在宿主机上。

实际上,数据卷是宿主机上的一个文件或者目录,启动容器时,会把这个文件或者目录挂载到容器中。数据卷不受存储驱动程序管理。数据卷中的数据读写操作会绕过存储驱动程序,直接工作在宿主机的文件系统中。容器中挂载的数据卷数量没有限制,多个容器也可以挂载同一个数据卷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值