怎么将docker容器访问宿主机中断目录共享到宿主机

您所在的位置: &
在Docker容器之间拷贝数据:原理与操作示例
在Docker容器之间拷贝数据:原理与操作示例
在容器之间拷贝数据是Docker一个重要而且基本的功能。拷贝数据到其他容器的功能可以在真实场景中,如当服务器遇到不可预见的“灾难”(注:断电,宕机)时,起到备份数据的作用。
Docker容器可以类比成一个目录,它可以将一个应用程序运行时所依赖的所有环境(注:此应用依赖的其他的服务或程序等)打包在一起运行;同时可 以随意的对它进行&启动&、&停止&、&移动&或者&删除&等操作。Docker容器在Linux的命名空间(Namespace)机制下被激活,这样就 可以使得运行在同一服务器上的不同Docker容器能在网络(Networking)与存储(storage)层面上被&隔离&(isolation)的 运行。每个Docker容器都是在一个Docker镜像(image)的基础上创建而来;而一个Docker镜像可以支持创建、运行多个Docker容 器,这主要取决于服务器的硬件性能。所以,Docker容器是Docker运行时的表现形式。
什么是Docker镜像?
Docker 容器是基于一个Docker镜像创建的,而Docker镜像本身则可以通过Docker命令行工具或者Dockerfiles来生成。Docker镜像既可以包含操作系统基础设施(fundamentals)也可以包含一个预先搭建好的可以直接启动的应用程序栈。Docker镜像可以被看做是一个只读的模 板,这个模板中包含了很多&层&;而任何基于这个Docker镜像的新增操作或者更新操作都会导致一个基于当前层的新的层被创建出来,这个新创建的层是直接叠加在当前层之上的而非覆盖整个Docker镜像(注:创建新层的过程就是创建新容器的过程)。这就是一个新的Docker容器是怎么被创建出来的。
从一个容器拷贝数据到另一个容器:
在容器之间拷贝数据是Docker一个重要而且基本的功能。拷贝数据到其他容器的功能可以在真实场景中,如当服务器遇到不可预见的&灾难&(注:断电,宕机)时,起到备份数据的作用。
使用容器的数据卷:
数据卷(data
volume,注:位置在/var/lib/docker/volumes)是容器可以访问,但是位置不在root文件系统中的一个目录。为了能让容器之间可以共享数据,Docker让&卷&(volume)可以绕过Docker镜像的层叠机制。容器中所有对镜像的改变全部都直接存储。每个容器都有固定的运行目录在/var/lib/docker目录下;而每个容器卷的数据则默认单独存储在/var/lib/docker/volumes/目录底下。 docker run命令的-v选项能够实现容器间数据卷中数据的互相拷贝。
在这个例子中,我们假设基于镜像mymod/dvc:v1创建并运行了两个容器:dvc1与dvc2,以下是启动这两个镜像的命令:
docker&run&&d&&name&dvc1&mymod/dvc:v1&&docker&run&&d&&name&dvc2&mymod/dvc:v1
以下命令将创建并启动一个新的容器(也是基于mymod/dvc: v1镜像)但是挂载dvc1的数据卷,并使用cp命令拷贝容器dvc1中的数据到宿主机(host)上。
[root@host&~]#&docker&run&&rm&&v&/var/tmp:/host:rw&\&&volumes-&from&dvc1&cp&&r/var/www/html/host/dvc1_files&&[注:经过测试以上命令应该改为以下形式才能运行]&&[root@host&~]#&docker&run&&rm&&v&/var/tmp:/host:rw&&volumes-from&dvc1&mymod/dvc:&v1&cp&&r&/var/www/html/host/dvc1_files&
新建的容器以读-写权限挂载宿主机的/var/temp目录为/host目录,然后挂载所有dvc1的数据卷,包含dvc1中的/var/www/html 目录,然后拷贝/var/www/html的文件目录到/host/dvc1_files下,映宿主机/var/temp目录。
现在我们用以下命令拷贝dvc1容器的数据到其他的容器中:
[root@host&~]#&docker&run&&rm&&v&/var/tmp:/host:ro&&volumes-from&dvc2&\&cp&&a&&T&/host/dvc1_files&/var/www/html&
新建的容器将宿主机的/var/tmp目录以只读的形式映射到dvc2容器的/host目录中,同时加载dvc2容器的所有数据卷,然后将/host /dvc1_files(对应宿主机/var/tmp/dvc1_files)目录的结构拷贝到dvc2容器的/var/www/html目录下。
同样的目标可以在Dockerfile中使用ADD命令实现。ADD有两个参数一个是源容器一个是目的容器。ADD命令可以实现从源容器拷贝文件或者数据到目的容器的目标,而不用管各个容器的文件系统差异。
Docker 肯定会提供更好的方式来&培养&容器化服务部署,以支持更广泛的部署平台;同时开发社区也期望Docker构建服务层级(service
layer)。而Docker的做法是:开发容器核心容量,开发跨容器服务管理与通信功能。我们在这篇文章中所阐述的是数据可以在容器间被复制与冗余,这可以用来应付各种数据的损毁与恢复。Docker还提供了使用方便的容器间差异分析功能,这可以让容器更好的支持排错(debugging)、快速共享部 署环境以达到快速的部署的目标。Docker可以将容器部署环境从开发或者QA阶段直接提交到AWS部署环境。用户可以通过Docker的数据卷在容器间共享数据;可以将宿主机的目录直接挂载到容器中或者甚至可以从容器中导出数据存档,所以,Docker非常方便。
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&&&&&的更多文章
OpenStack是一个美国国家航空航天局和Rackspace合作研发的,以Ap
180天的Windows Server 2012试用版下载(标准版或数据中心版)
讲师: 298人学习过讲师: 439人学习过讲师: 646人学习过
日,以“变革的力量”为主题的2014东软解
Docker这种新的容器技术可谓热得发烫,如果你是数据中
日,亚马逊公司旗下的Amazon Web Service
本书提供了.NET框架下C#编程的详尽指南。书中详细介绍了.NET框架中的核心概念、使用GDI+编写高级用户界面、多线程程序设计、使
51CTO旗下网站非常详细的 Docker 学习笔记_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
非常详细的 Docker 学习笔记
上传于||文档简介
&&非​常​详​细​的​ ​D​o​c​k​e​r​ ​学​习​笔​记
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩48页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢关于Docker目录挂载的总结_服务器应用_Linux公社-Linux系统门户网站
你好,游客
关于Docker目录挂载的总结
来源:Linux社区&
作者:ivictor
Docker容器启动的时候,如果要挂载宿主机的一个目录,可以用-v参数指定。
譬如我要启动一个容器,宿主机的/test目录挂载到容器的/soft目录,可通过以下方式指定:
# docker run -it -v /test:/soft centos /bin/bash
这样在容器启动后,容器内会自动创建/soft的目录。通过这种方式,我们可以明确一点,即-v参数中,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录。
貌似简单,其实不然,下面我们来验证一下:
一、容器目录不可以为相对路径
[root@localhost ~]# docker run -it -v /test:soft centos /bin/bashinvalid value "/test:soft" for flag -v: soft is not an absolute pathSee 'docker run --help'.
直接报错,提示soft不是一个绝对路径,所谓的绝对路径,必须以下斜线&/&开头。
二、宿主机目录如果不存在,则会自动生成
如果宿主机中存在/test目录,首先删除它
[root@localhost ~]# rm -rf /test[root@localhost ~]# ls /bin& boot& dev& etc& home& lib& lib64& media& mnt& opt& proc& root& run& sbin& srv& sys& tmp& usr& var
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash[root@a487a3ca7997 /]# lsbin& dev& etc& home& lib& lib64& lost+found& media& mnt& opt& proc& root& run& sbin& soft& srv& sys& tmp& usr& var
查看宿主机,发现新增了一个/test目录
[root@localhost ~]# ls /bin& boot& dev& etc& home& lib& lib64& media& mnt& opt& proc& root& run& sbin& srv& sys& test& tmp& usr& var
三、宿主机的目录如果为相对路径呢?
这次,我们换个目录名test1试试
# docker run -it -v test1:/soft centos /bin/bash
再到宿主机上查看是否新增了一个/test1目录,结果没有,是不是因为我用的是相对路径,所以生成的test1目录在当前目录下,结果发现还是没有。那容器内的/soft目录挂载到哪里去了?通过docker inspect命令,查看容器&Mounts&那一部分,我们可以得到这个问题的答案。
& & "Mounts": [& & & & {& & & & & & "Name": "test1",& & & & & & "Source": "/var/lib/docker/volumes/test1/_data",& & & & & & "Destination": "/soft",& & & & & & "Driver": "local",& & & & & & "Mode": "z",& & & & & & "RW": true& & & & }& & ],
可以看出,容器内的/soft目录挂载的是宿主机上的/var/lib/docker/volumes/test1/_data目录
原来,所谓的相对路径指的是/var/lib/docker/volumes/,与宿主机的当前目录无关。
四、如果只是-v指定一个目录,这个又是如何对应呢?
启动一个容器
[root@localhost ~]# docker run -it -v /test2 centos /bin/bash[root@ea2 /]# lsbin& dev& etc& home& lib& lib64& lost+found& media& mnt& opt& proc& root& run& sbin& srv& sys& test2& tmp& usr& var
同样使用docker inspect命令查看宿主机的挂载目录
"Mounts": [& & & & {& & & & & & "Name": "edb139dfe426e57fbacdfacdb411b3d73a",& & & & & & "Source": "/var/lib/docker/volumes/edb139dfe426e57fbacdfacdb411b3d73a/_data",& & & & & & "Destination": "/test2",& & & & & & "Driver": "local",& & & & & & "Mode": "",& & & & & & "RW": true& & & & }& & ],
可以看出,同3中的结果类似,只不过,它不是相对路径的目录名,而是随机生成的一个目录名。
五、如果在容器内修改了目录的属主和属组,那么对应的挂载点是否会修改呢?
首先开启一个容器,查看容器内/soft目录的属性
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash[root@b5ed8216401f /]# ll -d /soft/drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/
查看宿主机内/test目录的属性
[root@localhost ~]# ll -d /test/drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/
在容器内新建用户,修改/soft的属主和属组
[root@b5ed8216401f /]# useradd victor[root@b5ed8216401f /]# chown -R victor.victor /soft/[root@b5ed8216401f /]# ll -d /soft/drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/
再来看看宿主机内/test目录的属主和属组是否会发生变化?
[root@localhost ~]# ll -d /test/drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/
竟然变为mycat了。。。
原来,这个与UID有关系,UID,即&用户标识号&,是一个整数,系统内部用它来标识用户。一般情况下它与用户名是一一对应的。
首先查看容器内victor对应的UID是多少,
[root@b5ed8216401f /]# cat /etc/passwd | grep victorvictor:x:::/home/victor:/bin/bash
victor的UID为1000,那么宿主机内1000对应的用户是谁呢?
[root@localhost ~]# cat /etc/passwd |grep 1000mycat:x:::/home/mycat:/bin/bash
可以看出,宿主机内UID 1000对应的用户是mycat。
六、容器销毁了,在宿主机上新建的挂载目录是否会消失?
在这里,主要验证两种情况:一、指定了宿主机目录,即 -v /test:/soft。二、没有指定宿主机目录,即-v /soft
第一种情况:
[root@localhost ~]# rm -rf /test& & --首先删除宿主机的/test目录[root@localhost ~]# ls /& & --可以看到,宿主机上无/test目录bin& boot& dev& etc& home& lib& lib64& media& mnt& opt& proc& root& run& sbin& srv& sys& tmp& usr& var[root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash& --启动容器,为了删除方便,我用--name参数指定了容器的名字[root@82ad7f3a779a /]# exitexit[root@localhost ~]# docker rm centos_test&
--删除容器centos_test[root@localhost ~]# ls /&
--发现 /test目录依旧存在bin& boot& dev& etc& home& lib& lib64& media& mnt& opt& proc& root& run& sbin& srv& sys& test& tmp& usr& var
可以看出,即便容器销毁了,新建的挂载目录不会消失。进一步也可验证,如果宿主机目录的属主和属组发生了变化,容器销毁后,宿主机目录的属主和属组不会恢复到挂载之前的状态。
第二种情况,通过上面的验证知道,如果没有指定宿主机的目录,则容器会在/var/lib/docker/volumes/随机配置一个目录,那么我们看看这种情况下的容器销毁是否会导致相应目录的删除
首先启动容器
[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash[root@6b7 /]# exitexit
通过docker inspect命令查看容器在宿主机上生成的挂载目录
& & "Mounts": [& & & & {& & & & & & "Name": "b5f2fb22ad11994cf1fbbccd3e10ea301",& & & & & & "Source": "/var/lib/docker/volumes/b5f2fb22ad11994cf1fbbccd3e10ea301/_data",& & & & & & "Destination": "/soft",& & & & & & "Driver": "local",& & & & & & "Mode": "",& & & & & & "RW": true& & & & }& & ],
对应的是/var/lib/docker/volumes/b5f2fb22ad11994cf1fbbccd3e10ea301/_data目录
销毁容器,看目录是否存在
[root@localhost ~]# docker rm centos_testcentos_test[root@localhost ~]# ll /var/lib/docker/volumes/b5f2fb22ad11994cf1fbbccd3e10ea301total 0drwxr-xr-x 2 root root 6 Sep 24 14:25 _data
发现该目录依旧存在,即便重启了docker服务,该目录依旧存在
[root@localhost ~]# systemctl restart docker[root@localhost ~]# ll /var/lib/docker/volumes/b5f2fb22ad11994cf1fbbccd3e10ea301total 0drwxr-xr-x 2 root root 6 Sep 24 14:25 _data
七、挂载宿主机已存在目录后,在容器内对其进行操作,报&Permission denied&。
可通过两种方式解决:
1& 关闭selinux。
临时关闭:# setenforce 0
永久关闭:修改/etc/sysconfig/selinux文件,将SELINUX的值设置为disabled。
2& 以特权方式启动容器
指定--privileged参数
如:# docker run -it --privileged -v /test:/soft centos /bin/bash
更多Docker相关教程见以下内容:
Docker安装应用(CentOS 6.5_x64) &
14.04安装Docker& &
Ubuntu使用VNC运行基于Docker的桌面系统&
阿里云CentOS 6.5 模板上安装 Docker &
Ubuntu 15.04下安装Docker& &
在Ubuntu Trusty 14.04 (LTS) (64-bit)安装Docker &
在 Ubuntu 15.04 上如何安装Docker及基本用法
Docker 的详细介绍:Docker 的下载地址:
本文永久更新链接地址:
相关资讯 & & &
& (07月12日)
& (05月31日)
& (04月24日)
& (05月31日)
& (05月04日)
& (03月07日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 docker 宿主访问容器 的文章

 

随机推荐