美文网首页虚拟化&容器技术
Docker - 挂载目录(bind mounts)和Volum

Docker - 挂载目录(bind mounts)和Volum

作者: cheerfun | 来源:发表于2019-05-30 13:41 被阅读24次

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

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

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

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

此图来自docker文档

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

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

例如:在Linux系统中,我们经常使用"/var/someDir"作为挂载目录,然而到了Mac上,"/var/"这个目录并不是真实存在的,它是一个目录的软链接,而且这个目录也不是"Docker for Mac"默认共享的目录,需要添加,在Windows系统中更是如此。

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:

docker run -d -v "test_vol:/var/data" some_image,这样就将容器内的/var/data目录挂载到了"test_vol"的挂载点;

docker-compose中类似,不过要在docker-compose.yaml文件中声明volume,我们还是拿上面的例子修改一下:

Attention !! ⚠️​​​​​​​

需要注意 volume 会引起 docker目录膨胀,因为既要存镜像,又要存 volume,最好不要放在系统盘,将 docker 的安装目录配置到其他更大的挂载盘。

volume 还有一个不如bind mount的地方,不能直接挂载文件,例如挂载nginx容器的配置文件:nginx.conf。

相关文章

  • Docker - 挂载目录(bind mounts)和Volum

    一直一来,对于多个容器需要共享访问同一数据目录,或者需要持久化容器内数据(如数据库)时,我们都是采用挂载目录形式(...

  • 挂载绑定

    https://docs.docker.com/storage/bind-mounts/ 从图可以看出,绑定挂载,...

  • docker 存储之volume

    docker 存储之volume 1. bind mount 挂载任意目录或文件 创建挂载点并且挂载docker目...

  • Docker数据管理

    在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录(Bind mounts) 数据卷 数据卷...

  • Linux mount

    理解Mount 挂载 (mount) 深入理解 bind mount 将目录挂载到目录 mount --bind ...

  • Docker数据存储之tmpfs mounts

    阅读本文前,希望你已经对Volumes和Bind mounts有了初步的了解,具体可以参考以下文章:Docker数...

  • docker 文件持久化方式

    docker 文件持久化方式 docker 的数据挂载分为三种,volume, bind mount 和 tmpf...

  • linux /proc/mounts 文件解析

    linux /proc/mounts 文件解析 我们可以通过mounts文件查看挂载文件系统的状态。mounts文...

  • linux本地文件夹挂载

    挂载 sudo mount --bind [源文件夹] [目的文件夹] 绑定挂载后 bind/bind2 目录下的...

  • Docker数据存储总结

    阅读本文前,希望你已经对Volumes,Bind mounts和tmpfs mounts有了初步的了解,具体可以参...

网友评论

    本文标题:Docker - 挂载目录(bind mounts)和Volum

    本文链接:https://www.haomeiwen.com/subject/gmnmtctx.html