如何手动实现docker的文件系统切换功能,以下为穿刺案例。
以busybox为例:
从镜像仓库拉取busbox镜像
docker pull busybox
以此镜像运行一个容器,命令是top -b
docker run -d busybox top -b
使用export把容器导出tar包,83066ac5d6d0为容器id
docker export -o busybox.tar 83066ac5d6d0
创建 文件夹
mkdir busybox
手动解压到文件夹下即可
tar -xvf busybox.tar -C busybox/
以busybox为目录使用pivot-root改变当前文件系统
为了使得busybox的老root和新root不在同一个文件系统,需要mount一次,bind参数可以把内容带过去
mount busybox buxybox --bind
创建一个隐藏文件old-root存放旧跟目录
mkdir busybox/.old-root
使用pivot到新的rootfs,老的存储在.old-root中,而且里面可以看到内容,此时千万不能删除,会删除宿主机目录,(如果操作提示pivot_root: 将根目录从“busybox”更改为“busybox/old-root”失败: 无效的参数,可以先执行unshre -m)
pivot-root busybox busybox/.old-root
cd / 切换到新文件系统到根目录
对老文件系统根目录解绑定,使用-l 类似于MNT_DETACH,可以解决umount: can’t unmount /old-root: Device or resource busy问题
umount /.old-root -l
上一步unmount之后,.old-root目录即为空,此时可以删除了(切记,如果不为空,说明没umount成功,不可删)。这样一个崭新的文件系统出现了
rm -rf .old-root
把宿主机的procmount进来,可以使用top和ps -ef命令了,但是看到的是宿主机的内容。
mount -t proc /proc proc