问题:
容器角度看挂载:
1、容器里进程 touch new.txt ,宿主机怎样才能获取到new.txt? 本博客已解决
2、宿主机上的 目录&&文件,容器里面的进程 怎样能访问到? 本博客已解决
3、宿主机上的 目录&&文件,挂载到容器里的目录,原理是什么?本博客已解决
4、宿主机的home目录挂载到 容器的test目录,test目录里的内容,docker commit的时候会不会提交上去? 本博客已解决
解答:其实是不会的
容器的镜像操作,都是发生在宿主机空间的
由于Mount NameSpace的隔离,宿主机不能看到绑定挂载的存在,在宿主机角度来看,rootfs关于容器test目录的层文件(/var/lib/docker/aufs/mnt/[可读写层 ID]/test),始终是空的
5、执行docker run -v /home:/test 的时候,容器镜像里面的/test目录下本来就有内容,会发现一个问题,在宿主机的/home目录下面,也会出现test目录下的内容,这是为什莫?为什么这些文件没有被绑定挂载隐藏起来?
6、给容器中的python应用加上cpu和memory的限制,然后启动应用。查看下Cgroups文件系统的设置
7、在容器的内部想看到 宿主机的IP地址怎样能做到?
答案:由于namespace隔离的存在,是拿不到宿主机的IP的
从K8S的环境变量里面能够得到
linux角度看挂载:
8、linux的绑定挂载机制和 Volume机制有什么关系?
### 知识点1:Volume机制: |
允许将宿主机的指定的目录 / 文件 ,挂载到容器里面 ,进行读取和修改的操作
###知识点2: 运行方式:把一个宿主机的目录 挂载到容器的/test目录 |
(第一种)docker run -v /test …
(第二种)docker run -v /home:/test …
区别:
第一种:没有声明 宿主机的目录
Docker 就会默认的在宿主机上创建一个临时的目录 /var/lib/docker/volumes/[VOLUME_ID]/_data
然后把临时的这个目录 挂载在/test上面
第二种:Docker直接把宿主机的/home目录挂载到容器的/test目录上面
### 知识点3:Volume机制的原理: |
容器进程被创建以后,尽管已经开启了 Mount NameSpace
但是在执行chroot / pivot_root 监狱之前,容器进程一直是可以看到宿主机上面的文件系统的
宿主机上面的文件系统中,也包括了容器的镜像
容器镜像的层都在宿主机的/var/lib/docker/aufs/diff目录下面
容器启动之后,这写文件都会被联合挂载到 /var/lib/docker/aufs/mnt中
这样容器的rootfs建立好了
Volume机制是在执行chroot之前,把Volume指定的 “宿主机目录home” 挂载到 “指定的容器目录test”,Volume的挂载就完成了
同理大家可以看到,volume是在docker run的时候进行的
Note:
执行Volume挂载操作的时候,“容器进程” 其实已经建立好了 ,这个时候 mount namespace已经开启了 ,这个挂载操作只能在容器内部看到,在宿主机上是看不到内部的挂载点的
保证了容器的隔离性不会被Volume打破
总结:类比下面的 linux绑定挂载机制
宿主机通过Volume机制 绑定目录 到容器特定目录test,
容器中的进程 对test目录进行的所有的操作,实际都是在操作宿主机的对应目录而不会影响到容器的test目录
绑定挂载:是inode替换的过程
inode:存放文件内容的
dentry:目录项 ,访问inode的指针
mount --bind /home /test
将 /home目录挂载到test目录上面 :将/test目录的dentry重定向到了/home的inode上面
当修改/test目录的时候,实际是修改的/home的inode
一旦执行了umount
test原来目录中的内容会恢复
修改真正发生的其实是在home里面
全角度看docker镜像:
(1)容器进程 python app.py 运行在 隔离环境(namespace +Cgroups)里面
(2)容器进程需要的各种文件 python app.py os文件存在于rootfs的只读层
(3)rootfs中所有的文件都是被 联合挂载的
注释:此博客为学习博客,如有侵权,请联系博主