前情回顾

  https://www.cnblogs.com/lioa/p/12666497.html 上篇文章的“容器里的进程看到的文件系统”章节把ns.c加上mount 函数后,同时调用CLONE_NEWNS启用namespace,我们宿主机启动的容器进入后看到的文件系统就是挂载的/tmp,这样做到了文件系统的隔离。

docker文件系统

  而当我们进入一个docker容器内部时,几乎看到的是一个完整的linux根目录系统,又是如何做到的呢?

  Docker原理之rootfs-冯金伟博客园

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 /

Docker原理之rootfs-冯金伟博客园

rootfs

  rootfs 根文件系统,即docker的镜像。docker 镜像是利用UnionFS + layer 的概念。

参考

  https://time.geekbang.org/column/article/17921

目录

  https://www.cnblogs.com/lioa/p/12664686.html