首页 > 其他分享 >关于使用docker volume挂载的注意事项

关于使用docker volume挂载的注意事项

时间:2022-09-01 17:27:05浏览次数:107  
标签:容器 bind mount volume 使用 挂载 docker

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下只需要创建相同的目录结构就也可以实现的文件绝对路径在不同系统的一致性。

参考

标签:容器,bind,mount,volume,使用,挂载,docker
From: https://www.cnblogs.com/podolski/p/16647195.html

相关文章

  • 记一次使用docker搭建禅道
    相关docker-compose.yml内容如下version:'3.3'services:zentao:container_name:zentaoports:-'10011:80'volumes:......
  • 实战 | Docker+Jmeter+InfluxDB+Grafana 搭建性能监控平台
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取1.为什么要搭建性能监控平台?本身带有聚合报告如下图所示:这个报告有几个很明显的缺点::中获......
  • 学习Docker就应该掌握的dockerfile语法与指令
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取在日常的工作中,常常需要制作自己的项目的镜像,一般通过以下两种方式制作镜像:Dockercommit、Doc......
  • 微服务Docker打包
    微服务Docker打包现在的微服务时代,你的代码没个微服务、分布式人家都会觉得低端,当然!对于我们开发人员来说,掌握这些技术意味着涨薪。​ 我们项目中用到了多个微服务,我......
  • 关于docker创建容器报错-docker: Error response from daemon: runtime "io.container
    今天在对一台服务器(docker相关的业务服务器)进行OS补丁时,默认使用的yumupdate-y对所有的安装包进行了升级升级完成后,让应用方检查确认应用及功能是否一切正常,如果不正......
  • 给Docker集群中Label节点打上标签与服务约束
    https://www.cnblogs.com/caoweixiong/p/12382282.htmlLabel作用:在服务器中通常需要将某个服务固定在某一台机器上运行的时候,可以给集群中的机器打上标签......
  • Docker镜像构建
    Docker镜像构建目录Docker镜像构建Dockercommit基于本地模板导入Dockerfile​ Docker镜像可以通过Dockerhub或者阿里云等仓库中获取,这些镜像是由官方或者社区人员提供......
  • 只需搞定Docker,环境问题再也不是测开路上的『坑』
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取轻量级:因为docker不用虚拟化内核,直接共享宿主机的内核,所以节省了很多资源,在同样的资源下可以......
  • liunx系统docker部署.net core3.1
    此篇文章演示基本的基于docker部署.netcore服务,liunx系统腾讯云ubuntu,.netcore版本3.1。1.安装dockeraptinstalldocker.io2.拉取.netcore依赖镜像dockerpullm......
  • docker教程-常用命令
    背景docker适配的时候命令总是记得很熟,当版本结束了docker命令忘的差不多,这次记录一下docker基本操作获取镜像dockerpullubuntu列出镜像列表dockerimages删除镜......