本篇文章不会涉及到复杂的名词,不会涉及到复杂的实现过程,这篇文章的一个基本目的是让你明白docker是干嘛的,它这样做与之前相比有什么进步,哪些地方有优化。希望能用最简单的语言让你明白,这种技术带来的利弊。
目录


  • 虚拟化发展
  • 对比主机虚拟化和容器虚拟化
  • 主机级虚拟化
  • 容器虚拟化
  • 常见问题
  • 性能比较
  • 容器技术的优劣
  • Docker目标
  • Docker使用场景
  • Docker缺陷
  • 小结


虚拟化发展

在我们上大学的时候,就会被冯诺依曼体系洗脑,导致我们都知道了计算机是由计算器、控制器、存储器、输入、输出这五部分组成。那计算器和控制器现在一般都结合在一起作为cpu,存储器一般包括内存和磁盘,输入输出一般指的是网络的I/O或者磁盘的I/O。所以,我们在生活中常见的IT资源就有cpu、内存、磁盘、网卡等等这些设备,使用操作系统来驱动这些设备,让它们协同合作,这就变成了一台完整的计算机。

那么,问题来了,随着计算任务的变化,我们对计算机有了更多的需求。比如,你只有一台电脑,上面已经装了windows系统,你却想让他在跑一台linux;再比如,你现在的电脑计算能力不够了,但是加上你同学的电脑就可以了。也就是说,我们想要计算机的资源能够具有很强的弹性伸缩能力,可任意增长,也可任意消减。

于是,科学家们提出了虚拟化这一说法,希望能够使用软件的方法重新定义和划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。虚拟化目前有两个方向,其一是把一个物理机虚拟成多个独立的逻辑虚拟机;其二是把若干分散的物理机拟为一个大的逻辑虚拟机。现在用的较多的一般都是第一种技术。

虚拟化技术其实是很早就提出来的概念,经历了这么多年的发展,其技术迭代如下图所示。现在处于容器级虚拟化阶段,也就是将应用程序、开发软件包、依赖环境等统一打包到容器中,将整个容器部署至其他的平台或者服务器上。

docker 修改容器内文件名称 docker容器改名字_docker 修改容器内文件名称


图1 虚拟化发展

对比主机虚拟化和容器虚拟化

主机级虚拟化

主机级别的虚拟化是将物理资源转变为逻辑上可以管理的资源,以打破物理结构之间的壁垒,使计算元件运行在虚拟的基础上,而不是真实的物理资源上。通过虚拟化技术,可以将物理资源转变为逻辑资源(虚拟机),应用程序服务运行在虚拟资源上,而不是真实的物理机上。因此,对于主机级虚拟化,我们的实现方式一般是想办法去模拟出硬件环境,模拟出虚拟的cpu、内存、硬盘、网卡等资源,然后在这些虚拟资源之上安装合适的操作系统来控制这些资源。

docker 修改容器内文件名称 docker容器改名字_docker 修改容器内文件名称_02


图2 主机虚拟化

如上图所示,在VMM(又叫做hypervisor)之上,可以模拟出逻辑的计算机虚拟环境,然后安装操作系统,使其成为一台逻辑上虚拟的计算机主机,该主机有自己的系统内核,有自己的用户空间,可以在自己的用户空间内跑各种各样的应用程序。

容器虚拟化

容器是一种虚拟化的方案,和传统的虚拟机(通过中间层”guerst OS”运行服务)不同,Docker直接运行在操作系统之上。因此容器虚拟化也被称之为操作系统虚拟化。Docker容器依赖于Linux内核特性,Namespace和Cgroups,所以只能运行在Linux之上。
一句话来概括的话,主机级虚拟化就是通过各种各样的手段,把物理资源重新分配,然后抽象出一部分拿来做虚拟机的虚拟硬件,是对硬件的模拟;而容器虚拟化技术相当于把操作系统进行虚拟化,把物理的操作系统模拟为逻辑上的多个操作系统,不同的操作系统有自己的用户空间,实现了应用程序间的隔离。

常见问题

docker 修改容器内文件名称 docker容器改名字_docker_03


图3 对比

上面这幅图可以帮助我们更主管的理解二者之间的区别,下面归纳常见的疑问。

Q1:Container技术和服务器虚拟化是一样的技术吗?

答:不是。两者虽然都属于虚拟化的技术,目标都是为了将一套应用程序所需的执行环境打包起来,建立一个孤立环境,方便在不同的硬件中移动,但两者的运作思维截然不同。简单来说,常见的传统虚拟化技术如vSphere或Hyper-V是以操作系统为中心,而Container技术则是一种以应用程序为中心的虚拟化技术。

传统虚拟化技术从操作系统层下手,目标是建立一个可以用来执行整套操作系统的沙盒独立执行环境,习惯以虚拟机(Virtual Machine)来称呼。而Container技术则是直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立沙盒执行环境,为了和传统虚拟化技术产生的虚拟机区分,Container技术产生的环境就称为Container。

Q2:一般常见的虚拟机和Container有何不同?
答:最明显的差别是,虚拟机需要安装操作系统(安装Guest OS)才能执行应用程序,而Container内不需要安装操作系统就能执行应用程序。Container技术不是在OS外来建立虚拟环境,而是在OS内的核心系统层来打造虚拟执行环境,透过共享Host OS的作法,取代一个一个Guest OS的功用。Container也因此被称为是OS层的虚拟化技术。

Q3:为何Container是轻量级虚拟化技术?
答:因为Container技术采取共享Host OS的作法,而不需在每一个Container内执行Guest OS,因此建立Container不需要等待操作系统开机时间,不用1分钟或几秒钟就可以启用,远比需要数分钟甚至数十分钟才能开启的传统虚拟机来的快。

性能比较

Hyper-V、KVM和Xen等虚拟机管理程序都“基于虚拟化硬件仿真机制。这意味着,它们对系统要求很高。” 然而,容器却使用共享的操作系统。这意味着它们在使用系统资源方面比虚拟机管理程序要高效得多。容器不是对硬件进行虚拟化处理,而是驻留在单单一个Linux实例上。这反过来意味着,你可以“丢弃没有用的99.9%的虚拟机垃圾,剩下一个小巧简洁的胶囊式容器,里面含有你的应用程序,”,因此,借助经过全面调优的容器系统,你就可以在同一硬件上拥有数量比使用Xen虚拟机或KVM虚拟机多出四到六倍的服务器应用实例。

容器技术的优劣

举一个例子来说明容器技术的优越性,比如说同时要在虚拟机和容器上都部署Nginx服务器,那么分析下这二者之间的区别

  • 传统虚拟化:硬件服务器-HostOS-VMM-GuestOS-Nginx WEB服务
  • Docker虚拟化:硬件服务器-HostOS-VMM-Nginx WEB服务

传统的虚拟化技术多了一层要去启动虚拟机的操作系统的流程,而虚拟机的操作系统运行时非常消耗内存资源的。在资源的利用上,以及响应速度上,容器虚拟化技术要优越于主机虚拟化技术。

Docker目标

  • 提供简单轻量级的建模方式(docker的启动是毫秒级的)
  • 职责的逻辑分离:开发人员只需要关注容器中运行的程序,运维人员只需要关注对容器的管理。Docker开发提高了开发程序和部署容器的一致性
  • 快速高效的开发声明周期:缩短代码从开发、测试到部署上线的生命周期
  • 鼓励使用面向服务的架构:docker推荐单个容器只运行一个应用程序/进程,这样就形成了一个分布式的应用程序模型,避免服务之间的互相影响。实现 高内聚,低耦合。

Docker使用场景

1.使用Docker容器开发、测试、部署服务:docker本身是轻量级的,所以本地开发人员可以构建、运行并分享docker容器,容器可以在开发环境中创建,然后提交到测试,在到生产环境。

2.创建隔离的运行环境:在很多企业应用中,同一服务的不同版本可能服务于不同的用户,使用Docker很容易创建不同的环境来运行不同版本的服务

3.搭建测试环境:有于Docker的轻量化,所以开发者很容易在本地搭建测试环境,用来测试程序在不同系统下的兼容性,甚至集群式的测试环境。

4.构建多用户的平台服务(PaaS)基础设施

5.即同软件即服务(SaaS)应用程序

6.高性能、超大规模的宿主机部署

Docker缺陷

以上介绍了那么多Docker的优点,那么它有没有某些地方在设计之初的时候,是没有被考虑进去的,当然是有的。Docker是一项对开发人员及其友好的技术,因为开发跑的程序只要打包好,就可以直接运行在生产环境中了,但这对于运维是一项挑战,因为,这个镜像已经是被打包好的,如果你想要在里面做一些性能上的调整是很难得,你很难去对已经打包好的这个镜像做处理。又或者,服务运行出问题了,你需要查日志,分析数据,然后做相应的操作,但对于已经封装好的容器来说,这是有难度的。

小结

总之,docker是目前虚拟化技术发展的一个顶峰了,前阵子还报道,京东已经将所有应用从虚拟机迁移到了容器中,构建了最大的k8s集群,由此可知,这项技术正在以惊人的速度改变着我们现行的世界。