一、 使用busybox创建容器

1. 让容器跑 在有镜像的环境中
运行的容器其实就是一个进程,当使用namespcae隔离了网络、用户、PID等各种资源以后,站在主机的角度,容器的运行目录还是当前程序的运行目录,运行mount命令会发现可以看到继承自父进程的所有挂载点,下面通过联合挂载实现让容器跑在自己的目录中。

  1. pivot_root 是一个系统调用,主要功能是改变当前的root文件系统, 他可以把整个系统切换到一个新的root目录下,而移除对之前root文件系统的依赖

二、 使用AUFS包装busybox

  1. 首先创建busybox文件夹,作为容器只读层
  2. 创建writelayer文件夹 ,作为容器读写层
  3. 创建mnt文件夹, 作为挂载点 ,并把busybox目录、writelayer目录mount到mnt目录下。
  4. 删除容器时,首先umount mnt目录,
  5. 删除mnt目录
  6. 删除writelayer目录

docker原理 构造镜像

三、挂载volume原理

  1. 首先创建busybox文件夹,作为容器只读层
  2. 创建writelayer文件夹 ,作为容器读写层
  3. 创建mnt文件夹, 作为挂载点 ,并把busybox目录、writelayer目录mount到mnt目录下。
  4. 判断volume参数是否为空,如该为空,结束创建过程,如该不为空,解析volume字段,解析正确后,挂载数据卷。

    挂载数据卷的过程 :
    1、首先读取宿主机文件目录url,创建宿主机目录
    2、读取容器挂载目录,在容器文件系统中创建挂载点,/root/mnt/rul
    3、把宿主机目录挂载到容器挂载点。

删除容器过程:
1、当volume字段不为空时,首先卸载掉volume挂载点的文件系统:/root/mnt/url
2、卸载掉整个容器的文件系统挂载点 /root/mnt
3、删除容器文件系统挂载点
4、删除writelayer目录

docker原理 构造镜像

四、镜像打包

commit命令,实现运行态的容器打包成镜像

相关文章: