Content

在用Docker进行持久化的存储的时候,有两种方式:

  1. 使用数据卷(volume

    -v 容器绝对路径

或者

-v 已经创建的volume名称:容器绝对路径

2. 使用挂载点(共享宿主目录,bind mount)

-v 宿主绝对路径:容器绝对路径

由于两种方法都可以使用-v--mount参数,但是实际上两种方式的行为区别非常大。

  1. 目录兼容性

    volume只能映射容器的目录,而bind mount方式可以是目录也可以是文件。

  2. 可移植性

    volume的文件系统由docker进行管理,对不同系统都可以通用兼容;bind mount需要指定绝对路径,不同的操作系统,对路径的表述是有区别的,往往无法实现互通。

  3. 目录替代相关

    如果使用volume,那么容器内的文件会被保留在volume中(对应的_data文件夹)内部,也就是文件被复制到宿主机器上;使用bind mount时,如果宿主文件夹是空的,那么容器的内容会被覆盖为空,对于一些容器内路径文件夹存放config文件的情况,宿主目录为空会导致容器内的对应目录被清空,造成启动错误的问题。(详细对比可以看这篇文章)。

在宿主文件不为空的情况下,都会覆盖容器路径的文件。

  1. 指定位置

    使用volume不能指定的volume存在的位置,这个是由docker管理的(默认/var/lib/docker/volumes/),可以通过docker的daemon.json文件进行配置,详情可以翻翻之前我写的文章;而使用bind mount的情况则必须指定位置。

--volume与--mount区别

在创建bind mount的时候,使用--volume会自动创建宿主方的文件夹,而--mount不会,因此使用--mount映射不存在的目录,会报错。

镜像保存

之前写过一篇有关于docker export import相关的文章,想着是运行时候增加的配置文件等内容,可以直接保留。后来发现,不管是volume还是bind mount,两种方式都无法将文件保存到镜像中,因此需要进行单独的文件保存工作。

docker-compose

docker-compose指定的时候,有一些区别:

  • 使用bind mount的时候,宿主这边可以使用相对路径了(./),不需要显示指定($PWD)
  • 可以在指定volume名称的同时创建volume,需要使用volume:的配置项

podman兼容性

在CentOS类的发行版中,从8开始,已经使用podman替代了docker,直接安装docker的情况下会默认安装podman,并且将docker命令全部替换成podman命令,大多数命令是通用的。有几个地方需要注意:

  • podman是无deamon程序的,也就是没有一个专门的守护进程,因此运行的权限要求也更低,存档volume的位置有区别,使用更加方便。
  • podman使用-v进行bind mount时,如果宿主机器目录不存在,那么podman会直接报错,而不会自动创建文件。

实践指南

  • 使用docker-compose创建可以移植的系统,请使用volume。
  • 使用docker export方式导出文件的情况下,记住单独保存映射的volume或者bind mount。
  • 如果替换某一个具体配置文件,只能使用bind mount形式;否则,建议使用volume,因为这样能够将容器内已经有的目录复制到volume中,防止空文件夹覆盖容器对应文件夹导致容器启动错误。
  • 为了保障对podman的兼容性,请先创建宿主机需要mount的文件夹。
  • 【不建议】实现bind mount形式在linux与windows下的兼容性,windows下的docker desktop可以正确解析/c/windows这样的路径,在linux下只需要创建相同的目录结构就也可以实现的文件绝对路径在不同系统的一致性。

参考

关于使用docker volume挂载的注意事项的更多相关文章

  1. rexray在CentOS上不能创建ceph rbd的docker volume问题定位

    背景 我们通过docker的rexray插件来创建ceph rbd设备的docker volume,但总提示创建失败. # docker volume create --driver=rexray - ...

  2. docker volume创建、备份、nfs存储

    docker存储volume #环境 centos7.4 , Docker version 17.12.0-ce docker volume创建.备份.nfs存储 #docker volume 数据存 ...

  3. 理解OpenShift(5):从 Docker Volume 到 OpenShift Persistent Volume

    理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...

  4. Docker学习笔记之docker volume 容器卷的那些事(二)

    预览目录 更改目录拥有者 Data Container 切换用户 参考文章 0x00 概述 如果你读了docker volume 容器卷的那些事(一),我想应该不会遇到下面这些问题的,毕竟是具有指导意 ...

  5. Docker学习笔记之docker volume 容器卷的那些事(一)

    预览目录 volume 方式 相关用例 使用方式 使用 volume driver bind mount 方式 相关用例 使用方式 配置selinux标签 配置macOS的安装一致性 tmpfs 方式 ...

  6. 深入理解Docker Volume(一)

    想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的.Docker镜像是由多个文件系统(只读层)叠加而成.当我们启动一个容器的时候,Docker会加载镜像层并在其上添 ...

  7. 利用Docker volume修改Nginx Docker镜像里index.html

    通过这个小例子我们可以进一步加深对Docker volume概念的理解和使用方法. 我们都知道运行基于Docker的Nginx镜像后,访问localhost能看到Nginx默认的首页,这个首页的位置是 ...

  8. Docker volume speed up npm install

    上一节决定在Jenkins中采用Docker作为构建环境,于是就可以为所欲为的使用各种node版本编译我们的项目.解决了版本切换问题.然而,Docker设计的目的就是纯净的执行环境,因此每次运行doc ...

  9. Docker数据挂载

    Docker数据管理 在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录(Bind mounts) 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很 ...

随机推荐

  1. 实测:云RDS MySQL性能是自建的1.6倍

    1. 摘要 基于之前写的「云厂商 RDS MySQL 怎么选」的文章,为了进一步了解各云厂商在RDS MySQL数据库性能上的差异,本文将对自建MySQL.阿里云.腾讯云.华为云和AWS 的 RDS ...

  2. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

  3. CF1656E Equal Tree Sums 题解

    题目链接 思路分析 自认为是一道很好的构造题,但是我并不会做. 看了题解后有一些理解,在这里再梳理一遍巧妙的思路. 我们先来看这样的一张图: 我们发现当去掉叶子节点的父亲时,剩下树的价值和等于叶子节点 ...

  4. Java学习dayo4

    分支结构和循环语句 1.包的概念 包就是文件夹 包的命名规范:全小写,域名倒置,不能以点开头或结尾,可以包含点,每存在一个点表示一个子目录 举例:com.baidu.demo 定义包后,包中的java ...

  5. Homebrew安装(macos)

    参照大佬的博客文章:https://zhuanlan.zhihu.com/p/111014448 OSX 将下面命令复制到终端执行 /bin/zsh -c "$(curl -fsSL htt ...

  6. docker容器数据管理

    Docker容器数据卷 Docker中的数据可以存储在类似于虚拟机磁盘的介质中,在Docker中称为数据卷(Data Volume). 数据卷可以用来存储Docker应用的数据,也可以用来在Docke ...

  7. fiddler5+雷电模拟器4.0对app抓包设置

    这次项目刚好需要对微信小程序进行抓包分析,二话不说拿起手机咔咔一顿连接,发现在备用机苹果上抓包正常,但主的安卓机上证书怎么装都失败,原来安卓7版本以后对用户自行安装的证书不再信任,所以无法抓包. 因为 ...

  8. Centos7基本配置信息查看

    Centos7查看cpu,内存,磁盘等信息 cpu信息 cat /proc/cpuinfo |grep "model name" && cat /proc/cpui ...

  9. 「游戏引擎 浅入浅出」4.1 Unity Shader和OpenGL Shader

    「游戏引擎 浅入浅出」从零编写游戏引擎教程,是一本开源电子书,PDF/随书代码/资源下载: https://github.com/ThisisGame/cpp-game-engine-book 4.1 ...

  10. vue 数据更新了但视图没改变?试试 $set

    场景 编辑表格中某行数据时,需要把它赋值给对话框表单 this.form,如果直接用 = 赋值,会导致:表单的输入框内容无法二次编辑. 使用 Vue-dev-tool 的 Components 功能测 ...