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. JS:函数

    Function:函数 1. 定义一个函数:function functionname(argument) { 代码块 return }: 调用此函数:fn() 2.函数是定义了一种方法,只有被调用才 ...

  2. 从Mpx资源构建优化看splitChunks代码分割

    背景 MPX是滴滴出品的一款增强型小程序跨端框架,其核心是对原生小程序功能的增强.具体的使用不是本文讨论的范畴,想了解更多可以去官网了解更多. 回到正题,使用MPX开发小程序有一段时间了,该框架对不同 ...

  3. 实践GoF的23种设计模式:装饰者模式

    摘要:装饰者模式通过组合的方式,提供了能够动态地给对象/模块扩展新功能的能力.理论上,只要没有限制,它可以一直把功能叠加下去,具有很高的灵活性. 本文分享自华为云社区<[Go实现]实践GoF的2 ...

  4. XML方式配置切面

    1. 概述  一个切面中需要包含什么,才能够作用到连接点?切面中是包含通知的,通知作用到连接点需要有切入点表达式. 除了使用AspectJ注解声明切面,Spring也支持在bean配置文件中声明切面. ...

  5. .NET Core 实现后台任务(定时任务)IHostedService(一)

    原文链接:https://www.cnblogs.com/ysmc/p/16456787.html 最近有小伙伴问道,在 .Net Core 中,如何定时执行任务,而因为需要执行的任务比较简单,并不想 ...

  6. 👨‍💻Mybatis源码我搞透了,面试来问吧!写了134个源码类,1.03万行代码!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言:手撸一万行! 完结撒花:4个月.20章.134个类.1.03万行代码! 22年3月初 ...

  7. 意想不到的Python ttkbootstrap 制作账户注册信息界面

    嗨害大家好,我是小熊猫 今天给大家来整一个旧活~ 前言 ttkbootstrap 是一个基于 tkinter 的界面美化库,使用这个工具可以开发出类似前端 bootstrap 风格的tkinter 桌 ...

  8. 【Azure 存储服务】Hadoop集群中使用ADLS(Azure Data Lake Storage)过程中遇见执行PUT操作报错

    问题描述 在Hadoop集中中,使用ADLS 作为数据源,在执行PUT操作(上传文件到ADLS中),遇见 400错误[put: Operation failed: "An HTTP head ...

  9. Data too long for column 'xxx' at row

    Data too long for column 'xxx' at row 数据库的默认的utff-8,且连接的字符串也设置了utf-8,数据库字段用的text,但是还是报错,原因超出了长度,要最大的 ...

  10. 从零开始实现lmax-Disruptor队列(五)Disruptor DSL风格API原理解析

    MyDisruptor V5版本介绍 在v4版本的MyDisruptor实现多线程生产者后.按照计划,v5版本的MyDisruptor需要支持更便于用户使用的DSL风格的API. 由于该文属于系列博客 ...