docker使用google公司推出的GO语言进行开发实现
基于linux内核的cgroup、namespace,以及OverlayFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术
由于隔离的进程独立于宿主和其他隔离的进程,因此称其为容器。
最初实现是基于LXC,从0.7版本以后开始去除LXC,转而使用自行开发的libcontainer,从1.1版本开始,则进一步演进为使用runC和containered
- runc是一个Linux命令行工具,用于根据OCI容器运行时规范创建和运行容器
- containerd是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集
docker在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得docker技术比虚拟机技术更为轻便、快捷
下面的图片比较了docker和传统虚拟化方式的不同之处:
什么是虚拟化?
如果要对物理资源进行管理,第一步就是虚拟化。
虚拟化是云计算的基础。简单来说,虚拟化就是在一台物理服务器上,运行多台“虚拟服务器”。这种虚拟服务器,也要虚拟机(VM virtial machine)
从表面来看,这些虚拟机是独立的服务器,实际上,他们共享物理服务器的CPU、内存、硬件、网卡等资源。物理机,通常称为“宿主机”。虚拟机,则称为“客户机”。
容器也是虚拟化,但是属于《轻量级》的虚拟化,它的目的和虚拟机一样,都是为了创造“隔离环境”。但是,它又和虚拟机有很大的不同——虚拟机是操作系统级别的资源隔离,而容器本质上是进程级的资源隔离
容器是一个不依赖于操作系统,运行应用程序的环境
它通过Linux的Namespaces和Cgroup技术对应用程序进程进行隔离和限制的。
namespace的作用是隔离,它让应用进程智能看到该Namespace内的世界
Cgroup的作用是限制分配给进程的宿主机资源。
但对于宿主机来说,这些被隔离了的进程跟其他进程没有太大的区别。
容器只是运行在宿主机的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。
总的来说,虚拟机非常适合传统的资源密集型单片应用程序,尤其是准备将这些应用程序移至云中时。
容器更适合承载web服务中使用的微服务,特别是在对可扩展性要求很高的情况下。当以这种方式使用容器时,通常由容器编排系统对其进行管理,以自动执行计算机应用程序的部署、扩展和管理。
本文作者:Eric
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!