Docker的前世今生
Docker起源于dotCloud云服务公司2013年用Go语言实现的容器引擎开源项目,因为其对开发、测试、运维的便利,几年内便从虚拟化领域火到了技术领域,越来越多的开发者和大型技术公司被其吸引,Docker的生态稳步扩大。
Docker功高盖主,本以云服务为核心业务的dotCloud公司反倒是Docker越来越火,后公司改名为Docker.Inc,All in做Docker相关的开发与维护。
如果你在Github上搜索Docker,会发现是找不到的。Docker项目名称已经改为moby。
云时代
在早期,硬件资源相对昂贵,一台计算机往往身负多职,几乎所有的程序、环境、运行时都集中在一台计算机上。随着程序规模和复杂度的提高,更新速度不断加快,运行所需的环境、依赖、硬件资源呈指数级上升。就如同台式机到笔记本,笔记本到手机一样,部署在服务器上的程序也趋于小型化与模块化,而在当时没有很好的部署解决方案的时期,不同的软件会产生截然不同的部署要求,这如同早期前端开发中适配各种浏览器环境一样,让开发、测试、运维都十分头疼。
同时,互联网的高速发展,服务集群和分布式称为主流,但碍于硬件资源限制,单个应用对应单台服务器的老式方案显然不现实,这就到了虚拟化技术大展身手的时刻了。
通过虚拟化技术,环境搭建更为便捷,开发者们可以更多的将时间用于核心业务和代码实现中。但对于愈发小型精密的应用来说,容器技术对比虚拟机技术更为合宜。
Docker
Docker主张应用即容器,把应用作为单位。当然也可以一个容器部署多个程序,但这就背离了Docker初衷了。
组成
Docker是易用且强大的生产力工具。其组成分为三个部分:
命名空间 ( Namespaces )
namespace是Linux core在 2.4 版本后逐渐引入的一项用于运行隔离的模块,主要针对隔离进程、网络、文件系统等虚拟资源
在许多编程语言中都存在命名空间的概念,它们的作用也基本上一致:内聚并解耦
Linux Namespaces 可以分为很多具体的子系统,如 User Namespace、Net Namespace、PID Namespace、Mount Namespace 等等
Docker通过Linux PID Namespace实现了容器内进程的隔离,内部被隔离的进程位于独立的空间内,与其它容器内的进程互不冲突
控制组 ( Control Groups )
简称CGroups,是 Linux core在 2.6 版本后逐渐引入的一项对计算机资源控制的模块,包括了资源隔离和资源分配。它基于OS实现,主要针对硬件资源隔离
虚拟化除了隔离程序外,也需要隔离硬件资源,除了隔离之外,CGroups也可以对隔离的资源进行资源分配,指定任意环境对任意资源的占有率
联合文件系统 ( Union File System )
Unio File System能够同时将多个不同的文件挂载到同一个目录内,能同时将切好的菜放到一个盘子里,实现虚拟环境下的快速启动和停止
其升级版本,Advanced Unio File System(AUFS),可以像git一样,判断更新的文件与原文件不同的地方并只更新不同的地方,能够降低文件系统空间占用
与虚拟机方案对比
如果需要搭建LAMP结构的服务,在虚拟机的方案下,需要先安装一个Linux OS,然后基于这个OS分别安装Apache,MySQL和PHP;而在Docker中省略OS层和HyperVisor层,Apache、MySQL,PHP分别对应一个容器,其所在的虚拟OS共享于宿主机OS,即基于原生的操作系统执行。
简单来说,可以把虚拟机比作重机枪,把容器比作手枪
虚拟机 容器
体量级 重量级 轻量级
速度 慢(分钟级) 快(秒级)
性能 低 高
空间消耗 大 小
最大支持度 少 多
关于虚拟机,因为功能丰富,但体积也相对庞大,配置相对繁琐,更适合重量级开发。因为其接近原生OS的速度和多容器支持,Docker则省去了很多繁琐重复的工作,更加轻量化,更适合当下快速开发的节奏。
优点
友好的CI/CD:将原有的工作流添加Docker,对于持续集成(Continuous Integration)和持续交付(Continuous Delivery)更加友好
Docker程序本地打包=>转移测试=>bug修改=>测试环境部署=>发布至生产环境
高可移植性:在本地电脑、虚拟机、云服务器,混合环境都可运行。
更高的资源利用率:Docker轻量且高效,可以很好的适应高密度的中小型部署,节约软硬件资源消耗,提高其利用率