概述
Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。
与虚拟化的区别
容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和namespaces来打造轻便的、将近裸机速度的虚拟技术操作系统环境。它是操作系统层级的虚拟化技术。因为不是虚拟化存储,所以容器技术不会管 底层存储或者文件系统,而是你放哪里,它操作哪里。
这从根本上改变了我们如何虚拟化工作负载和应用程序,因为容器速度比硬件虚拟化技术更快,更加便捷,弹性扩容的更加高效,只是它的工作负载要求操作系统,而不是Linux或特定的Linux内核版本。
与LXC的区别
Docker并不是LXC的替代品,Docker的底层就是使用了LXC来实现的。LXC将Linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。
在LXC的基础之上,Docker提供了一系列更强的功能。
关键技术
一般来说,容器技术主要包括Cgroup和Namespace这两个内核特性。
对于Linux容器的最小组成,除了上面两个抽象的技术概念还不够,完整的容器可以用以下公示描述:
容器=Cgroup+Namespace+rootfs+容器引擎(用户态工具)。
其中各项功能分别为:
Cgroup:资源控制;
Namespace:访问隔离;
rootfs:文件系统隔离;
容器引擎:生命周期控制;
Cgroup
Cgroup(control group),又称为控制组,它主要是做资源控制。原理是将一组进程放在放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。
Namespace
Namespace又称为命名空间,它主要做访问隔离。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于这类资源,因为每个容器都有自己的抽象,而他们彼此之间是不可见的,所以就可以做到访问隔离。
一句话概括
Docker是LXC的管理器,LXC是cgroup的管理工具,cgroup是namespace的用户空间的管理接口。namespace是Linux内核在task_struct中对进程组管理的基础机制。
详细点说
Docker是用go来实现的,自动化了对lxc的管理过程,能够自动在线下载相应的发行版本的rootfs。
LXC可以直接chroot到任意的系统的rootfs上并通过cgroup的限制机制来控制容器内系统的资源占有率。
cgroup通过配置文件或者命令配置后,限制相应进程或一组进程使用的系统资源。
很明显,在LXC以上已经借助于chroot机制在一个限制的容器中运行一个完整的系统了,这样多个不通过虚拟化技术的新系统就在特定的占有物理资源的限制上运行起来。据说运行效率直逼实际机器。