Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中。Data Volume 有以下特点:

  1. Data Volume 是目录或文件,而非没有格式化的磁盘(块设备)。

  2. 容器可以读写 volume 中的数据。

  3. volume 数据可以被永久的保存,即使使用它的容器已经销毁。

好,现在我们有数据层(镜像层和容器层)和 volume 都可以用来存放数据,具体使用的时候要怎样选择呢?考虑下面几个场景:

  1. Database 软件 vs Database 数据

  2. Web 应用 vs 应用产生的日志

  3. 数据分析软件 vs input/output 数据

  4. Apache Server vs 静态 HTML 文件

相信大家会做出这样的选择:

  1. 前者放在数据层中。因为这部分内容是无状态的,应该作为镜像的一部分。

  2. 后者放在 Data Volume 中。这是需要持久化的数据,并且应该与镜像分开存放。

还有个大家可能会关心的问题:如何设置 voluem 的容量?

因为 volume 实际上是 docker host 文件系统的一部分,所以 volume 的容量取决于文件系统当前未使用的空间,目前还没有方法设置 volume 的容量。

bind mount


bind mount 是将 host 上已存在的目录或文件 mount 到容器。

例如 docker host 上有目录 /data/nginx:

[root@localhost ~]# cd /data/nginx/
[root@localhost nginx]# pwd
/data/nginx
[root@localhost nginx]# ls
index.html

通过 -v 将其 mount 到 nginx容器:

#没有mount之前,可以看到目录/usr/share/nginx/html下面是有两个文件的
[root@localhost nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
77f85615efca        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        80/tcp              affectionate_meninsky
[root@localhost nginx]# docker exec -it 77f85615efca /bin/bash
root@77f85615efca:/# ls /usr/share/nginx/html/
50x.html  index.html#挂载之后
[root@localhost nginx]# docker run -itd --name=nginx -p 80:80 -v /data/nginx:/usr/share/nginx/html nginx
3c9be3ad8788544f5533f4e1519592f4b37d4a19f4ea584e0b2d96d76d7f510d
[root@localhost nginx]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
3c9be3ad8788        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:80->80/tcp   nginx[root@localhost nginx]# docker exec -it nginx ls /usr/share/nginx/html
index.html
[root@localhost nginx]# cat index.html
hello nginx
[root@localhost nginx]# docker exec -it nginx cat  /usr/share/nginx/html/index.html
hello nginx

-v 的格式为 <host path>:<container path>。/usr/share/nginx/html/就是nginx存放静态文件的地方。由于/usr/share/nginx/html/已经存在,原有数据会被隐藏起来,取而代之的是/data/nginx中的数据,这与 linux mount 命令的行为是一致的。

更新一下,看是否能生效:

[root@localhost nginx]# echo "changed" > index.html
[root@localhost nginx]# curl 192.168.179.99
changed

host 中的修改确实生效了,bind mount 可以让 host 与容器共享数据。这在管理上是非常方便的。

下面我们将容器销毁,看看对 bind mount 有什么影响:

[root@localhost nginx]# docker ps -aq | xargs docker rm -f
3c9be3ad8788
77f85615efca
[root@localhost nginx]# pwd
/data/nginx
[root@localhost nginx]# cat index.html
changed

可见,即使容器没有了,bind mount 也还在。这也合理,bind mount 是 host 文件系统中的数据,只是借给容器用用,哪能随便就删了啊。

另外,bind mount 时还可以指定数据的读写权限,默认是可读可写,可指定为只读:

[root@localhost nginx]# docker run -itd --name=nginx -p 80:80 -v /data/nginx:/usr/share/nginx/html:ro nginx
e114207e7b6549f1a34a0370a3b10ba3b315ecec34a961752bf8d918182c8108[root@localhost nginx]# docker exec -it nginx /bin/bash
root@e114207e7b65:/# cd /usr/share/nginx/html/
root@e114207e7b65:/usr/share/nginx/html# ls
index.html
root@e114207e7b65:/usr/share/nginx/html# echo "test" > index.html
bash: index.html: Read-only file system

ro 设置了只读权限,在容器中是无法对 bind mount 数据进行修改的。只有 host 有权修改数据,提高了安全性。

除了 bind mount 目录,还可以单独指定一个文件:

[root@localhost nginx]# docker run -itd --name=nginx1 -p 88:80 -v /data/nginx/index.html:/usr/share/nginx/html/index.html nginx
e9cdb5621cda810e29afeed85e57cc577ee23d4377aa1cea0d616af847424882
[root@localhost nginx]# docker exec -it nginx1 ls /usr/share/nginx/html
50x.html  index.html
[root@localhost nginx]# curl 192.168.179.99:88
changed

使用 bind mount 单个文件的场景是:只需要向容器添加文件,不希望覆盖整个目录。在上面的例子中,我们将 html 文件加到 nginx 中,同时也保留了容器原有的数据。

使用单一文件有一点要注意:host 中的源文件必须要存在,不然会当作一个新目录 bind mount 给容器。

mount point 有很多应用场景,比如我们可以将源代码目录 mount 到容器中,在 host 中修改代码就能看到应用的实时效果。再比如将 mysql 容器的数据放在 bind mount 里,这样 host 可以方便地备份和迁移数据。

[root@localhost webapps]# docker run -itd -v /data/tomcat/webapps:/usr/local/tomcat/webapps -p 8080:8080 tomcat
4b27f8242c648f288aa1471def2dfc30e3835265dad3f1831106b60dc7452336
[root@localhost webapps]# cp /root/ROOT.war .[root@localhost webapps]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                    NAMES
4b27f8242c64        tomcat              "catalina.sh run"   About a minute ago   Up About a minute   0.0.0.0:8080->8080/tcp   recursing_khayyam[root@localhost webapps]# docker logs -f 4b27f8242c64
03-Nov-2020 12:14:12.713 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/ROOT.war]
03-Nov-2020 12:14:32.742 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
03-Nov-2020 12:14:33.578 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/ROOT.war] has finished in [20,866] ms

bind mount 的使用直观高效,易于理解,但它也有不足的地方:bind mount 需要指定 host 文件系统的特定路径,这就限制了容器的可移植性,当需要将容器迁移到其他 host,而该 host 没有要 mount 的数据或者数据不在相同的路径时,操作会失败。

移植性更好的方式是 docker managed volume,下篇博客我们讨论。

Docker Data Volume 之 bind mount相关推荐

  1. 第 6 章 存储 - 039 - Data Volume 之 bind mount

    Data Volume Data Volume 本质上是 Docker Host 文件系统中的目录或文件,能够直接被 mount 到容器的文件系统中. Data Volume 有以下特点: 1.Dat ...

  2. Docker数据持久之volume和bind mount

    默认容器的数据是保存在容器的可读写层,当容器被删除时其上的数据将会丢失,所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据,当前有以下几种方式: Volumes Bind mounts tm ...

  3. Docker managed volume

    docker managed volume 与 bind mount在使用上的最大区别是不需要指定 mount 源,指明 mount point 就行了.以busybox容器为例: [root@loc ...

  4. Docker Networking Data Volume

    Overlay Network 叠加网络 Docker Network Docker 安装完成后有三种网络 bridge host none ~]#docker network ls NETWORK ...

  5. Docker - 挂载目录(bind mounts)和Volume是不同的

    2019/10/25更新: docker commit是不能对容器中volume声明的目录改动进行保存的,无论是Dockerfile中的VOLUME字段,还是docker-compose.yaml中的 ...

  6. docker mysql data volume_Docker 持久化存储, Data Volume/Bind Mounting

    docker容器, 再启动之后 我们可以对其进行 修改删除等等. 如果是一个数据库的容器, 里面的数据 不想随着这个容器的消失, 而消失.  就需要持久化数据存储. Data Volume 这是 do ...

  7. 从零开始学习docker(九)持久化存储和数据共享之 Data Volume

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 有些时候容器会产生一些数据,而我们不希望这些数据随着容器的删除而删除.想保证数据的安全,一般用在数据库. 首先看 ...

  8. 18-数据持久化-Data Volume

    18-数据持久化-Data Volume Data Volume 使用场景.一般来讲有些容器自己会产生一些数据,我们不想数据随着容器的销毁而销毁,我们想保存数据,正常一般用在数据库,比如我们想保存数据 ...

  9. Docker数据管理之三种方式- 数据卷(Volumes)- 挂载主机目录(Bind mounts)- 数据卷容器(Data Volume Containers)

    文章主人公:帅哥BUG

最新文章

  1. 事件源event.target
  2. RESTful_URI资源
  3. CPU-bound(计算密集型) 和I/O bound(I/O密集型)
  4. 用jQuery写的最简单的表单验证
  5. Java集合--TreeMap
  6. 修改linux文件夹密码忘记,Linux中如何重新获取丢失的密码
  7. 2020 年,Serverless 将给大前端带来什么样的变化?
  8. [老老实实学WCF] 第一篇 Hello WCF
  9. Missing artifact com.oracle:ojdbc6:jar:11.2.0.3 Maven中不能引入ojdbc解决方法,错误
  10. 证书格式简介及不同格式之间的转换方式
  11. 【数据处理】reshape2包
  12. 计算机国际标准编码,【计算机基础】常用编码格式
  13. 远程桌面管理工具源码
  14. 【趣题】几堆石子轮流捡,谁捡到最后的石子算输的游戏
  15. CSS( Cascading Style Sheets )简书
  16. [javascript] js删除数组中的元素
  17. Python 碎碎念 -- 不定期记录遇到的各种小问题(藤原豆腐坊自家用)
  18. matlab画直线段,如果要在MATLAB中绘制上题中的直线段,要求 ,则对应的MATLAB语句为____________...
  19. php程序检测不到vc9,XAMPP2016中文精简版启动失败 缺少运行库解决办法
  20. LaTeX公式-Katex解析

热门文章

  1. 深度学习入门~激活函数③
  2. 钢结构工程专业承包资质标准
  3. 【杭电错题】#11数列有序!——思维转换
  4. 【英语四六级】口语考试一定要参加吗?
  5. mysql 统计每人每年1-12月个个月的分数和总分、平均分
  6. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——一些有用的Sizzle API
  7. 梯形图中常闭常开触点的选择
  8. 【matcovnet学习笔记】objective,top1error,top5error详解
  9. python 测试用例管理工具_好用又免费的测试用例管理工具有哪些?
  10. LADP 启用SSL开启636端口,实现第三方集成