最近学习了docker,做一些笔记来巩固知识,也供他人参考


文章目录

  • 一 通过docker run命令
  • 二 通过dockerfile创建挂载点
  • 三 容器共享卷(挂载点)
  • 四 最佳实践:数据容器
  • 五 总结

在介绍VOLUME指令之前,我们来看下如下场景需求:
1.容器是基于镜像创建的,最后的容器文件系统包括镜像的只读层+可写层,容器中的进程操作的数据持久化都是保存在容器的可写层上。一旦容器删除后,这些数据就没了,除非我们人工备份下来(或者基于容器创建新的镜像)。能否可以让容器进程持久化的数据保存在主机上呢?这样即使容器删除了,数据还在。
2. 当我们在开发一个web应用时,开发环境是在主机本地,但运行测试环境是放在docker容器上。
这样的话,我在主机上修改文件(如html,js等)后,需要再同步到容器中。这显然比较麻烦。
3. 多个容器运行一组相关联的服务,如果他们要共享一些数据怎么办?
对于这些问题,我们当然能想到各种解决方案。而docker本身提供了一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容,这类似linux系统下mount的机制。 这样的话,我们修改主机上该目录的内容时,不需要同步容器,对容器来说是立即生效的。 挂载点可以让多个容器共享。

下面我们来介绍具体的实现机制。

一 通过docker run命令

1.运行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash
其中的 -v 标记 在容器中设置了一个挂载点 /data(就是容器中的一个目录),并将主机上的 /home/xqh/myimage 目录中的内容关联到 /data下。
这样在容器中对/data目录下的操作,还是在主机上对/home/xqh/myimage的操作,都是完全实时同步的,因为这两个目录实际都是指向主机目录。
2.运行命令:docker run --name test1 -it -v /data ubuntu /bin/bash
上面-v的标记只设置了容器的挂载点,并没有指定关联的主机目录。这时docker会自动绑定主机上的一个目录。通过docker inspect 命令可以查看到。

xqh@ubuntu:~/myimage$ docker inspect test1
[
{"Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
............................."Mounts": [{"Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01","Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data","Destination": "/data","Driver": "local","Mode": "","RW": true}],

上面 Mounts下的每条信息记录了容器上一个挂载点的信息,“Destination” 值是容器的挂载点,"Source"值是对应的主机目录。可以看出这种方式对应的主机目录是自动创建的,其目的不是让在主机上修改,而是让多个容器共享。

二 通过dockerfile创建挂载点

上面介绍的通过docker run命令的-v标识创建的挂载点只能对创建的容器有效。通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点。还有一个区别是,通过 VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。

#test
FROM ubuntu
MAINTAINER hello1
VOLUME ["/data1","/data2"]

上面的dockfile文件通过VOLUME指令指定了两个挂载点 /data1 和 /data2.
我们通过docker inspect 查看通过该dockerfile创建的镜像生成的容器,可以看到如下信息

"Mounts": [{"Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21","Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data","Destination": "/data1","Driver": "local","Mode": "","RW": true},{"Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36","Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data","Destination": "/data2","Driver": "local","Mode": "","RW": true}
],

可以看到两个挂载点的信息。

三 容器共享卷(挂载点)

下面我们创建另一个容器可以和test1(已经创建好的容器)共享 /data1 和 /data2卷,这是在 docker run中使用 --volumes-from标记,如:
可以是来源不同镜像,如:
docker run --name test2 -it --volumes-from test1 ubuntu /bin/bash
也可以是同一镜像,如:
docker run --name test3 -it --volumes-from test1 myimage /bin/bash
上面的三个容器 test1 , test2 , test3 均有 /data1 和 /data2 两个目录,且目录中内容是共享的,任何一个容器修改了内容,别的容器都能获取到。

四 最佳实践:数据容器

如果多个容器需要共享数据(如持久化数据库、配置文件或者数据文件等),可以考虑创建一个特定的数据容器,该容器有1个或多个卷。
其它容器通过–volumes-from 来共享这个数据容器的卷。
因为容器的卷本质上对应主机上的目录,所以这个数据容器也不需要启动。
如: docker run --name dbdata myimage echo “data container”

说明:有个卷,容器之间的数据共享比较方便,但也有很多问题需要解决,如权限控制、数据的备份、卷的删除等。这些内容后续文章介绍。


五 总结

如有错误恳请指正,如有侵权请联系我删除
  参考文章:https://blog.csdn.net/weixin_33910137/article/details/86112024?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Docker 实现挂载的三种方式相关推荐

  1. 挂载的三种方式之自动挂载(autofs)

    Linux中文件挂载有三种方法: ①手动挂载 mount 设备名 挂载点目录 ②开机自动挂载 vim /etc/fstab ③ Autofs 自动挂载 前两种挂载方式不做细谈,今天主要谈谈autofs ...

  2. Docker镜像创建的三种方式详解——dockerfile制作apache镜像

    基于已有的镜像容器进行创建 [root@localhost opt]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAM ...

  3. Docker的常用管理命令Docker将数据挂载到容器的三种方式

    文章目录 镜像管理命令 容器管理常用命令 docker run常用参数 Docker run的其他参数 docker 创建容器命令 容器资源限制 docker管理容器常用命令 docker将数据挂载到 ...

  4. 【docker系列】docker进行数据挂载的三种模式

    Docker 提供了三种方式将数据从宿主机挂载到 Docker容器中: volumes.bind mounts.tmpfs . Volumes是在宿主机文件系统的一个路径,默认情况下统一的父路径是 / ...

  5. 容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

    容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这 ...

  6. docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器

    1.容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信 自定义网络 根据业务需要可通过 bridge 驱动创建类似前面默认的 bridge 网络 1.自定义网 ...

  7. React创建组件的三种方式及其区别

    React推出后,出于不同的原因先后出现三种定义react组件的方式,殊途同归:具体的三种方式: 函数式定义的无状态组件 es5原生方式React.createClass定义的组件 es6形式的ext ...

  8. php连接mysql_PHP连接MySQL数据库的三种方式

    本篇文章给大家介绍一下PHP连接MySQL数据库的三种方式(mysql.mysqli.pdo),结合实例形式分析了PHP基于mysql.mysqli.pdo三种方式连接MySQL数据库的相关操作技巧与 ...

  9. linux远程登录三种方式telnet,ssh,vnc

    linux远程连接三种方式telnet,ssh,vnc telnet和ssh服务只能实现基于字符界面的远程控制,如果要基于图形界面进行远程控制,可以借助免费的VNC来完成. 一.telnet连接 1. ...

最新文章

  1. poj3692(二分图最大独立集)
  2. 字符设备驱动初体验(hello驱动)
  3. 怀孕参加计算机考试有辐射吗,电脑辐射对孕妇的影响大不大 会对胎儿造成什么影响...
  4. 前端学习(1377):express路由参数
  5. ASP.Net请求处理机制初步探索之旅 - Part 1 前奏
  6. dedecms采集功能扩展
  7. oracle 配置 ACL 使用数据库发送WebServic请求时需要
  8. FreeRTOS之源码 及 移植详解
  9. 一份比较详尽的ubuntu下替代windows下的软件列表
  10. lena-ts 图像处理和卷积操作
  11. Linux默认的系统管理账号是(),Linux系统管理用户账号详解
  12. 建立数据地图,盘活数据资产!
  13. 解决虚拟机中桥接模式下ip地址的设置
  14. Python学习笔记---sep用法
  15. android通知小图标灰色,android – 大型通知图标旁边的灰色圆圈?
  16. Pytorch学习记录(七):自定义模型 Auto-Encoders 使用numpy实现BP神经网络
  17. gitlab流水线自动部署流程
  18. 运筹学—运输问题与表上作业法
  19. 手工注入,后台另类拿webshell搞定影院系统
  20. 手机回收价格大起底,换换回收分析为什么“破烂”也值钱?

热门文章

  1. ElasticSearch之查询性能分析
  2. 创龙DSP6748开发板音频代码无法运行的问题
  3. python程序设计作业_CS602留学生作业代做、代写Programming课程作业、代做Python语言作业、Python编程设计作业调试...
  4. 威流网站监控系统新增飞信提醒
  5. C#【必备技能篇】Windows计时器分辨率:重大规则更改
  6. 关于Html5发展和应用前景
  7. Microsoft SQL Server 2019 Developer 简体中文正式版(附安装教程) 64位
  8. 巧妙证明点到直线距离公式
  9. mac 撤销快捷键_苹果macbook pro 文本编辑撤销键
  10. JVM - 对象的创建