- 传统虚拟化与docker
传统虚拟化是在宿主机上使用VMM对底层硬件资源进行管理和封装、隔离抽象为一种逻辑独立的资源,分配给上层虚拟主机使用。
Docker是直接在宿主主机操作系统的层次上通过Cgroups对物理资源隔离和Namespace对系统资源隔离,直接实现APP或者应用的虚拟化,实现轻量级的虚拟化容器。传统虚拟化技术创建虚拟主机的代价很大,一般创建两位数的虚拟主机,而使用Docker可以创建上千个Containers。 - Docker与LXC
LXC是一种容器技术,它提供轻量级Linux容器,用户可以在LXC容器内安装应用程序和服务,而Docker被设计限制为单个应用程序,是基于容器的单一应用程序虚拟化引擎。Cgroups可以限制、记录、隔离进程组所使用的物理资源,Cgroups给LXC实现虚拟化提供了资源管理手段。从资源管理角度来看,三者的关系是,Cgroup在最底层落实资源管理,LXC在Cgroups、Namespace,unionFS上又封装了一层,而Docker是在LXC的基础上进行改进实现轻量级容器,所以Docker的实现是建立在LXC技术基础之上的。 LXC之Cgroups、Namespace、unionFS
Cgroups
由Linux内核支持,可以对物理资源进行限定、记录、隔离,比如CPU、磁盘和网络的IO,LXC技术的物理基础。
Namespace
隔离系统资源,可以为每一个容器提供一个独立的namespace,在每一个namespace空间内有自己独立的进程号(即用户在每一个namespace内仿佛享有了系统可以使用的全部进程号,好像独占了一台linux虚拟机),每个namespace的进程号相对于另一个namespace是透明的,整个子namespace可以映射到父namespace的某一个进程号。
unionFS:联合挂载文件系统
两个特殊的文件:
bootfs:包含boot loader和kernel,系统加电自检后挂载,当整个内核加载进内存后卸载,并释放内存。
rootfs:Linux启动时,rootfs会被以只读的方式挂载,启动完成后只读模式会被改为读写模式。典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件。Docker与传统linux启动不同,Docker在bootfs自检完毕后不会将rootfs设置为读写模式,而是利用unionFS将一个或多个read-only的rootfs加载到之前的rootfs之上,多层rootfs在加载之后仍然是一个文件系统,此时所有联合挂载的rootfs还属于镜像层,当使用镜像创建容器,在镜像层的read-only rootfs之上分配一个可读写的read-write的rootfs,这个rootfs成为容器层。当docker容器运行时,顶层是读写,下面的所有层都是只读的,只读层只需要读取读写层的数据,完成相应策略即可,符合策略于机制分离原则。
- Docker 特性
1.文件系统隔离:每个进程容器运行在完全独立的根文件系统里。
2.资源隔离:可以使用cgroup为每个进程容器分配不同的系统资源,例如CPU和内存。
3.网络隔离:每个进程容器运行在自己的网络命名空间里,拥有自己的虚拟接口和IP地址。
4.写时复制:采用写时复制方式创建根文件系统,这让部署变得极其快捷,并且节省内存和硬盘空间。
5.日志记录:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
6.变更管理:容器文件系统的变更可以提交到新的映像中,并可重复使用以创建更多的容器。无需使用模板或手动配置。
7.交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。 - 三个重要概念
1.Docker镜像:一个静态模板,类似于ISO镜像,不能修改,可以通过封装生成。
2.Docker容器:基于Docker镜像运行启动的应用或系统,也可称为Docker虚拟机。
3.Docker仓库:存放Docker镜像的地方,分为公开仓库和私有仓库。
Docker镜像类似于面向对象编程中的类,Docker容器类似于类实例化后的对象。