前情回顧
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