容器中的数据
虽然在容器中我们可以读写文件,但是把数据直接存储于容器的可写层至少会有3个缺陷:
数据无法持久化。当容器一旦处于某种原因无法再启动时,意味着里面的数据也无法被读取了。
与容器耦合程度高。容器中的数据无法被主机或其它容器访问。
写入数据将会被转化成联合文件系统格式,不如直接写入主机文件系统速度快。
所以Docker提供了3种挂载容器数据的方式:存储卷、绑定挂载、tmpfs卷。用一张图来说明这些存储方式:

卷
通过Docker来创建一个卷并以文件的形式存储于主机磁盘中,非Docker进程无法修改这个文件系统,Docker官方最推荐的存储数据方式,原因如下:
相比绑定挂载方式,数据更加容易迁移和备份。
可以通过Docker命令或Docker API来进行管理。
在Linux和Windows主机上都可用。
跨容器共享数据时更安全。
允许存储到远程主机或晕设备上,允许对数据进行加密或其它高级功能。
新的卷能被容器内的文件预填充。
使用场景
多容器共享数据时。当容器需要的卷不存在时,会创建一个新的卷。卷也不会随着容器的消失而消失,需要手动删除。而且还可以设置其“只读”、“可读写”属性。
当主机无法提供给定的目录或文件结构时,卷能解耦主机和容器运行环境。
当数据需要被存储于云设备或远程主机而不仅仅是本地。
当数据需要从一台主机上的容器备份/恢复/迁移到另一台主机上的容器时。
卷的管理
主要通过docker volume命令操作卷,具体如下:
// 创建卷,执行成功后会返回卷id。
docker volume create <卷名>
// 查看卷列表
docker volume ls
// 查看卷详情
docker volume inspect
// 删除卷,支持批量操作
docker volume rm <卷id或卷名>
// 删除未被使用的卷
docker volume prune
Docker没有提供对卷的导入导出命令,但是我们也有办法对卷内的数据进行迁移。
使用方式
只能在创建容器时指定卷与容器内部目录的对应关系。
简单方式:
docker run -v 卷名:/module nginx
复杂方式:
docker run --mount source=vol,target=/module,readonly nginx
绑定挂载
直接让容器与主机共享文件或目录,它可能被存储于主机的任何位置或者被任何进程修改。
使用场景
配置文件。
开发环境中的源代码或者编译后的代码。
其它一些特殊的文件或目录结构
tmpfs挂载
只存储于主机的内存中,不会写入主机文件系统。
使用场景
出于安全原因,不想把数据持久化也不想存储于容器中时,想要用后立即删除。
出于性能原因,一些大数据需要快速读写。
本书地址:https://yalishizhude.gitbooks.io/docker-book/
更多web技术内容请关注公众号“web学习社”
