搜索
首页运维Dockerdocker volume和挂载的区别是什么

“docker volume”和挂载的区别是:“docker volume”是声明式的,“Docker Engine”本身会占用系统的某个目录,Docker会默认在占用的路径下为volume分配一个路径;而挂载不会占用一个路径作为挂载点。

docker volume和挂载的区别是什么

本教程操作环境:linux7.3系统、docker-1.13.1版、Dell G3电脑。

docker volume和挂载的区别是什么

一直一来,对于多个容器需要共享访问同一数据目录,或者需要持久化容器内数据(如数据库)时,我们都是采用挂载目录形式(bind mounts),将宿主机的某一目录挂载到容器内的指定目录,这种方式能解决问题,但这种方式也一直有一些缺点:

  • 容器在不同的服务器部署需要根据实际磁盘挂载目录修改路径
  • 不同操作系统的文件和目录权限会搞得你昏头转向,火冒三丈 ?

而这些问题,使用Volume就可以解决。我们先来对比一下bind mounts和docker volume,然后看volume是如何解决bind mounts的问题的。先来看一张图:

此图来自docker官方文档
此图来自docker文档

这张图说明bind mount和volume其实都是利用宿主机的文件系统,不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的服务器上指定不同的路径,你不需要关心路径(其实也不全是,下面会关心 ?)。接下来就来看看bind mount和volume的不同用法吧。

1. 容器在不同的服务器部署需要根据实际磁盘挂载目录修改路径

例如:

在Linux系统中,我们经常使用"/var/someDir"作为挂载目录;

然而到了Mac上,/var/ 并不是真实存在的目录,Mac用户会告诉你,我们比Linux更先进,我们不用 /var/,用户不需要;

在Windows系统中,Windows用户会反问你:/var/ 是什么?C盘、D盘是最合理的划分~~

大家都说自己最帅,到底谁是最帅的
mac中var目录是一个软链接

2. 不同操作系统的文件和目录权限会搞得你昏头转向,火冒三丈 ?

本来在Linux系统中测试的挺好,结果到了Windows上挂载路径各种问题,这里就不一一细说了,没有遇到这些问题的可以尝试一下,体验体验。不过在Mac中还好一些,毕竟和Linux同宗。

Docker中除了挂载方式,还有一种Volume可以持久化数据,说到这里有点汗颜,使用Docker这么久,一直把挂载当成Volume,不过也不怪我,Docker-compose文件中在volume段中写容器和宿主机挂载路径映射关系也没问题,就一直这么误解了。。(花式甩锅?)

其实“挂载”和“Docker Volume”并不是一回事,有一定的区别,Docker Volume是声明式的,Docker Engine本身会占用系统的某个目录,Linux一般为"/var/lib/docker",Mac和Windows下都可以调节。当我们声明一个volume,Docker会默认在占用的路径下为volume分配一个路径,例如:

标题

相对于挂载,volume是Docker Engine在自己的“地盘”分配了一个路径作为挂载点,自己地盘的权限肯定是安排的明明白白。所以,以上挂载宿主机路径的问题都解决了。?

在使用时,直接用volume名称代替宿主机路径名就行,假设我们上面创建了名为"test_vol"的volume:

  1. docker run -d -v "test_vol:/var/data" some_image,这样就将容器内的/var/data目录挂载到了"test_vol"的挂载点;
  2. docker-compose中类似,不过要在docker-compose.yaml文件中声明volume,我们还是拿上面的例子修改一下:

Attention !! 

  1. 需要注意 volume 会引起 docker目录膨胀,因为既要存镜像,又要存 volume,最好不要放在系统盘,将 docker 的安装目录配置到其他更大的挂载盘。
  2. 两者有一个不同的行为:当容器外的对应目录是空的,volume会先将容器内的内容拷贝到容器外目录,而mount会将外部的目录覆盖容器内部目录!!
  3. volume 还有一个不如bind mount的地方,不能直接挂载文件,例如挂载nginx容器的配置文件:nginx.conf。

这里需要说明,类似于配置文件这种单文件方式并不适合使用volume,bind mount虽然也可以解决,但由于config文件中包含一些类似于数据库密码等敏感信息,因此,最好的方式是使用tmpfs。

kubernetes的volume也体现出类似的设计,subPath虽然可以解决配置文件挂载的问题,但实际最好的方式是使用configMap。

推荐学习:《docker视频教程

以上是docker volume和挂载的区别是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Docker vs. Kubernetes:用例和方案Docker vs. Kubernetes:用例和方案Apr 23, 2025 am 12:11 AM

在小型项目或开发环境中选择Docker,在大型项目或生产环境中选择Kubernetes。1.Docker适合快速迭代和测试,2.Kubernetes提供强大的容器编排能力,适合管理和扩展大型应用。

Linux上的Docker:Linux系统的容器化Linux上的Docker:Linux系统的容器化Apr 22, 2025 am 12:03 AM

Docker在Linux上重要,因为Linux是其原生平台,提供了丰富的工具和社区支持。1.安装Docker:使用sudoapt-getupdate和sudoapt-getinstalldocker-cedocker-ce-clicontainerd.io。2.创建和管理容器:使用dockerrun命令,如dockerrun-d--namemynginx-p80:80nginx。3.编写Dockerfile:优化镜像大小,使用多阶段构建。4.优化和调试:使用dockerlogs和dockerex

Docker:容器化工具,Kubernetes:编排者Docker:容器化工具,Kubernetes:编排者Apr 21, 2025 am 12:01 AM

Docker是容器化工具,Kubernetes是容器编排工具。1.Docker打包应用及其依赖成容器,可在任何支持Docker的环境中运行。2.Kubernetes管理这些容器,实现自动化部署、扩展和管理,使应用高效运行。

Docker的目的:简化应用程序部署Docker的目的:简化应用程序部署Apr 20, 2025 am 12:09 AM

Docker的目的是简化应用部署,通过容器化技术确保应用在不同环境中一致运行。1)Docker通过将应用和依赖打包到容器中,解决了环境差异问题。2)使用Dockerfile创建镜像,确保应用在任何地方一致运行。3)Docker的工作原理基于镜像和容器,利用Linux内核的命名空间和控制组实现隔离和资源管理。4)基本用法包括从DockerHub拉取并运行镜像,高级用法涉及使用DockerCompose管理多容器应用。5)常见错误如镜像构建失败和容器无法启动,可通过日志和网络配置调试。6)性能优化建

Linux和Docker:不同Linux发行版的DockerLinux和Docker:不同Linux发行版的DockerApr 19, 2025 am 12:10 AM

在Ubuntu、CentOS和Debian上安装和使用Docker的方法各有不同。1)Ubuntu:使用apt包管理器,命令为sudoapt-getupdate&&sudoapt-getinstalldocker.io。2)CentOS:使用yum包管理器,需添加Docker仓库,命令为sudoyuminstall-yyum-utils&&sudoyum-config-manager--add-repohttps://download.docker.com/lin

掌握Docker:Linux用户指南掌握Docker:Linux用户指南Apr 18, 2025 am 12:08 AM

在Linux上使用Docker可以提高开发效率和简化应用部署。1)拉取Ubuntu镜像:dockerpullubuntu。2)运行Ubuntu容器:dockerrun-itubuntu/bin/bash。3)创建包含nginx的Dockerfile:FROMubuntu;RUNapt-getupdate&&apt-getinstall-ynginx;EXPOSE80。4)构建镜像:dockerbuild-tmy-nginx.。5)运行容器:dockerrun-d-p8080:80

Linux上的Docker:应用和用例Linux上的Docker:应用和用例Apr 17, 2025 am 12:10 AM

Docker在Linux上可以简化应用部署和管理。1)Docker是容器化平台,将应用及其依赖打包进轻量、可移植容器。2)在Linux上,Docker利用cgroups和namespaces实现容器隔离和资源管理。3)基本用法包括拉取镜像和运行容器,高级用法如DockerCompose可定义多容器应用。4)调试常用dockerlogs和dockerexec命令。5)性能优化可通过多阶段构建减小镜像大小,保持Dockerfile简洁是最佳实践。

Docker:用于可移植性和可扩展性的容器化应用程序Docker:用于可移植性和可扩展性的容器化应用程序Apr 16, 2025 am 12:09 AM

Docker是一种基于Linux容器技术的工具,用于打包、分发和运行应用,提升应用的可移植性和可扩展性。1)通过dockerbuild和dockerrun命令,可以构建和运行Docker容器。2)DockerCompose用于定义和运行多容器的Docker应用,简化微服务管理。3)使用多阶段构建可以优化镜像大小,提升应用启动速度。4)查看容器日志是调试容器问题的有效方法。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!