Docker和宿主机操作系统文件目录互相隔离的实现原理
我们知道在Docker容器里是无法访问到宿主操作系统的文件目录的,但这种隔离是怎么实现的呢?
其实一点也不神奇——利用了Linux系统的内部命令chroot。
chroot能将进程的根目录设置成任意指定的目录。
使用chroot我们能创建一个新的进程,并且以chroot执行时传入的参数作为新进程的根目录。
因为新进程创建之后就无法访问除了新进程创建时传入chroot参数之外的其他文件目录,为了确保这个新进程能够正常工作,我们必须手动拷贝一些文件到新进程的根目录映射的旧目录下。
做一个如下测试:
新建一个文件夹,执行chroot . 意思是把文件夹$HOME/container当作新建进程的根目录。但是没有成功,报错误消息chroot: failed to run command ‘/bin/bash’: No such file or directory
执行下面两条命令:

执行命令ldd $HOME/container/bin/bash:
该命令为了查看需要有哪些库文件得手动拷贝到文件夹$/HOME/container/bin/bash下面:
根据ldd的输出,再次执行下图的八条命令:

再次执行chroot . , 发现这次成功了:
pwd发现是在根目录下,ls也只能发现执行chroot时指定的container目录下的子目录:
这就是docker文件目录隔离的实现原理。
要获取更多Jerry的原创文章,请关注公众号"汪子熙":

Docker和宿主机操作系统文件目录互相隔离的实现原理的更多相关文章
- Docker挂载宿主机目录
一.普通方式直接挂载 1.查看已有容器 docker ps 2.进入容器并挂载 docker run -it -v /root/work/docker:/root/hzbtest tomcat:7.0 ...
- Docker 与 宿主机之间的文件cp
Docker 与 宿主机之间的文件cp 第一种方法是官方比较推荐的,其实和第二种方法实现是一样的. 第一种方法例: 将主机/www/runoob目录拷贝到容器96f7f14e99ab的/www目录下. ...
- 如何在docker和宿主机之间复制文件
如何在docker和宿主机之间复制文件 最近在用Docker布署hadoop,要将文件上传到HDFS首先文件得在Docker容器中吧,网上提供的方法差不多有三种 1.用-v挂载主机数据卷到容器内 ...
- docker 访问宿主机网络
使用宿主机IP 在安装Docker的时候,会在宿主机安装一个虚拟网关docker0,我们可以使用宿主机在docker0上的IP地址来代替localhost. 首先,使用如下命令查询宿主机IP地址: i ...
- Docker桥接宿主机网络与配置固定IP地址
有些需求是把这个容器与宿主机在同一个网段,但是本人不建议这样子去操作,因为一个容器本身就是一个封装好的服务.建议去按默认的网络去实现. 临时设置 [root@linux-docker01 ~]# vi ...
- docker环境 宿主机和容器之间复制文件
容器往宿主机:docker cp 3234234324234:/database_dump_bak/db_bak.dmp /home/test 宿主机往容器:docker cp wenjian_001 ...
- Docker拷贝宿主机与容器中的文件
如果我们需要将宿主机文件拷贝到容器内可以使用 docker cp 命令,也可以将文件从容器内拷贝到宿主机 将宿主机文件拷贝到容器内 docker cp 要拷贝的宿主机文件或目录 容器名称:容器文件或目 ...
- 使用docker与宿主机文件互相拷贝
1.从容器里面拷文件到宿主机 示例:容器名为s2-061_struts2_1,要从容器里面拷贝的文件路为:/usr/local/tomcat/webapps/test/js/test.js, 现在要将 ...
- docker基于宿主机系统版本创建镜像
这里讲如何定制自己centos镜像,仅供测试docker使用. A) 安装软件 yum -y install febootstrap B)下载镜像febootstrap -i bash -i wget ...
随机推荐
- java读取配置到Hash表里
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; im ...
- GIL 线程池 进程池 同步 异步 阻塞 非阻塞
1.GIL 是一个全局解释器锁,是一种互斥锁 为什么需要GIL锁:因为一个python.exe进程中只有一份解释器,如果这个进程开启了多个线程都要执行代码 多线程之间要竞争解释器,一旦竞争就有可能出现 ...
- hdu1166 敌兵布阵 线段树(区间更新)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- sqlserver 数据库阻塞和死锁
参考原文:http://blog.csdn.net/ha196200/article/details/44985597 (1) 数据库阻塞: 假设第一个连接T1占有且没有释放资源,第二个连接T2请求同 ...
- SElinux学习记录
1.SELinux:是一种基于域类型模型的强制访问控制安全系统,由NSA编写设计成内核模块包含到内核中,相应的某些安全相关的应用也被打了SE Linux补丁 查看Selinux: ps -Z #查看S ...
- java——sleep()和wait()
1.所属类不同sleep()属于Thread而wait()属于Object 2.sleep()没有释放当前锁,wait()则释放了当前锁 3.sleep(0)的目的是使当前线程释放cpu,其他线程可以 ...
- 虚拟机 ---- 最小化安装无法使用tab补全键
解决方法: 安装 yum -y install bash-completion 然后重启 注意:挂载时使用绝对路径的cdrom挂载, ls -l /dev/cdromvim /etc/fstab — ...
- oracle merge into函数中插入clob字段
当使用Merge into 函数向ORACLE数据库中插入或更新数据时,报错“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”,使用如下方法可以把String转换为clob. 需 ...
- PlayMaker Rotate旋转
每秒 绕 Y轴 旋转 180度 ,每帧都执行. 不勾选Every Frame的话就只会旋转一帧.
- Neutron命令测试4
jolin@jolin:~$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface ...