自己动手写 Docker 系列 -- 4.2 使用 AUFS 包装 busybox
简介
在上篇中实现了使用宿主机 busybox 目录作为文件的根目录,但在容器内的对文件的操作仍会影响到宿主机的目录,本篇中实现进一步的容器和镜像隔离
源码说明
同时放到了 Gitee 和 Github 上,都可进行获取
本章节对应的版本标签是:4.2,防止后面代码过多,不好查看,可切换到标签版本进行查看
代码编写
本章中直接借鉴书中的代码即可,基本可以运行
首先修改 Run 命令启动入口,在其中传入相关的路径参数和在容器退出时候清理相关文件
Docker 会在删除容器的时候,把容器对应的 Write Layer 和 Container-init Layer 删除,而保留镜像所有的内容。本节中,在容器退出的时候会删除 Write Layer。DeleteWorkSpace 函数包括 DeleteMountPoint 和 DeleteWriteLayer。首先,在 DeleteMountPoint 函数中 umount mnt 目录。然后,删除 mnt 目录。最后,在 DeleteWriteLayer 函数中删除 writeLayer 文件夹。这样容器对文件系统的更改就都已经抹去了。
下面是创建只读层和可写层的代码:
修改 NewParentProcess
NewWorkSpace 函数是用来创建容器文件系统的,它包括 CreateReadOnlyLayer、CreateWriteLayer 和 CreateMountPoint。CreateReadOnlyLayer 函数新建 busybox 文件夹,将 busybox.tar 解压到 busybox 目录下,作为容器的只读层。CreateWriteLayer 函数创建了一个名为 writeLayer 的文件夹,作为容器唯一的可写层。在 CreateMountPoint 函数中,首先创建了 mnt 文件夹,作为挂载点,然后把 writeLayer 目录和 busybox 目录 mount 到 mnt 目录下。最后,在 NewParentProcess 函数中将容器使用的宿主机目录/root/busybox 替换成/root/mnt。
运行测试
我们运行容器后,在里面创建一个文件:
然后我们在宿主机上查看相关文件夹中的内容:
我们可以看到在 busybox 中并没有对应的修改,只修改了我们的只读层
然后我们使用 exit 退出容器,在退出容器后,宿主机上面的只读层会对应的删除
版权声明: 本文为 InfoQ 作者【萧】的原创文章。
原文链接:【http://xie.infoq.cn/article/ec2b11b98de6fcac7d91dae6c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论