了解 Storage Driver
Storage Driver provide a pluggable framework for managing the temporary, Internal storage of a container's writeable layer.
- Storage Driver 管理的是 container 写入层内部的临时存储。
简单的来讲,装在 docker 中的软件需要写入数据,我们并没有 mount point 或者是外部存储设备,我们需要写入数据到内部的临时存储。
- Storage Driver 提供一个可插拔式的框架来管理这个内部的临时存储。
选择不同的 storage driver, 我们管理这个内部存储的方式也将不同,这样 docker 就可以在不同的环境中支持不同的系统。
Storage Driver 的种类
Docker 支持很多种类的 Storage Driver 。但我们需要基于我们的使用环境来选择最适合的存储驱动。
我们介绍下最常用的两种存储驱动:
- overlay2 这是 file-base storage(文件系统类型的存储,文件的读写和修改喝药上传和下载全部的文件)。默认在 Ubuntu 和 CentOS 8+ 中使用。
- devicemapper 这是 block-storage(基于块的存储,文件的读写和修改不需要上传和下载全部的文件)。默认在 CentOS 7和旧版本中使用。
overlay2 performs better when you do a lot of reading to the container. devicemapper performs better when you are doing a lot of writing to the container layers.
- 其他类型的存储驱动可以在下面的链接获取更多资料。
测试 CentOS7 的 Storage Driver 配置
我们可以使用下面的命令来查看现在的 storage driver 配置
[Alick@Al-TERAFORM-CENTOS-1 ~]$ docker info | grep 'Storage Driver'
Storage Driver: overlay2
如果你想要修改 storage driver 的设置, 有两种方法来实现:
- 第一种办法就是在 docker 启动的时候添加 “--storage-driver” flag
- 第二种办法就是在 “/etc/docker/daemon.json” 中修改 “storage-driver” 的 value
Method 1 - PASS the flag
我们在修改文件 /usr/lib/systemd/system/docker.service
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo vi /usr/lib/systemd/system/docker.service
[sudo] password for Alick:
在中间找到带 “ExecStart” 这一行
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
然后添加 “--storage-driver devicemapper” 这个 flag,修改为
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd --storage-driver devicemapper -H fd:// --containerd=/run/containerd/containerd.sock
修改保存完之后,我们重启 systemd 服务并重启 docker
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo systemctl daemon-reload
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo systemctl restart docker
然后我们在使用 docker-info 来查看
[Alick@Al-TERAFORM-CENTOS-1 ~]$ docker info | grep 'Storage Driver'
Storage Driver: devicemapper
WARNING: the devicemapper storage-driver is deprecated, and will be removed in a future release.
WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
但是这种方法其实并不是推荐的办法。
Method 2 - PASS the flag
在执行第二种方法之前,请确定我们已经 rollback 了第一种方法所修改的配置
请修改文件 /usr/lib/systemd/system/docker.service
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo vi /usr/lib/systemd/system/docker.service
[sudo] password for Alick:
在中间找到带 “ExecStart” 这一行并恢复为如下的配置
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改保存完之后,我们重启 daemon 服务并重启 docker
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo systemctl daemon-reload
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo systemctl restart docker
然后我们修改下面的 configuration file
sudo vi /etc/docker/daemon.json
修改 daemon configuration file 的内容
{
"storage-driver": "overlay2"
}
修改保存完之后,我们重启 daemon 服务并重启 docker
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo systemctl daemon-reload
[Alick@Al-TERAFORM-CENTOS-1 ~]$ sudo systemctl restart docker
然后我们在使用 docker-info 来查看, 可以看到我们使用这种推荐的方法修改成功了。
[Alick@Al-TERAFORM-CENTOS-1 ~]$ docker info | grep 'Storage Driver'
Storage Driver: overlay2