前情回顾
https://www.cnblogs.com/lioa/p/12666497.html 上篇文章的“容器里的进程看到的文件系统”章节把ns.c加上mount 函数后,同时调用CLONE_NEWNS启用namespace,我们宿主机启动的容器进入后看到的文件系统就是挂载的/tmp,这样做到了文件系统的隔离。
docker文件系统
而当我们进入一个docker容器内部时,几乎看到的是一个完整的linux根目录系统,又是如何做到的呢?
chroot
change root file system。来一个/bin/bash的移花接木。
## home目录创建abc目录 cd mkdir -p abc ## 在abc目录下创建lib,lib64,bin目录 mkdir -p abc/{bin,lib,lib64} ## 将bash命令拷贝abc对应目录 cp -v /bin/{bash,ls} abc/bin ## 把 bash 命令需要的所有 so 文件,也拷贝到 abc 目录对应的 lib 路径下。找到 so 文件可以用 ldd 命令 T=$HOME/abc list="$(ldd /bin/ls | egrep -o '/lib.*.[0-9]')" for i in $list; do cp -v "$i" "${T}${i}"; done ## 切换 $ chroot $HOME/abc /bin/bash ## 设置环境变量 export PATH=$PATH:/bin ## 查看根目录 ls /
rootfs
rootfs 根文件系统,即docker的镜像。docker 镜像是利用UnionFS + layer 的概念。
参考
https://time.geekbang.org/column/article/17921