要解释清楚Docker,首先要说解释清楚容器(Container)的概念。要解释容器的话,需要从操作系统说起。太深入的一两本书都说不清楚,直接引用维基的说法,操作系统就是管理计算机的硬件软件和资源,并且为软件运行提供通用服务的系统软件。
- 硬件管理,包括分配CPU时间、内存;从网络、存储设备等IO设备读写数据。
- 软件管理,就是各种软件的运行,线程、进程调度之类的工作。
- 为软件提供运行环境,这个运行环境通常一部分由操作系统内核(Kernel)提供,另一部分由运行库(Runtime Library)提供。
硬件、操作系统和应用程序的关系可以用下图表示
随着硬件的性能提升,以及软件种类的丰富,有两种情况变得很常见
(1)硬件资源过剩
(2)软件冲突
在硬件性能过剩的时候,硬件虚拟化的普及就很自然而然的提出来了,虚拟机就是硬件虚拟化的产物。虚拟机分为两大类,一类和二类,示意图如下。我们常用的VM软件是二类的虚拟机。
这样虽然实现了硬件层面的隔离,都是缺点也是很明显,Guest OS占用资源多,启动慢。那么有没有一种占用资源少又能实现软件包括运行库在内的冲突呢?操作系统层虚拟化技术----容器的概念提出。在Linux可以通过控制组(Control Group,通常简写为cgroup)隔离,并把应用和运行库打包在一起,来实现这个目的。容器和Type II虚拟机、物理机的区别见下图:
每一个APP和lib(运行库)组合在一起便是一个镜像,Docker是容器引擎
与硬件虚拟化技术相比容器技术的优点有
(1)启动迅速
(2)占用资源少
缺点:和虚拟机相比,因为共用内核,只靠cgroup隔离,应用之间的隔离是不如虚拟机彻底的,如果某个应用运行时导致内核崩溃,所有的容器都会崩溃
Docker把App和Lib的文件打包成为一个镜像,并且采用类似多次快照的存储技术,例如aufs/device mapper/btrfs/zfs等,可以实现:
- 多个App可以共用相同的底层镜像(初始的操作系统镜像)
- App运行时的IO操作和镜像文件隔离;
- 通过挂载包含不同配置/数据文件的目录或者卷(Volume),单个App镜像可以同时用来运行无数个不同业务的容器。
上图是基于一个Alpine Linux的镜像,分别建立了Nginx和MySQL的镜像,并且挂载不同的配置/数据同时运行3个网站应用3个数据库应用的示意图。
此外,Docker公司提供公共的镜像仓库(Docker称之为Repository),Github connect,自动构建镜像,大大简化了应用分发、部署、升级流程。加上Docker可以非常方便的建立各种自定义的镜像文件,这些都是Docker成为最流行的容器技术的重要因素。
通过以上这些技术的组合,最后的结果就是,绝大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,用户通过docker pull下载镜像,用docker run运行应用。用户不需要再去关心如何搭建环境,如何安装,如何解决不同发行版的库冲突——而且通常不会需要消耗更多的硬件资源,不会明显降低性能。这就是其他答主所说的标准化、集装箱的原因所在。
就在Docker容器技术被炒得热火朝天之时,大家发现,如果想要将Docker应用于具体的业务实现,是存在困难的——编排、管理和调度等各个方面,都不容易。于是,人们迫切需要一套管理系统,对Docker及容器进行更高级更灵活的管理。
就在这个时候,K8S出现了。
K8S,就是基于容器的集群管理平台,它的全称,是kubernetes。