容器中的数据

虽然在容器中我们可以读写文件,但是把数据直接存储于容器的可写层至少会有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学习社”

results matching ""

    No results matching ""