一、 使用busybox创建容器
1. 让容器跑 在有镜像的环境中
运行的容器其实就是一个进程,当使用namespcae隔离了网络、用户、PID等各种资源以后,站在主机的角度,容器的运行目录还是当前程序的运行目录,运行mount命令会发现可以看到继承自父进程的所有挂载点,下面通过联合挂载实现让容器跑在自己的目录中。
- pivot_root 是一个系统调用,主要功能是改变当前的root文件系统, 他可以把整个系统切换到一个新的root目录下,而移除对之前root文件系统的依赖
二、 使用AUFS包装busybox
- 首先创建busybox文件夹,作为容器只读层
- 创建writelayer文件夹 ,作为容器读写层
- 创建mnt文件夹, 作为挂载点 ,并把busybox目录、writelayer目录mount到mnt目录下。
- 删除容器时,首先umount mnt目录,
- 删除mnt目录
- 删除writelayer目录
三、挂载volume原理
- 首先创建busybox文件夹,作为容器只读层
- 创建writelayer文件夹 ,作为容器读写层
- 创建mnt文件夹, 作为挂载点 ,并把busybox目录、writelayer目录mount到mnt目录下。
判断volume参数是否为空,如该为空,结束创建过程,如该不为空,解析volume字段,解析正确后,挂载数据卷。
挂载数据卷的过程 :
1、首先读取宿主机文件目录url,创建宿主机目录
2、读取容器挂载目录,在容器文件系统中创建挂载点,/root/mnt/rul
3、把宿主机目录挂载到容器挂载点。
删除容器过程:
1、当volume字段不为空时,首先卸载掉volume挂载点的文件系统:/root/mnt/url
2、卸载掉整个容器的文件系统挂载点 /root/mnt
3、删除容器文件系统挂载点
4、删除writelayer目录
四、镜像打包
commit命令,实现运行态的容器打包成镜像