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上安装和卸载MySQL数据库详细图文教程

    docker上安装和卸载MySQL数据库详细图文教程

    Docker是一种容器化技术,可以快速方便地部署和管理应用程序,Mysql 是一个开源的关系型数据库管理,系统这篇文章主要给大家介绍了关于docker上安装和卸载MySQL数据库的相关资料,需要的朋友可以参考下
    2024-05-05
  • Docker-compose离线安装全过程

    Docker-compose离线安装全过程

    下载docker-compose-Linux-x86_64并上传至CentOS7的/usr/local/bin目录,重命名为docker-compose,添加执行权限,最后通过版本命令测试安装是否成功
    2025-08-08
  • 使用Docker运行SQL Server的实现

    使用Docker运行SQL Server的实现

    这篇文章主要介绍了使用Docker运行SQL Server的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • 分享8个基本的Docker容器管理命令

    分享8个基本的Docker容器管理命令

    本文给大家分享8个基本的Docker容器管理命令,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-06-06
  • 部署安装docker及项目搭建所需要的基础环境实践(mysql、redis、nginx、nacos)

    部署安装docker及项目搭建所需要的基础环境实践(mysql、redis、nginx、nacos)

    本文介绍通过docker-run.sh和docker-compose.yml实现一键部署Docker及Web服务,解决环境不一致问题,包含MySQL、Nacos、Nginx等配置,并提供GitHub代码链接便于直接使用
    2025-07-07
  • 安装docker20.10.22版本教程

    安装docker20.10.22版本教程

    文章详细介绍了如何安装Docker 20.10.22版本,包括安装证书、写入软件源信息、查看可安装版本、解决安装问题、启动Docker、安装工具、设置阿里云镜像加速器、重启并设置开机自启以及查看版本信息
    2026-02-02
  • Docker搭建Portainer可视化界面步骤详解

    Docker搭建Portainer可视化界面步骤详解

    在本篇文章里小编给大家分享的是一篇关于Docker搭建Portainer可视化界面的实例操作方法,需要的朋友们参考下。
    2019-10-10
  • Docker安装Minio+SpringBoot上传下载文件方式

    Docker安装Minio+SpringBoot上传下载文件方式

    本文主要介绍了如何通过Docker安装Minio并进行访问测试,同时也讲解了如何在SpringBoot中上传文件到Minio,内容包含了pom文件引入依赖,application.properties配置,Minio配置,MinioClinet,FileService,FileServiceImpl的配置
    2024-10-10
  • docker overlay扩容问题

    docker overlay扩容问题

    这篇文章主要介绍了docker overlay扩容问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Docker-compose的安装和设定详细步骤

    Docker-compose的安装和设定详细步骤

    这篇文章主要介绍了Docker-compose的安装和设定的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论