要解释清楚Docker,首先要解释清楚容器的概念;而要解释容器,需要从操作系统说起。
维基百科:操作系统就是管理计算机的硬件、软件和资源,并且为软件运行提供通用服务的系统软件。
硬件管理:包括分配CPU时间、内存;从网络、存储设备等IO设备读写数据。
软件管理:就是各种软件的运行,线程、进程调度之类的工作。
为软件提供运行环境:通常一部分由操作系统内核提供,另一部分由运行库提供。
应用程序、操作系统、硬件之间的层级关系如下:
随着硬件的性能提升和软件种类的丰富,两种情况很常见:
早期时代为了解决软件冲突,一般是配置多台计算机(成本太高)或者在同一台电脑上安装多个操作系统(操作系统的安装、切换麻烦)。在硬件性能过剩的时候,硬件虚拟化的普及就自然而然提出了。
硬件虚拟化:某个特殊的软件,仿真出一台或者多台计算机的各种硬件,俗称虚拟机,用户可以在这一台虚拟机上安装、运行操作系统和各种应用。
虚拟机的一个缺点就是Guest OS通常会占用不少硬件资源。比如在虚拟机上运行Windows或者Linux,不运行任何其他应用,就需要占用一定的内存空间和硬盘空间。当同时运行比较多的虚拟机的时候,浪费的硬件资源就非常可观了。
[注]:Host OS指的是安装在你计算机上的系统,而Guest OS指的是安装在虚拟机上的系统。
能不能所有的应用使用同一个的操作系统减少硬件资源的浪费,但是又能避免包括运行库在内的软件冲突呢?操作系统层虚拟化—容器概念诞生了。在Linux中可以通过控制组隔离,并把应用和运行库打包在一起,来实现这个目的。
每一个应用和运行库的组合,就是一个容器,也就是Docker里面的一个集装箱。
和虚拟机相比,容器有以下优点:
当然,和虚拟机相比,因为共用内核,只靠控制组隔离,应用之间的隔离不如虚拟机彻底,如果某个应用运行时导致内核崩溃,所有的容器都会崩溃;而虚拟机内的应用崩溃,理论上时不会影响其他虚拟机以及上面运行的应用。
Docker把应用和运行库的文件打包成一个镜像,并且采用类似多次快照的存储技术,可以实现:
此外,Docker公司提供公共的镜像仓库,连接操作,自动构成镜像,大大简化了应用分发、部署、升级流程。加上Docker可以非常方便的建立各种自定义的镜像文件,这些都是Docker成为最流行的容器技术的重要因素。
通过上述技术的组合,绝大部分应用,开发者都可以通过docker build创建镜像,通过docker push上传镜像,通过docker pull下载镜像,使用docker run运行应用。用户不需要去关心如何搭建环境、如何安装、如何解决不同发行版的库冲突,而且通常不会需要消耗更多的硬件资源,不会明显降低性能。这就是docker标准化、集装箱的原因所在。
知乎:木头龙