Docker中的容器数据持久化问题

 更新时间:2026年03月04日 09:48:09   作者:五星上炕  
本文介绍了Docker容器中数据持久化的方法,包括默认的可读写层、volumes、bindmounts和tmpfs,volumes是官方推荐的持久化方案,而bindmount和tmpfs则适用于不同的场景,在使用mount类型时,需要注意一些细节,如挂载空volume、bindmount非空目录等

Docker容器数据持久化

参考:https://docs.docker.com/storage/

默认情况下,container内部新创建文件或者修改文件,结果会保存在container的可读写层中,这意味着:

  • 当container消失时,与container一体的可读写层也一并消失,数据并没有持久化。并且,当一个container需要其它container中可读写层的数据时,取出操作非常困难。
  • container的可读写层与宿主机的文件系统紧密结合,很难将它从一台宿主机迁移到其它宿主机。
  • container的可读写层,低下需要一个实现联合文件系统的storage driver,与直接在宿主机文件系统中读写数据相比效率要低。

如果打算将数据持久化在宿主机的文件系统中,docker提供至少两个选项:volumes与bind mounts,如果docker运行在Linux操作系统中,还可以使用tmpfs .mount。

选择正确的mount类型

无论你选择那种mount类型,从container内部看没有区别,它们都是目录或者文件。数据都是寄存在宿主机上,只不过具体位置有所区别,如下:

  • bind mount:将宿主机中的文件、目录mount到容器上。其上的数据可以被宿主机读写,可以被mount它的所有容器读写。
  • volume:volume由docker管理,比如创建、删除什么的。默认情况下,volume的存储空间来自于宿主机文件系统中的某个目录,如/var/lib/docker/volumes/,docker系统这外的程序不应该修改其中的数据。volume是官方推荐的持久化方案。
  • tmpfs mount:tmpfs类型文件与普通文件的区别是只存在于宿主机内存中,不会持久化。

有关挂载类型的更多详细信息

volumes:由docker负责创建、管理。用户可以显式的调用命令docker volume create创建volume,也可以通过container、service的启动隐式创建。

  • 默认情况下创建的volume本质上还是宿主机文件系统中的一个目录,与普通目录无本质区别。一个volume可以同时供多个container使用,如果没有container使用volume,它不会自动删除,用户需运行docker volume prune明确删除它。
  • 如果用户显式创建volume则需要给它指定一个名称,如果是隐式创建volume则docker会自动为它分配一个在宿主机范围内唯一的名字。
  • 通过使用第三方提供的volume driver,用户可以将数据持久到远程主机或者云存储中,也就是说存储空间可以不由宿主机提供。

bind mount:本质上是宿主机、container之间共享宿主机文件系统。这种持久化方法更导致container与宿主机的耦合过于紧密,所以不推荐使用。

tmpfs mount:有特定的应用场景。比如docker可将用户名与密码等敏感数据保存在某个数据库中,当启动需要访问这些敏感数据的container或者service时,docker会在宿主机上创建一个tmpfs,然后将敏感数据从数据库读出写到tmpfs中,再将tmpfs mount到container中,安样能保证数据安全。当容器停止运行时,则相应的tmpfs也从系统中删除。

在创建容器时,bind mount与volume两种方式使用的选项相同,都是-v或者--volume,而实际上在语法上有明显的区别。tmpfs通过--tmpfs选项实现。总之在旧版本的docker中,这一块的语法有点混乱,从docker17.0.6开始,推荐使用新选项--mount,它要清晰的多。

volume适用场景

  • 多个容器这间共享数据
  • 宿主机不保证存在固定的目录结构
  • 持久化数据到远程主机或者云存储而非本地
  • 需要备份、迁移、合并数据时。停止container,将volume整体复制,用于备份、迁移、合并等。

bind mount适用场景

  • container共享宿主机配置文件。比如docker会将宿主机文件/etc/resov.conf文件bind mount到容器上,两者会使用相同的DNS服务器。
  • 开发环境中宿主机与container之间共享源代码、构建构件等。比如将整个build过程container化,将宿主机上的源代码文件夹bind mount到build container中。修改代码后,运行build container的build命令,build container则将build结构写入另一个bind mount的文件夹中。
  • 一些监控类container,通过读取宿主机固定文件中的数据实现监控等。

使用bind mount与volume的提示

  • 如果将空volume挂载到container上的某个目录,此目录下原来的文件与子目录会复制到空volume中。
  • 如果bind mount一个非空目录或者文件,或者非空volume,则container目录中的原始内容将被遮蔽,当解决挂载时则自动恢复。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Docker daemon 无法启动: does not match with stored UUID错误解决办法

    Docker daemon 无法启动: does not match with stored UUID错误解决办法

    这篇文章主要介绍了Docker daemon 无法启动: does not match with stored UUID错误解决办法的相关资料,需要的朋友可以参考下
    2016-11-11
  • 详解Docker 容器跨主机多网段通信解决方案

    详解Docker 容器跨主机多网段通信解决方案

    这篇文章主要介绍了Docker 容器跨主机多网段通信解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • docker启动容器服务后访问失败的解决方案

    docker启动容器服务后访问失败的解决方案

    初学Docker容器的基本操作,拉取了tomcat镜像,输入运行容器命令运行容器一系列操作都没有问题,但是在浏览器访问端口时却访问不到,下面这篇文章主要给大家介绍了关于docker启动容器服务后访问失败的解决方案,需要的朋友可以参考下
    2023-05-05
  • 云原生使用Docker部署mysql数据库的详细过程

    云原生使用Docker部署mysql数据库的详细过程

    使用docker部署mysql,可以省去mysql的安装配置过程,而且不限制数量,即起即用,下面这篇文章主要给大家介绍了关于云原生使用Docker部署mysql数据库的详细过程,需要的朋友可以参考下
    2023-03-03
  • docker可视化图形工具portainer详解

    docker可视化图形工具portainer详解

    Portainer 是一个可视化容器镜像的图形管理工具,利用 Portainer 可以轻松构建,管理和维护 Docker 环境,接下来通过本文给大家介绍docker可视化图形工具portainer知识,感兴趣的朋友一起看看吧
    2021-11-11
  • Linux/Docker 中使用 System.Drawing.Common 踩坑记录分享

    Linux/Docker 中使用 System.Drawing.Common 踩坑记录分享

    这篇文章主要介绍了Linux/Docker 中使用 System.Drawing.Common 踩坑记录,本文通过两种方案给大家详细介绍,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Docker配置国内加速器加速镜像下载的方法

    Docker配置国内加速器加速镜像下载的方法

    本篇文章主要介绍了Docker配置国内加速器加速镜像下载的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • docker中的load和save镜像重命名介绍

    docker中的load和save镜像重命名介绍

    使用docker save保存镜像时若仅用IMAGEID,加载后镜像名会显示为<none>,因未包含REPOSITORY和TAG信息,解决方法:加载后用docker tag命令手动指定新名称和标签
    2025-09-09
  • Docker容器名称冲突错误的原因分析和有效解决方案

    Docker容器名称冲突错误的原因分析和有效解决方案

    这篇文章主要介绍了Docker容器名称冲突的问题,分析了错误发生的原因,并提供了几种解决方案:删除现有容器、重命名容器、使用不同名称创建新容器,以及更新现有容器的重启策略,文章还推荐了预防措施,需要的朋友可以参考下
    2025-10-10
  • Docker安装宝塔面板的实现

    Docker安装宝塔面板的实现

    本文主要介绍了Docker安装宝塔面板的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08

最新评论