您的位置:首页 > 运维架构 > Docker

Docker存储驱动的选择

2020-06-29 14:17 239 查看

每个Docker容器都有一个本地存储空间,用于保护层叠的镜像层(Image Layer)以及挂载的容器文件.默认情况下,容器的所有读写操作都发生在其镜像层上或挂载的文件系统中,所以存储是每个容器的性能性不可或缺的一个环节.

在Linux上,Docker可选择的一些存储驱动包含AUFS(最原始也是最老),Overlay2(可能是未来的最佳选择),Device Mapper,Btrfs,ZFS.

Docker在window操作系统上只支持一种存储驱动,即window Filter.

存储驱动的选择是结点级别的.这意味每个Docker主机只能选择一个存储驱动,而不能为每个选择不同的存储驱动.在Linux上,可以修改/etc/docker/daemon.json文件(没有就创建)来修改存储引擎配置,修改完成之后需要重启Docker才能生效.下面的代码片段显示了如何将存储驱动设置为overlay2.

{

"storage-driver":"overlay2"

} # 如何配置所在行不是文件的最后一行,需要在尾行处增加逗号

如果读者修改了正在了正在运行Docker主机的存储引擎类型,则现有的镜像和容器在重启之后将不可用,这是因为每种存储驱动在主机上存储位置是不同的(通常在/var/lib/docker/<storage-driver>/...目录下).修改了存储驱动的类型,Docker就无法找到原有的镜像和容器了.切换到原来的存储驱动,之前的镜像和容器就可以继续使用了.

如果读者希望在切换存储引擎之后还能继续使用之前的镜像和容器,需要将镜像保存为Docker格式,上传到某个镜像仓库,修改本地Docker存储引擎并重启,之后从镜像仓库将镜像拉取到本地,最后重启容器.

通过下面的命令来检查Docker当前的存储驱动类型.

$ docker system info

选择驱动的建议

  • Red Hay Enterprise Linux: 4.x版本内核或更高版本+ Docker 17.06版本或更高版本,建议使用Overlay2
  • Red Hay Enterprise Linux:  低版本或低版本的Docker,建议使用Device Mapper.
  • Ubuntu Linux: 4.x版本内核或更高版本,建议使用Overlay2
  • Ubuntu Linux:低版本建议使用AUFS.
  • SUSE Linux Enterprose server: Btrfs.

Device Mapper配置

大部分Linux存储驱动不需要或需要很少的配置.但是,Device Mapper通常需要合理的配置才能表现出良好的性能.

默认情况下,Device Mapper采用loopback mounted sparse file采用底层实现来为Docker提供存储支持.如果读者需要的是开箱即用并且对性能没有什么要求,那么这种方式是可行的.但是不适合生产环境.实际上默认方式的性能很差,并不支持生产环境.

为了达到Device Mapper在生产环境中的最佳性能,读者需要将底层实现修改为direct-lvm模式.这种模式下通过使用基于裸块设备(Raw Block Device)的LVM精简池(LVM thin pool)来获取更好的性能.

在Docker 17.06以及更高版本中可以配置direct-lvm作为存储驱动.该方式存在某种限制.其中最主要的一点是,这种方式只能配置一块设备,并且只有在第一次安装后才能设置生效.未来可能会有改正,但就目前情况来看配置单一设备这种方式在性能和可靠性上都有一定的风险.

将Docker配置存储驱动为Device Mapper

  1. 将下面的存储驱动配置添加到/etc/docker/daemon.json当中.

{

"storage-driver":"devicemapper",

"storage-opts":[

"dm.directlvm_device=/dev/xdf",

"dm.thinp_percent=95",

"dm.thinp_metapercent=1",

"dm.thinp_autoextend_threshold=80",

"dm.thinp_autoextend_percent=20",

"dm.directlvm_device_force=false"

]

}

Device Mapper和LVM是很复杂的知识点,下面简单介绍一下个配置项的含义

  • dm.directlvm_device:设置了块设备的位置.为了存储的最佳性能以及可用性,块设备应当位于高性能设备(如本地SSD)或者外部RAID存储阵列之上.
  • dm.thinp_percent=95:设置了镜像和容器允许使用的最大存储空间比,默认是95%.
  • dm.thinp_metapercent:设置了元数据存储(MetaData Storage)允许使用的存储空间大小.默认是1%.
  • dm.thinp_autoextend_threshold:设置了LVM自动扩展精简池的阀值,默认是80%.
  • dm.thinp_autoextend_percent:表示当触发精简池(thin pool)自动扩容机制的时候,扩容的大小应当占用现有的空间比例.
  • dm.directlvm_device_force:允许用户决定是否将块设备格式化为新的文件系统.

重启Docker

确认Docker已成功运行,并且块设备配置已被成功加载

$ docker version

Client:

Version: 18.01.0-ce

<Snip>

Server:

Version : 18.0.1.0-ce

<Snip>

$ docker Systeminfo

.....

....

....

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: