机器学习:软件工程方法与实现
上QQ阅读APP看书,第一时间看更新

2.3.1 Docker简述

Docker诞生在法国,起初是dotCloud公司(现已更名为Docker Inc)内部的项目,该项目于2013年以Apache 2.0协议开源,代码托管在GitHub,核心由Go语言编写。该项目曾在2015年10月得到超过2.5万Stars,有近1100名贡献者,成为当时GitHub上排名前20的明星项目。

Docker的设计思想俗称为“集装箱”模式。各类不同、相似或相同的应用或服务被单独地、标准化地打包封装,形成便携的、独立的“集装箱”,集装箱之间互不影响,共同由一艘大船(计算机基础设施)承载。这就是Dockerhub官网首页的标语“Build and Ship any Application Anywhere”和蓝鲸Logo所要表达的含义,任何应用一次构建,即可在任何地方运行。

按照官网的说法,Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时,“在我的机器上可正常工作,而在其他机器工作异常”的问题。运维人员可以利用Docker在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和更可靠的信誉为Linux和Windows Server应用发布新功能。

我们可以把Docker功能的一部分理解为一种便利的打包工具,它可以将应用程序及其依赖项打包到可以在任何Linux服务器上运行的虚拟容器中,从而保证在其他平台运行时和本地运行环境高度一致。无论是在内部、公共云、私有云还是裸机上部署,应用程序都可以实现灵活移植,进而避免了应用程序在部署、迁移过程中环境不一致的问题。正因如此,相比Pipenv构建的Python虚拟环境,Docker构建的是操作系统级别的虚拟环境,两者相比,Docker是重量级的。Docker的本质就是为应用程序构建了一个虚拟化的运行环境,其底层基于Linux内核(cgroups和namespaces等),目标是实现轻量级的操作系统虚拟化解决方案(该过程也被称为容器化)。此处的轻量是针对传统的虚拟机(物理硬件层抽象技术,诸如KVM、CpenStack、VirtualBox、VMware)而言,两种类型虚拟化技术应用差异如图2-3所示。

传统的虚拟机与Docker方式相比,多出了Hypervisor这层交互,其导致了一定的资源浪费和性能降低,且上层还需要重建整个操作系统。举一个浅显的例子说明两者直观上的差别。

使用虚拟化工具VirtualBox虚拟CentOS操作系统,并在其上运行Python 3,那么首先需要下载CentOS操作系统的安装文件。官网https://www.centos.org/download/显示,当前最新版本安装文件CentOS-7-x86_64-DVD-1810.iso约为4GB,精简版本约为1GB,接着在VirtualBox中安装CentOS。这样就完整地虚拟了一台Linux操作系统,最后下载Python3安装和运行。

图2-3 运行视图

如果使用Docker,则需在仓库下载Python 3镜像,其大小约360MB,如果使用精简镜像alpine[1]构建的Python,大小只有几十兆。同样,内存等资源的使用也有类似的差异。

因为是轻量级,所以Docker容器有如下的特点:启动和停止快捷;对系统资源需求相对较少,一台宿主机可同时运行多个Docker容器,依据不同的硬件配置,可运行10个或更多。另外,Docker在操作使用上也非常便捷,不仅只用一个命令就能拉取、分发和更新镜像,极为简化地使用已有的镜像,而且其Dockerfile配置文件支持灵活的自定义、自动化创建和部署。

Docker的这些优势促使了它在IT行业的广泛应用,比如云计算、DevOps等领域。当人们使用Docker将应用程序和其他进程在单个物理机上或跨多个虚拟机自动运行起来时,就创建了高度分布式的系统,必要时可实现平台即服务(PaaS)风格的部署和扩展。

当然,容器技术也存在缺点,比如大规模容器集群会导致企业背负复杂的技术栈而影响容器的大规模落地应用。

以上,我们简述了Docker技术及其功能点,接下来将细分Docker软件中包含的核心组件。

[1] http://containertutorials.com/alpine.html