Docker学习笔记(三)存储与卷
挂载机制介绍
我们都知道,默认下,Docker容器与宿主机是完全隔离的,这种特性使得我们创建与删除容器都变得更方便,不需要再去删除宿主机上容器遗留下来的痕迹。
但是,当我们使用数据库一类需要持久化数据、共享数据,或希望在容器删除后数据依旧存在,在下次创建其他容器时继续使用该数据时,就不得不通过一种方式,让容器中的数据放在宿主机或其他存储系统上。
Docker 的挂载机制允许将宿主机的文件或目录挂载到 Docker 容器内部。这样容器就可以访问宿主机上的文件系统,并将存储到宿主机指定位置上,使得数据持久化。
Docker有以下三种挂载方式:
- 绑定挂载(推荐用卷挂载替代)
- 常驻内存挂载(又名临时挂载)
- 卷挂载
绑定挂载
将主机文件系统中用户指定的位置附加到容器文件树的指定挂载点上。
使用场景:当主机提供容器运行的程序或目录,或当容器内的程序生成了需要用户/外部程序处理的日志或文件时。
使用命令:
docker run -d --name [容器名] \
--mount type=bind,src=${主机文件地址},dst=${容器内挂载点}
······
[镜像名]
存在风险:可移植性差、容器之间容易出现冲突。
常驻内存存储
顾名思义,这种操作会将数据写入内存中。避免写入数据到容器存储层;是一种非持久化的数据存储,仅将数据保存都在宿主机的内存中,一旦容器停止运行tmpfs mount就会被移除,从而总成数据丢失。
使用场景:tmpfs挂载仅适用于linux主机;常用于存储私钥文件、数据库密码等敏感数据文件,有时也用做上传数据的缓存空间。
使用命令:
docker run -d --name [容器名] \
--mount type=tmpfs,dst=${容器内挂载点},\
tmpfs-size=2048,\ #挂载的tmpfs的宇节数,默认不受限制。
tmpfs-mode=1700 \ # tmpfs的文件模式,例如700或者1700,默认值为1777,表示任何用户都有写入权限 。1700表示文件所有者有读/写权限,而组用户和其他用户没有任何权限。
······
[镜像名]
卷
被命名为由Docker管理的文件系统树;是对绑定挂载的解耦。它会将主机文件系统的一部分映射为docker卷,而使用者无需关心具体存储位置,只需要知道卷名即可。并且,卷作为数据的容器则更易于共享。
使用命令
#创建卷
docker volume create [vName]
#检查卷
docker volume inspect
#卷的使用
docker run -v/--volume [vName]/[hostPath]:[containerPath]
匿名卷与命名卷
在最后一条卷的使用
命令上,我们可以看的`-v``后面既可以使用命名卷,也可以使用主机目录,这种用法被称为匿名卷;两者的不同点在于
- 命名卷:命名卷对应的主机目录下没有数据时,会去映射容器中的数据。当容器被删除时,命名卷不会被删除,它必须手动删除。并且正在被使用的卷无法被删除。
- 匿名卷:主机目录下没有数据时,容器获取的数据也完全是空的。当容器被删除时,对应的匿名卷也会被删除。 类同于绑定挂载。
卷的共享
除了通过名称引用卷外,Docker还提供了另一种指定挂载依赖项的方法。
docker run命令提供了--volumes-from [容器名]
标识选项,用于将挂载定义从一个或多个容器复制到新的容器。这个标识选项可以被设定多次。通过组合使用这个标识选项和匿名卷,可以按照主机无关的方式构建卷共享关系。
当然,从另一个容器复制卷时,还将复制该容器从其他容器复制卷。
由于复制的卷始终具有相同的挂载点,这意味着以下三种情况不能使用--volumes-from
1) Docker没有提供重新映射挂载点的工具,因此,如果要构建的容器需要将共享卷安装到其他位置,就不能使用--volumes-from
2) 如果一个或多个文件系统源使用相同的挂载点创建卷,那么容器使用--volumes-from
复制卷时,只能收到一个卷的定义,导致用户只能访问部分所需要的数据。
3) 当用户需要更改卷的写入权限时,也不能用该命令。因为--volumes-from
从源卷完整的复制了卷的定义。
扩展内容
Docker提供了卷插件接口,通过安装合适的卷插件,Docker可以提供由网络存储或者其他更复杂工具支持的卷。