目录
docker volume和挂载的区别是什么
首页 运维 Docker docker volume和挂载的区别是什么

docker volume和挂载的区别是什么

Mar 08, 2022 pm 04:53 PM
docker

“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

热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

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

docker怎么退出容器 docker怎么退出容器 Apr 15, 2025 pm 12:15 PM

退出 Docker 容器的四种方法:容器终端中使用 Ctrl D 快捷键容器终端中输入 exit 命令宿主机终端中使用 docker stop <container_name> 命令宿主机终端中使用 docker kill <container_name> 命令(强制退出)

docker容器名称怎么查 docker容器名称怎么查 Apr 15, 2025 pm 12:21 PM

可以通过以下步骤查询 Docker 容器名称:列出所有容器(docker ps)。筛选容器列表(使用 grep 命令)。获取容器名称(位于 "NAMES" 列中)。

docker内的文件怎么拷贝到外面 docker内的文件怎么拷贝到外面 Apr 15, 2025 pm 12:12 PM

Docker 中将文件拷贝到外部主机的方法:使用 docker cp 命令:执行 docker cp [选项] <容器路径> <主机路径>。使用数据卷:在主机上创建目录,在创建容器时使用 -v 参数挂载该目录到容器内,实现文件双向同步。

docker怎么重启 docker怎么重启 Apr 15, 2025 pm 12:06 PM

重启 Docker 容器的方法:获取容器 ID(docker ps);停止容器(docker stop <container_id>);启动容器(docker start <container_id>);验证重启成功(docker ps)。其他方法:Docker Compose(docker-compose restart)或 Docker API(参考 Docker 文档)。

docker怎么启动mysql docker怎么启动mysql Apr 15, 2025 pm 12:09 PM

在 Docker 中启动 MySQL 的过程包含以下步骤:拉取 MySQL 镜像创建并启动容器,设置根用户密码并映射端口验证连接创建数据库和用户授予对数据库的所有权限

docker怎么更新镜像 docker怎么更新镜像 Apr 15, 2025 pm 12:03 PM

更新 Docker 镜像的步骤如下:拉取最新镜像标记新镜像为特定标签删除旧镜像(可选)重新启动容器(如果需要)

怎么看docker进程 怎么看docker进程 Apr 15, 2025 am 11:48 AM

Docker 进程查看方法:1. Docker CLI 命令:docker ps;2. Systemd CLI 命令:systemctl status docker;3. Docker Compose CLI 命令:docker-compose ps;4. Process Explorer(Windows);5. /proc 目录(Linux)。

docker怎么创建容器 docker怎么创建容器 Apr 15, 2025 pm 12:18 PM

在 Docker 中创建容器: 1. 拉取镜像: docker pull [镜像名] 2. 创建容器: docker run [选项] [镜像名] [命令] 3. 启动容器: docker start [容器名]

See all articles