docker容器详解(入门必看)(一)
本篇文章不会涉及到复杂的名词,不会涉及到复杂的实现过程,这篇文章的一个基本目的是让你明白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容器详解(入门必看)(一)相关推荐
- Web.config配置文件详解(新手必看)
Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点. ...
- Docker容器详解
什么是docker? Docker是一个开源的应用容器引擎:是一个轻量级容器技术: Docker支持将软件编译成一个镜像:然后在镜像中各种软件做好配置,将镜像发布出去,其他使用者可以直接使 用这个镜像 ...
- 索尼android sd卡上,SD卡各个文件夹功能详解 入手必看经验!!!!
对于初次使用Android系统的新手来说,当打开SD开一看,里面那些林林总总的文件夹总会让自己不知所措,有些看文件夹名称,还能猜到点作用来,但是大部分的都不知道是做什么的 1..android_sec ...
- 计算机进制、内存模块详讲-入门必看(超详细)
本文旨在让你掌握最基本的计算机进制及内存的知识,相信入门的朋友看完后大有帮助 因为部分排版原因电脑观看效果最佳 文中 ...
- python工具安装教程_Python 开发工具PyCharm安装教程图文详解(新手必看)
一.概念理解1.json.dumps()和json.loads()是json格式处理函数(可以这么理解,json是字符串) (1)json.dumps()函数是将一个Python数据类型列表进行jso ...
- 不可重复读和幻读详解(必看!!!)
前言:看了很多关于MySQL隔离级别的视频和文章,发现了一个问题,大家都是说,不可重复读是在一个事务中读到了另一个事务提交后修改后的数据,而幻读是一个事务读到了另一个事务中添加并提交后的数据.那么删除 ...
- RPC框架详解(必看)
1.RPC介绍 RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想.RPC 是一种技术思想而非一种规范或协议 ...
- Git详解之必知点----Git、本地仓库、远程仓库、IDEA集成Git
Git详解之必知点 1.Git介绍 1.1版本控制(理解) 1.2开发中存在的问题(理解) 1.3SVN版本控制(理解) 1.4Git版本控制(理解) 2.Git下载和安装 2.1Git的安装(应用) ...
- ExoPlayer详解——入门(官方文档)
ExoPlayer详解系列文章 ExoPlayer详解--入门(官方文档) ExoPlayer详解--媒体类型(官方文档) ExoPlayer详解--高级主题(官方文档) 一.ExoPlayer,你好 ...
- 读Java并发编程实践记录_原子性_锁_同步容器详解_任务执行
原子性: 单独的,不可分割的操作 不要使用过期状态值来决策当下的状态, 一定要先检查再执行(不检查, 将引发数据修改,丢失) 避免延迟初始化(懒加载: 先查看对象 == null, 然后new), 有 ...
最新文章
- [云炬python3玩转机器学习]4-3 训练数据集,测试数据集
- c语言p1-melepeo,学生选课系统c语言程序代码
- matlab使用常犯的错误
- Android学习笔记四十Preference使用
- access集团和abm_abm年度盛典,12月份,中国、澳大利亚、新西兰三地同时举办,abm各渠道运营商从全球各地赶来参会!...
- 论文浅尝 | 端到端神经视觉问答之上的显式推理
- 惠安七号机器人创意园_我是F518创意园,请为我投票!
- Python一题多解:水仙花数
- 计算机怎么新建word文档,右键新建没有word文档怎么办?Win10新建word文档的方法...
- 北理工嵩天Python面向对象程序设计笔记
- 不管发生什么事,最重要的是拥有乐观积极的心态,困难总会过去的。
- Oracle 19 创建数据库、表空间
- 【U8+】用友U8成本管理模块下,定额分配标准中无法取到新增存货的数据。
- Raspbian镜像无头烧录
- P1071 [NOIP2009 提高组] 潜伏者
- 服务器生成js文件,Next.js 静态生成和服务器端渲染
- matlab中如何加窗,matlab时域加窗
- 数据库快速入门教程--视频
- 小波变换 wavelet 2
- c语言 pic16f877a 例子,PIC16F877A与PC机串行通信C语言源程序