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

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

虚拟化发展

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

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

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

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

图1 虚拟化发展

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

主机级虚拟化

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

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

容器虚拟化

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

常见问题


图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集群,由此可知,这项技术正在以惊人的速度改变着我们现行的世界。

docker容器详解(入门必看)(一)相关推荐

  1. Web.config配置文件详解(新手必看)

    Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点. ...

  2. Docker容器详解

    什么是docker? Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使 用这个镜像 ...

  3. 索尼android sd卡上,SD卡各个文件夹功能详解 入手必看经验!!!!

    对于初次使用Android系统的新手来说,当打开SD开一看,里面那些林林总总的文件夹总会让自己不知所措,有些看文件夹名称,还能猜到点作用来,但是大部分的都不知道是做什么的 1..android_sec ...

  4. 计算机进制、内存模块详讲-入门必看(超详细)

    本文旨在让你掌握最基本的计算机进制及内存的知识,相信入门的朋友看完后大有帮助                                           因为部分排版原因电脑观看效果最佳 文中 ...

  5. python工具安装教程_Python 开发工具PyCharm安装教程图文详解(新手必看)

    一.概念理解1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行jso ...

  6. 不可重复读和幻读详解(必看!!!)

    前言:看了很多关于MySQL隔离级别的视频和文章,发现了一个问题,大家都是说,不可重复读是在一个事务中读到了另一个事务提交后修改后的数据,而幻读是一个事务读到了另一个事务中添加并提交后的数据.那么删除 ...

  7. RPC框架详解(必看)

    1.RPC介绍 RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想.RPC 是一种技术思想而非一种规范或协议 ...

  8. Git详解之必知点----Git、本地仓库、远程仓库、IDEA集成Git

    Git详解之必知点 1.Git介绍 1.1版本控制(理解) 1.2开发中存在的问题(理解) 1.3SVN版本控制(理解) 1.4Git版本控制(理解) 2.Git下载和安装 2.1Git的安装(应用) ...

  9. ExoPlayer详解——入门(官方文档)

    ExoPlayer详解系列文章 ExoPlayer详解--入门(官方文档) ExoPlayer详解--媒体类型(官方文档) ExoPlayer详解--高级主题(官方文档) 一.ExoPlayer,你好 ...

  10. 读Java并发编程实践记录_原子性_锁_同步容器详解_任务执行

    原子性: 单独的,不可分割的操作 不要使用过期状态值来决策当下的状态, 一定要先检查再执行(不检查, 将引发数据修改,丢失) 避免延迟初始化(懒加载: 先查看对象 == null, 然后new), 有 ...

最新文章

  1. [云炬python3玩转机器学习]4-3 训练数据集,测试数据集
  2. c语言p1-melepeo,学生选课系统c语言程序代码
  3. matlab使用常犯的错误
  4. Android学习笔记四十Preference使用
  5. access集团和abm_abm年度盛典,12月份,中国、澳大利亚、新西兰三地同时举办,abm各渠道运营商从全球各地赶来参会!...
  6. 论文浅尝 | 端到端神经视觉问答之上的显式推理
  7. 惠安七号机器人创意园_我是F518创意园,请为我投票!
  8. Python一题多解:水仙花数
  9. 计算机怎么新建word文档,右键新建没有word文档怎么办?Win10新建word文档的方法...
  10. 北理工嵩天Python面向对象程序设计笔记
  11. 不管发生什么事,最重要的是拥有乐观积极的心态,困难总会过去的。
  12. Oracle 19 创建数据库、表空间
  13. 【U8+】用友U8成本管理模块下,定额分配标准中无法取到新增存货的数据。
  14. Raspbian镜像无头烧录
  15. P1071 [NOIP2009 提高组] 潜伏者
  16. 服务器生成js文件,Next.js 静态生成和服务器端渲染
  17. matlab中如何加窗,matlab时域加窗
  18. 数据库快速入门教程--视频
  19. 小波变换 wavelet 2
  20. c语言 pic16f877a 例子,PIC16F877A与PC机串行通信C语言源程序

热门文章

  1. SpringCloud——消息驱动
  2. 代码简洁之道:一行Python代码解决问题是时尚还是玄学
  3. 真正决定你成败的,是时间管理!
  4. PostgreSQL概述
  5. 为底层元素注册监听器
  6. SaaS架构设计之共享设备
  7. 2.3 Hightway Networks
  8. matplotlib绘图实例:pyplot、pylab模块及作图参数
  9. 【医疗影像处理】脑部MRI影像denoise方法总结[antspy]
  10. Identity Mappings in Deep Residual Networks2016【论文理解】