一、Docker存储概念
1、容器本地存储与Docke存储驱动
容器本地存储:每个容器都被自动分配了内部存储,即容器本地存储。采用的是联合文件系统。通过存储驱动进行管理。
容器本地存储空间:分层结构构成,由一个可写容器层和若干只读的镜像层组成。
联合文件系统:Docker的一种底层技术,由存储驱动(Storage Driver)实现。相应的存储驱动有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs等。
存储驱动:控制镜像和容器在 docker 主机上的存储和管理方式。
每个Docker主机只能选择一种存储驱动,不能为每个容器选择不同的存储驱动。
(1)查看主机支持的存储驱动
[root@hqs ~]# docker info# 找到如下信息
Storage Driver: overlay2 # 存储驱动是overlay2
Backing Filesystem: xfs # 底层文件系统是xfs
Supports d_type: true# 支持d_type
Native Overlay Diff: true
userxattr: false
(2)更改现有的存储驱动
可以根据需要修改现有的存储驱动。
注意:
一个主机只能选择一个存储驱动。
系统版本和存储驱动的兼容问题。
更改存储驱动会使得现有的容器和镜像不可访问(原因:每种存储驱动存储镜像层的位置是不同的)
但恢复存储驱动,可以再次访问之前的镜像和容器
# 修改daemon.json文件来更改存储引擎配置
[root@hqs ~]# vi /etc/docker/daemon.json
{
"registry-mirror":["https://registry.docker-cn.com"],
"storage-driver":"overlay" 《————————添加这个信息
}
# 重启docker生效
[root@hqs ~]# systemctl daemon-reload
[root@hqs ~]# systemctl restart docker
[root@hqs ~]# docker info# 找到如下信息
Storage Driver: overlay 《————————修改生效
Backing Filesystem: xfs
Supports d_type: true# 更改存储驱动会使得现有的容器和镜像不可访问
[root@hqs ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# 恢复存储驱动,可以再次访问之前的镜像和容器
[root@hqs ~]# vi /etc/docker/daemon.json
{
"registry-mirror":["https://registry.docker-cn.com"]
}
[root@hqs ~]# systemctl daemon-reload
[root@hqs ~]# systemctl restart docker
[root@hqs ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 825d55fb6340 2 weeks ago 72.8MB
centos latest 5d0da3dc9764 7 months ago 231MB
2、容器和非持久化数据
非持久化数据:不需要保存的数据。容器本地存储中的数据属于非持久化数据。
容器创建时会创建非持久化存储,非持久化存储自动创建,从属于容器,生命周期与容器相同。删除容器也会删除全部非持久化数据。
非持久化数据存在问题:
这类数据从属于容器,生命周期与容器相同,会随着容器的删除而被删除。(易丢失)
当该容器不再运行时,数据不会持久保存,如果另一个进程需要,则可能很难从该容器中获取数据。(难获取)
容器的可写层与运行容器的Docker主机紧密耦合,无法轻松地将数据转移到其他位置。(难转移)
写入容器的可写层需要Docker存储驱动管理文件系统。存储驱动使用Linux内核提供的联合文件系统,其性能不如直接写入主机文件系统的Docker卷。(读写性能差)
3、容器和持久化数据
持久化数据:需要保存的数据。例如:日志、业务数据、客户信息等有用的数据。
外部存储:Docker通过将主机中的文件系统挂载到容器中供容器存取,从而实现持久化数据存储。
容器持久化数据存储方式:Docker目前支持卷、绑定挂载,这两种挂载类型实现容器的持久化。
卷(数据卷):Docker中进行持久化数据存储的最佳方式。本质是Docker主机文件系统中的目录或文件直接挂载到容器的文件系统中。
卷和容器是解耦的,可以独立地创建并管理卷
卷不与容器的生命周期绑定(容器的停止删除和卷无关)
可以将任意数量的卷装入容器,多个容器也可以共享一个或多个卷(多对多关系)
4、挂载类型
往容器中挂载的外部文件系统主要有:卷、绑定挂载、tmpfs挂载。无论哪种挂载,对容器内部来说是一样的,都会显示为文件或目录。
(1)卷
卷存储在主机文件系统中由Docker管理的位置,在Linux主机上该位置默认就是/var/lib/docker/volumes目录。
卷是Docker持久化存储数据的最佳方式。卷支持使用卷驱动,可以让用户将数据存储在远程主机或云提供商处等。
可以以命名方式或匿名方式挂载卷:
匿名卷(Anonymous Volumes):首次挂载容器未指定名称,Docker为其随机指定一个唯一名称。
命名卷(Named Volumes):指定明确名称,和匿名卷其他特性相同。
卷由Docker创建并管理,卷适合以下应用场景。
在多个正在运行的容器之间共享数据。(数据共享)
当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置与容器运行时解耦。(构建新目录与主机不同)
当需要将容器的数据存储到远程主机或云提供商处,而不是本地时。(可以远程挂载卷,公有云、灾备等场景)
当需要在两个Docker主机之间备份、恢复或迁移数据时。(主机间备份迁移)
(2)绑定挂载
绑定挂载可以存储到主机系统的任意位置,甚至会存储到一些重要的系统文件或目录中。
特点:
主机上进程或容器可以随时修改。
相比卷,功能更受限、性能更高。
绑定挂载运行访问敏感文件。
绑定挂载适合以下应用场景。
在主机和容器之间共享配置文件。
在Docker主机上的开发环境和容器之间共享源代码或构建工件。
当Docker主机上的目录结构保证与容器要求的绑定挂载一致时。
(3)tmpfs挂载
tmpfs挂载仅限于运行Linux操作系统的Docker主机使用,它只存储在主机的内存中,不会被写到主机的文件系统中,因此不能持久保存容器的应用数据。
在不需要将数据持久保存到主机或容器中时,tmpfs挂载最合适。
如果容器产生了非持久化数据,那么可以考虑使用tmpfs挂载避免将数据永久存储到任何位置,并且通过避免写入容器的可写层来提高容器的性能。
【文章福利】:免费领取更多C/C++ Linux服务器、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,golang技术,内核,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg,大厂面试题 等)有需要的可以点击