docker是轻量级操作系统虚拟化的解决方案。
包括 镜像,容器,仓库,数据卷,链接 等。
仓库是存放镜像的地方,我们可以把自己的镜像pull下来,也可以push上去。
镜像 中有一个json,指定了从该镜像运行的容器的特征。 镜像实际上由一层一层的文件系统组成。
容器是 在镜像的基础上加了一层可写层。
数据卷是分离应用和数据的工具,我们可以把容器中的目录与宿主机的目录进行一一映射。 这样在容器关闭后 依然保有数据。
链接是 在容器启动时候被分配的一个随机的私有ip,它提供了容器之间相互通讯的渠道。
docker 是通过 namespace,cgroups,unionFS,来实现上面的四个功能的。
namespace 是隔离了每个容器,使每个容器有自己的命名空间。 命名空间实现了进程和进程之间使用资源的隔离。而且每个进程都可以当一台独立的主机,在自己的内部开启 不 同的进程。
cgroups 对共享资源(CPU io) 进行隔离 限制 审计。
unionfs 是一种分层的 轻量级的 高性能的文件系统。 docker通过aufs实现了它。
镜像的启动 首先会加载 bootfs 通过bootfsloader来加载 内核,当内核加载成功后, bootfs会被卸载掉。
之后会加载rootfs(根目录系统) 第一层 rootfs是 操作系统。这一层是只读的
之后会加载别的rootfs 直到加载完毕。
这些rootfs都是只读的,而且他们因为是增量的增加目录,所以节省了容量。
在只读层读完之后,会在最外层加一个可读可写层,随后该镜像变为一个容器,我们可以在容器中启动我们的应用。
最外层如果对底层rootfs进行修改了, 实际上是把底层rootfs中文件copy到了 rw层,进行的修改。随后底层的 文件将会被隐藏(copy on write).......
大致了解的就是这样。。。。等学的更深入了 再做修改。
可能还有不对的地方。
资料:
http://www.cnblogs.com/wish123/p/5573098.html
http://dockone.io/article/783
http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper/