Docker就是虚拟化的一种轻量级替代技术。Docker的容器技术不依赖任何语言、框架或系统,可以将应用变成一种标准化的、可移植的、自管理的组件,并脱离服务器硬件在系统中开发、调试和运行,在 Linux 系统上迅速创建一个容器并在容器上部署和运行应用程序,并通过配置文件可以轻松实现应用程序的自动化安装、部署和升级,非常方便。因为使用了容器,所以可以很方便的把生产环境和开
发环境分开,互不影响,这是 docker 最普遍的一个用法。接下来讲讲docker的几项核心技术。

cgroups

cgroups就是controller group ,用于限制某个或者某些进程的分配资源,在这个group中,有分配好的特定比例的cpu时间,IO时间,可用内存大小等。
cgroups是将任意进程进行分组化管理的Linux内核功能。
cgroups中的 重要概念是“子系统”,也就是资源控制器,每种子系统就是一个资源的分配器,比如cpu子系统是控制cpu时间分配的。首先挂载子系统,然后才有control group的。比如先挂载memory子系统,然后在memory子系统中创建一个cgroup节点,在这个节点中,将需要控制的进程id写入,并且将控制的属性写入,这就完成了内存的资源限制。
cgroups 被Linux内核支持,在很多领域可以取代虚拟化技术分割资源。cgroup默认有诸多资源组,可以限制几乎所有服务器上的资源。

LXC

LXC是Linux containers的简称,是一种基于容器的操作系统层级的虚拟化技术。借助于namespace的隔离机制和cgroup资源限制功能,LXC提供了一套统一的API和工具来建立和管理container。LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁
LXC 旨在提供一个共享kernel的 OS 级虚拟化方法,在执行时不用重复加载Kernel, 且container的kernel与host共享,因此可以大大加快container的启动过程,并显著减少内存消耗,容器在提供隔离的同时,还通过共享这些资源节省开销。

AUFS

AuFS是一个能透明覆盖一或多个现有文件系统的层状文件系统。 支持将不同目录挂载到同一
个虚拟文件系统下,可以把不同的目录联合在一起,组成一个单一的目录。这种是一种虚拟的文件系统,文件系统不用格式化,直接挂载即可。
Docker一直在用AuFS作为容器的文件系统。当一个进程需要修改一个文件时,AuFS创建该文件的一个副本。
AuFS可以把多层合并成文件系统的单层表示。这个过程称为写入复制( copy on write )。
AuFS允许Docker把某些镜像作为容器的基础。例如,你可能有一个可以作为很多不同容器的基础的CentOS系统镜像。多亏AuFS,只要一个CentOS镜像的副本就够了,这样既节省了存储和内存,也保证更快速的容器部署。
使用AuFS的另一个好处是Docker的版本容器镜像能力。每个新版本都是一个与之前版本的简单差异改动,有效地保持镜像文件最小化。

Image

Docker Image是一个极度精简版的Linux程序运行环境,镜像包括的东西更少,除非是镜像叠加方式的。
Docker Image是需要定制化Build的一个“安装包”,包括基础镜像+应用的二进制部署包。
Docker Image内不建议有运行时的配置文件。
Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等。
Docker Image尽量重用和使用网上公开的基础镜像。

Docker提供了统一的打包部署标准,统一的打包部署运行方案为了最大化重用Image,加快运行速度,减少内存和磁盘footprint, Docker container运行时所构造的运行环境,实际上是由具有依赖关系的多个Layer组成的。叠加了各种工具以及library等image,这些image由AUFS文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer用作记录对当前运行环境所作的修改。不同的APP就可以既可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等。

Container

Docker Container是Image的实例,共享内核。
Docker Container里可以运行不同Os的Image,比如Ubuntu的或者Centos。
Docker Container可通过docker exec命令进入容器排查问题。
Docker Container没有IP地址,通常不会有服务端口暴露,是一个封闭的沙箱。

Daemon

Docker Daemon是创建和运行Container的Linux守护进程,也是Docker最主要的核心组件。
Docker Daemon可以绑定本地端口并提供Rest API服务,用来远程访问和控制。