如何看待docker 容器之间通信容器与虚拟机之间的比较

天极传媒:天极网全国分站
您现在的位置:
& >&企业应该深层理解Docker容器技术
企业应该深层理解Docker容器技术的使用场景天极网服务器频道 09:34
  【天极网云计算频道】近日,DaoCloud联合创始人陈齐彦就以Docker为代表的容器技术在企业级市场的发展情况接受了天极网的独家专访。DaoCloud是一家企业级容器云平台和解决方案提供商,致力于以Docker为代表的容器技术,推动云计算平台和云平台原生(Cloud Native Application)的革命性发展。DaoCloud为用户提供Docker化应用开发运维平台、Docker的Mirror镜像、企业培训、咨询服务和开源技术社区活动等产品和服务。
DaoCloud联合创始人陈齐彦
  DaoCloud联合创始人陈齐彦职业生涯的大部分都是从事虚拟化工作,不论是在EMC、VMware,还是后来的Pivotal。在EMC时陈齐彦负责EMC中国研究院,EMC中国研究院隶属于EMC CTO Office。这个办公室不仅仅关注EMC自身业务,还会关注新技术,比如VMware的虚拟化技术。EMC后来收购了Pivotal,Pivotal是最早一批做容器技术的公司。也正是这样的经历,让陈齐彦对虚拟化和容器化有了自己的理解。
  所以,从陈齐彦的履历看,其与其他云计算初创企业创始人最大的不同就是一开始关注企业级市场的需求。所以,陈齐彦及其DaoCloud对于以Docker为代表的容器技术的关注,更加契合企业级市场对于容器技术的需求。
  容器技术与虚拟化技术的区别
  对于容器技术与虚拟化技术的区别,DaoCloud联合创始人陈齐彦表示,云计算的基石是虚拟化技术。如果从一种观察视角看,虚拟化技术和容器技术分别代表了两种不同的方向,虚拟化技术是从上往下看,而容器技术是从下往上看。
  对此,陈齐彦解释道,虚拟化关注硬件底层资源的池化和资源隔离,也就是资源的管理贯穿在整个虚拟化技术的生命周期里面。而容器技术一开始就是关注应用层面,在现有资源上如何实现应用的敏捷开发,应用是容器技术的核心。
  目前Docker生态圈甚是繁荣,围绕Docker的初创企业如雨后春笋般涌现。而且以IBM、VMware、微软为代表的传统IT厂商也介入到容器技术市场,纷纷推出基于Docker的相关服务。陈齐彦对此表示,这些现场充分说明了Docker的商业价值。而且Docker社区并没有出现类似OpenStack那样的乱象,这主要得益于Docker公司的集权式管理。
  过去的一年,以Docker为代表的容器技术在业界掀起了一股热潮。Docker为开发团队带来的灵活性以及给数据中心带来的性能优势让企业趋之若鹜,Docker这项开源技术不仅仅是红帽和Canonical等Linux巨头眼里的宠儿,微软等专有软件公司也在热烈拥抱Docker。Docker已经成为主流Linux版本的标准特性,比如Ubuntu、Red Hat Enterprise Linux(RHEL)和CentOS。Docker的到来也催生了新的Linux发行版,比如CoreOS和Red Hat的Project Atomic,它们设计成能运行容器的最小环境系统。
  由于Docker可以运行在任何有合理数据内核的Linux上,所以它可以运行在很多IaaS提供的云上。许多大的云提供商宣布了对Docker和它的生态系统的附加支持。AWS推出了EC2 Container服务,让客户使用AWS上的Docker容器轻松地运行和管理分布式应用。EC2 Container服务与Docker Hub集成。Docker Hub是一个托管的资源库,其中基于Docker容器的应用在整个开发社区或一个私人组织内分发和共享。AWS还直接贡献于Docker Hub官方资源库及开源项目。
  2014年6月,微软开放技术公司已经为Azure公有云用户带来了Linux版的Docker引擎。同时,Docker公司在美国与微软共同宣布,双方展开战略合作,在即将发布的Windows Server中,将为发展迅速的Docker分布式应用开放平台的全新容器技术提供支持。
  Docker在企业级市场的应用
  目前Docker集中于DevOps,而在企业生产环境下应用仍有待加强。对于Docker为代表的容器技术在企业级市场的前景,陈齐彦表示,Docker是一种开源技术,从某种意义上讲这代表着自主可控。Docker非常容易融入企业现有管理流程,可以极大优化企业应用交付流程。
  基于Docker的软件交付是一种全新的软件交付方式。目前大多数企业已经完成硬件资源池化,但是计算资源没有被利用,面临着管理失控等一系列问题。基于Docker容器的管理可以充分释放企业的管理价值。
  虽然Docke具有诸多好处,但是这也得益于正确的使用方式。对于目前Docker在企业生产环境中暴露的问题,比如安全以及部署等,陈齐彦表示,这是因为企业把Docker当成虚拟化平台使用,并没有正确理解容器技术的使用场景。
  对于未来DaoCloud的发展规划,陈齐彦表示,DaoCloud的终极目标是让开发者和企业把Docker使用起来。DaoCloud与Docker公司有着非常好的合作关系,双方会共同推动Docker生态圈建设,推展Docker应用场景。
  此外,DaoCloud会针对不同的行业需求提供专属的解决方案,比如针对互联网公司和金融行业,DaoCloud可以提供私有化的PaaS交付平台。在合作伙伴拓展方面,DaoCloud输出技术和产品帮助合作伙伴一起开拓行业客户。近期DaoCloud发布了国内首个混合式容器主机管理服务,并宣布顺利完成其与国内流行代码托管服务商的技术对接。这些行为就是DaoCloud合作伙伴政策的具体落地。
  DaoCloud发布了国内首个混合式容器主机管理服务,无缝对接主流IaaS公有云及私有云虚拟化平台。作为DaoCloud的独创技术,混合式容器主机管理服务能帮助用户通过一致的界面和流程,以跨云跨网的方式统一管理其在公有云、私有云及企业之后的各类容器主机资源,实现容器化应用的高速部署和灵活调度。据陈齐彦介绍,目前,DaoCloud已能够支持包括微软Azure、亚马逊AWS、阿里云、UCloud、青云等国内一线公有云厂商,也能够与VMware、OpenStack等企业级虚拟化平台对接,这意味着DaoCloud一站式容器化应用云平台将走进混合云和企业私有云场景。
  与此同时,为了向开发者提供更加友好的用户,以及更无缝流畅的应用交付流程,DaoCloud在支持GitHub、BitBucket等国际主流代码托管服务的基础上,已于近日顺利完成了与Coding、GitCafe、开源中国,以及内网环境下GitLab等国内流行代码托管服务的技术对接。
  通过对陈齐彦的专访,笔者心中关于Docker的疑团一个个被解开。以Docker为代表的容器技术是传统虚拟化技术的一种进化,当企业从最开始关注底层资源的池化到关注上层应用的敏捷开发,这代表了企业信息化建设迈上了一个新的高度。而Docker的社区运营也规避了OpenStack群龙无首的诟病,这为Docker后续的发展提供了良好的基础。虽然目前Docker在企业应用中还存在一些问题,但是顺应大势的Dcoker在企业级市场的前景是广阔的,期待容器技术在助推企业信息化建设中发展更大的作用。
(作者:李祥敬责任编辑:李祥敬)
天极新媒体&最酷科技资讯扫码赢大奖
* 网友发言均非本站立场,本站不在评论栏推荐任何网店、经销商,谨防上当受骗!
办公软件IT新闻整机本篇文章是Docker老鸟在工作中对Docker这个容器管理工具,长期使用、深入了解后总结出来的该工具的一些不为人知的知识,小编看到这篇文章后,觉得对很多小伙伴还是很有用的,遂分享出来,觉得有帮助的亲,可以来围观。
1、Docker 是容器管理工具
Docker 是一个轻量级、便携式、与外界隔离的容器,也是一个可以在容器中很方便地构建、传输、运行应用的引擎。和传统的虚拟化技术不同的是,Docker 引擎并不虚拟出一台虚拟机,而是直接使用宿主机的内核和硬件,直接在宿主机上运行容器内应用。也正是得益于此,Docker 容器内运行的应用和宿主机上运行的应用性能差距几乎可以忽略不计。
但是 Docker 本身并不是一个容器系统,而是一个基于原有的容器化工具 LXC 用来创建虚拟环境的工具。类似 LXC 的工具已经在生产环境中使用多年,Docker 则基于此提供了更加友好的镜像管理工具和部署工具。
2、Docker 不是虚拟化引擎
Docker 第一次发布的时候,很多人都拿 Docker 和虚拟机 VMware、KVM 和 VirtualBox 比较。尽管从功能上看,Docker 和虚拟化技术致力于解决的问题都差不多,但是 Docker 却是采取了另一种非常不同的方式。虚拟机是虚拟出一套硬件,虚拟机的系统进行的磁盘操作,其实都是在对虚拟出来的磁盘进行操作。当运行 CPU 密集型的任务时,是虚拟机把虚拟系统里的 CPU 指令“翻译”成宿主机的CPU指令并进行执行。两个磁盘层,两个处理器调度器,两个操作系统消耗的内存,所有虚拟出的这些都会带来相当多的性能损失,一台虚拟机所消耗的硬件资源和对应的硬件相当,一台主机上跑太多的虚拟机之后就会过载。而 Docker 就没有这种顾虑。Docker 运行应用采取的是“容器”的解决方案:使用 namespace 和 CGroup 进行资源限制,和宿主机共享内核,不虚拟磁盘,所有的容器磁盘操作其实都是对 /var/lib/docker/ 的操作。简言之,Docker 其实只是在宿主机中运行了一个受到限制的应用程序。
从上面不难看出,容器和虚拟机的概念并不相同,容器也并不能取代虚拟机。在容器力所不能及的地方,虚拟机可以大显身手。例如:宿主机是 Linux,只能通过虚拟机运行 Windows,Docker 便无法做到。再例如,宿主机是 Windows,Windows 并不能直接运行 Docker,Windows上的 Docker 其实是运行在 VirtualBox 虚拟机里的。
3、Docker 使用层级的文件系统
前面提到过,Docker 和现有容器技术 LXC 等相比,优势之一就是 Docker 提供了镜像管理。对于 Docker 而言,镜像是一个静态的、只读的容器文件系统的快照。然而不仅如此,Docker 中所有的磁盘操作都是对特定的Copy-On-Write文件系统进行的。下面通过一个例子解释一下这个问题。
例如我们要建立一个容器运行 JAVA Web 应用,那么我们应该使用一个已经安装了 JAVA 的镜像。在 Dockerfile(一个用于生成镜像的指令文件)中,应该指明“基于 JAVA 镜像”,这样 Docker 就会去 Docker Hub Registry 上下载提前构建好的 JAVA 镜像。然后再 Dockerfile 中指明下载并解压 Apache Tomcat 软件到 /opt/tomcat 文件夹中。这条命令并不会对原有的 JAVA 镜像产生任何影响,而仅仅是在原有镜像上面添加了一个改动层。当一个容器启动时,容器内的所有改动层都会启动,容器会从第一层中运行 /usr/bin/java 命令,并且调用另外一层中的 /opt/tomcat/bin 命令。实际上,Dockerfile 中每一条指令都会产生一个新的改动层,即便只有一个文件被改动。如果用过 Git 就能更清楚地认识这一点,每条指令就像是每次 commit,都会留下记录。但是对于 Docker 来说,这种文件系统提供了更大的灵活性,也可以更方便地管理应用程序。
我们Spantree的团队有一个自己维护的含有 Tomcat 的镜像。发布新版本也非常简单:使用 Dockerfile 将新版本拷贝进镜像从而创建一个新镜像,然后给新镜像贴上版本的标签。不同版本的镜像的不同之处仅仅是一个 90 MB 大小的 WAR 文件,他们所基于的主镜像都是相同的。如果使用虚拟机去维护这些不同的版本的话,还要消耗掉很多不同的磁盘去存储相同的系统,而使用 Docker 就只需要很小的磁盘空间。即便我们同时运行这个镜像的很多实例,我们也只需要一个基础的 JAVA / TOMCAT 镜像。
4、Docker 可以节约时间
很多年前我在为一个连锁餐厅开发软件时,仅仅是为了描述如何搭建环境都需要写一个 12 页的 Word 文档。例如本地 Oracle 数据库,特定版本的 JAVA,以及其他七七八八的系统工具和共享库、软件包。整个搭建过程浪费掉了我们团队每个人几乎一天的时间,如果用金钱衡量的话,花掉了我们上万美金的时间成本。虽然客户已经对这种事情习以为常,甚至认为这是引入新成员、让成员适应环境、让自己的员工适应我们的软件所必须的成本,但是相比较起来,我们宁愿把更多的时间花在为客户构建可以增进业务的功能上面。
如果当时有 Docker,那么构建环境就会像使用自动化搭建工具 Puppet / Chef / Salt / Ansible 一样简单,我们也可以把整个搭建时间周期从一天缩短为几分钟。但是和这些工具不同的地方在于,Docker 可以不仅仅可以搭建整个环境,还可以将整个环境保存成磁盘文件,然后复制到别的地方。需要从源码编译 Node.js 吗?Docker 做得到。Docker 不仅仅可以构建一个 Node.js 环境,还可以将整个环境做成镜像,然后保存到任何地方。当然,由于 Docker 是一个容器,所以不用担心容器内执行的东西会对宿主机产生任何的影响。
现在新加入我们团队的人只需要运行 docker-compose up 命令,便可以喝杯咖啡,然后开始工作了。
5、Docker 可以节省开销
当然,时间就是金钱。除了时间外,Docker 还可以节省在基础设施硬件上的开销。高德纳和麦肯锡的研究表明,数据中心的利用率在 6% – 12% 左右。不仅如此,如果采用虚拟机的话,你还需要被动地监控和设置每台虚拟机的 CPU 硬盘和内存的使用率,因为采用了静态分区(static partitioning)所以资源并不能完全被利用。。而容器可以解决这个问题:容器可以在实例之间进行内存和磁盘共享。你可以在同一台主机上运行多个服务、可以不用去限制容器所消耗的资源、可以去限制资源、可以在不需要的时候停止容器,也不用担心启动已经停止的程序时会带来过多的资源消耗。凌晨三点的时候只有很少的人会去访问你的网站,同时你需要比较多的资源执行夜间的批处理任务,那么可以很简单的便实现资源的交换。
虚拟机所消耗的内存、硬盘、CPU 都是固定的,一般动态调整都需要重启虚拟机。而用 Docker 的话,你可以进行资源限制,得益于 CGroup,可以很方便动态调整资源限制,让然也可以不进行资源限制。Docker 容器内的应用对宿主机而言只是两个隔离的应用程序,并不是两个虚拟机,所以宿主机也可以自行去分配资源。
6、Docker 有一个健壮的镜像托管系统
前面提到过,这个托管系统就叫做 Docker Hub Registry。截止到 日,互联网上大约有 14000 个公共的 Docker,而大部分都被托管在 Docker Hub 上面。和 Github 已经很大程度上成为开源项目的代表一样,Docker 官方的 Docker Hub 则已经是公共 Docker 镜像的代表。这些镜像可以作为你应用和数据服务的基础。
也正是得益于此,你可以随意尝试最新的技术:说不定有些人就把图形化数据库的实例打包成了 Docker 镜像托管在上面。再例如 Gitlab,手工搭建 Gitlab 非常困难,译者不建议普通用户去手工搭建,而如果使用 Docker Gitlab,这个镜像则会五秒内便搭建完成。再例如特定 Ruby 版本的 Rails 应用,再例如 Linux 上的 .NET 应用,这些都可以使用简单的一条 Docker 命令搭建完成。
Docker 官方镜像都有 official 标签,安全性可以保证。但是第三方镜像的安全性无法保证,所以请谨慎下载第三方镜像。生产环境下可以只使用第三方提供的 Dockerfile 构建镜像。
7、Docker 可以避免产生 Bug
Spantree 一直是“固定基础设置”(immutable infrastructure)的狂热爱好者。换句话说,除非有心脏出血这种漏洞,我们尽量不对系统做升级,也尽量不去改变系统的设置。当添加新服务器的时候,我们也会从头构建服务器的系统,然后直接将镜像导入,将服务器放入负载均衡的集群里,然后对要退休的服务器进行健康检查,检查完毕后移除集群。得益于 Docker 镜像可以很轻松的导入导出,我们可以最大程度地减少因为环境和版本问题导致的不兼容,即便有不兼容了也可以很轻松地回滚。当然,有了 Docker,我们在生产、测试和开发中的运行环境得到统一。以前在协同开发时,会因为每个人开发的电脑配置不同而导致“在我的电脑上是能运行的,你的怎么不行”的情况,而如今 Docker 已经帮我们解决了这个问题。
8、Docker 目前只能运行在 Linux 上
前面也提到过,Docker 使用的是经过长时间生产环境检验的技术,虽然这些技术已经都出现很长时间了,但是大部分技术都还是 Linux 独有的,例如 LXC 和 Cgroup。也就是说,截止到现在,Docker 容器内只能在 Linux 上运行 Linux 上的服务和应用。Microsoft 正在和 Docker 紧密合作,并且已经宣布了下一个版本的 Windows Server 将会支持 Docker 容器,并且命名为 Windows Docker,估计采用的技术应该是Hyper-V Container,我们有望在未来的几年内看到这个版本。
推荐学习:
文章来源:code
本文目前还没有评论……docker精品文章(19)
虚拟机(VM)是对某种计算机操作系统的模拟,虚拟机的实现是基于计算机虚拟化的架构和指令,具体可能需要特定的硬件、软件、或软硬件同时的支持。在本文中希云将为大家揭晓Docker容器和全虚拟化之间的区别。
Docker是一个创建封装好的隔离计算机环境,每个封装好的环境都被称为容器。
启动一个Docker容器非常迅速,因为:
* 每个容器共享宿主系统的内核
* 然而,各个容器都运行着一个Linux的副本
* 这意味着没有hypervisor,而且不需要额外的启动
对比之下,KVM, VirtualBox 或者 VMware之类的虚拟机实现是不同的。
宿主系统 vs 客户系统
是直接安装在计算机上的原生系统
是安装在一个虚拟机上,或者在宿主机的一个分区上的系统
如果是安装在虚拟机上,客户系统可以与宿主系统不同
如果是安装在一个磁盘分区上,客户系统必须与宿主系统相同
是一种计算机软件、固件或者硬件,用于创建并运行虚拟机的
一个系统中安装着hypervisor,里边运行着一个或多个虚拟机,这个系统可被定义为宿主机
各个虚拟机被定义为客户机
[Docker容器](
由Docker创建的一个封闭计算环境
Linux平台上的Docker
基于提供的组件构建的(特别是cgroups和namespaces)
不像虚拟机,不需要包含一个独立的操作系统
非Linux平台上的Docker
使用去运行容器
是管理容器的持久进程
使用Linux特定的内核特性去实现
全虚拟化的系统分配到的是独有的一组资源,只有极少量的资源会共享,是有更强的隔离性,但是更加重了(需要更加多的资源)。用Docker容器有弱些的隔离性,但是它们更加轻量,需要更少的资源,所以你可以毫不费力地启动上千个容器。
基本上,Docker容器和全虚拟化VM有着本质上不同的目标
* VM是用于完全模拟一个外部环境
* 在一个全虚拟化VM的实现上,Hypervisor主要作用是翻译客户系统和宿主系统之间的指令
* 每个虚拟机中,应用以及相关依赖运行在一个完整的操作系统上
* 如果你需要同时运行不同的操作系统(如Windows, OS/X 或 BSD),或者需要为特定平台的系统编译程序,那你需要的是一个全虚拟化VM的实现
* 相反地,容器的系统(或者更准确来说,是内核)必须与宿主系统一致,而且与容器和宿主间共享着
容器使应用具有可移植性,并能自包含
各容器共享着宿主机的内核
这意味着没有hypervisor,而且不需要额外的系统启动
容器引擎负责启动或停止容器,这与虚拟机实现中的hypervisor类似
然而,容器中运行的进程与宿主系统的进程是同行级别的,所以不会被相关的hypervisor杀掉
各容器共享着宿主机的内核
在本文中,我们只关注了Linux平台下的Docker实现,换言之,我们讨论的是排除掉了非Linux平台(也就是Windows,Mac OS X等等),因为Docker守护进程使用特定的Linux内核特性,你不能在Windows 或 Mac OS X直接运行原生的Docker。在非Linux平台上,Docker使用去运行容器。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14516次
排名:千里之外
原创:21篇
(2)(2)(4)(7)(6)(1)工具类服务
编辑部专用服务
作者专用服务
虚拟机、容器与Docker技术对比
计算资源的虚拟化技术是云计算不可或缺的关键技术之一,它的目标在于提高云平台的性能、可用性,使资源利用最大化,从而实现更高的利润。计算资源的虚拟化从一开始的虚拟机技术,到Linux容器技术,再到现在火热的Docker技术。本文分析了三种资源虚拟化技术的优缺点的基础上,对三种技术进行了对比分析,并对产业发展做了简单的预测。
作者单位:
苏州大学计算机科学与技术学院 215000
年,卷(期):
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社【Docker】容器、虚拟机与Docker概念全解析_Linux就该这么学_天涯博客
《Linux就该这么学》是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材。
今日访问:[$DayVisitCount$]
总访问量:51183
开博时间:
博客排名:34626
(6)(95)(9)
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。本文立足于新手,从容器和虚拟机两个大的概念入手,由浅入深,由宏转微,为我们解析了Docker的方方面面。来吧朋友们,理解它,热爱它,然后更好地使用它。
作为程序员或者技术人员,大家肯定听说过Docker的鼎鼎大名&&这款工具能够帮助我们高效打包、发布及运行承载着应用程序的&容器&系统。其发展如火如荼&&从开发者到运维人员,每个人都在关注着这位技术新贵。即使是像谷歌、VMware与Amazon这样的技术巨擘也在构建相关服务为其提供支持。 无论大家是否有意立即使用Docker,我们都应当对其基础概念加以了解,并明确区分容器与虚拟机之间的差异所在。目前网络上已经存在大量对二者关联与区别的阐述性文章,不过在今天的综述中,我们将立足于新手对其加以剖析。 下面首先聊聊虚拟机与容器究竟是什么?
容器与虚拟机究竟是什么?
容器与虚拟机拥有着类似的使命:对应用程序及其关联性进行隔离,从而构建起一套能够随处运行的自容纳单元。 此外,容器与虚拟机还摆脱了对物理硬件的需求,允许我们更为高效地使用计算资源,从而提升能源效率与成本效益。 容器与虚拟机之间的核心差异在于其架构方法。下面一起进行深入了解。
虚拟机在本质上就是在模拟一台真实的计算机设备,同时遵循同样的程序执行方式。虚拟机能够利用&虚拟机管理程序&运行在物理设备之上。反过来,虚拟机管理程序则可运行在主机设备或者&裸机&之上。 下面用更直白的表达来说明: 虚拟机管理程序可表现为软件、固件或者硬件,并作为虚拟机的运行基础。虚拟机管理程序本身运行在物理计算机之上,我们也将这种底层硬件称为&主机设备&。主机设备为虚拟机提供资源,包括内存与CPU。这些资源由不同虚拟机共享,并根据需要进行随意分配。因此如果一套虚拟机运行有需求大量资源的高强度应用程序,那么我们可以在同一主机设备上为其分配远高于其它虚拟机的资源配额。 运行在主机设备上的虚拟机(当然,需要配合虚拟机管理程序)通常被称为一套&客户机&。这套客户机容纳有应用程序及其运行所必需的各类组件(例如系统二进制文件及库)。它同时还包含有完整的虚拟硬件堆栈,其中包括虚拟网络适配器、存储以及CPU&&这意味着它也拥有自己的完整访客操作系统。着眼于内部,这套客户机自成体系并拥有专用资源。而从外部来看,这套虚拟机使用的则是由主机设备提供的共享资源。 如上所述,客户机可以运行主机虚拟机管理程序或者裸机虚拟机管理程序。二者之间存在着多种重要区别。 首先,主机虚拟机管理程序运行在主机设备的操作系统之上。举例来说,一台运行有OS X的计算机可以在操作系统之上安装虚拟机(例如VirtualBox或者VMware Workstation 8)。该虚拟机并不会直接访问硬件,因此其需要经由主机操作系统(也就是Mac OS X)实现资源获取。 主机虚拟机管理程序的优势在于,其基本摆脱了对底层硬件的要求。该主机操作系统负责提供硬件驱动程序,而非由虚拟机管理程序自身提供,因此我们认为其具备更理想的&硬件兼容性&。在另一方面,这种介于硬件与虚拟机管理程序之间的额外层会带来更多资源消耗,进而降低虚拟机性能表现。 裸机虚拟机管理程序则将虚拟机直接安装并运行在主机设备硬件之上以改善性能表现。由于其直接接入底层硬件,因此我们不再需要主机操作系统作为辅助。在这种情况下,我们可以直接在硬件上安装虚拟机管理程序并将其作为操作系统。与主机虚拟机管理程序不同,裸机虚拟机管理程序拥有自己的设备驱动程序及接口,从而直接支持各类I/O、处理或者操作系统特定任务相关组件。这种方式能够带来更理想的性能水平、可扩展性以及稳定性。但代价是其硬件兼容性比较有限,因为虚拟机管理程序只能包含一部分设备驱动程序。 说到这里,大家可能提出疑问:为什么我们非得在虚拟机与主机设备之间添加&虚拟机管理程序&呢? 这个嘛,因为虚拟机本身拥有一套虚拟操作系统,而虚拟机管理程序则负责为虚拟机提供平台以管理并运行这套访客操作系统。如此一来,主机计算机就能够为运行于其上的各虚拟机分配共享资源了。
虚拟机原理示意图
如大家所见,虚拟机会将虚拟硬件、内核(即操作系统)以及用户空间打包在新虚拟机当中。
与提供硬件虚拟化机制的虚拟机不同,容器通过对&用户空间&的抽象化处理提供操作系统层级的虚拟化机制。通过对容器进行分解,大家将可以非常清晰地理解其中含义。 出于各种考量与需求,容器在外观上与虚拟机非常相似。举例来说,二者皆拥有专有处理空间、能够作为root执行命令、提供专有网络接口与IP地址、允许定制化路由及iptable规则,且可启动文件系统等等。 容器与虚拟机间的最大区别在于,各容器系统共享主机系统的内核。
容器原理示意图
以上示意图显示了容器如何对用户空间进行打包,而不像虚拟机那样同样对内核或者虚拟硬件进行打包。每套容器都拥有自己的隔离化用户空间,从而使得多套容器能够运行在同一主机系统之上。我们可以看到全部操作系统层级的架构都可实现跨容器共享。惟一需要独立构建的就是二进制文件与库。正因为如此,容器才拥有极为出色的轻量化特性。
Docker的功能定位
Docker为基于Linux容器的开源项目,其利用Linux内核中的各项功能&&例如命名空间与控制组&&以在操作系统之上创建容器。 容器概念并不是什么新鲜事物; 谷歌公司多年来一直在使用自己开发的容器技术。其它Linux容器技术方案还包括Solaris Zones、BSD jails以及LXC,且其都已经拥有多年的发展历史。 那么为什么Docker的出现会快速吸引到技术业界的注意?
易用性: Docker能够为潜在受众带来出色的易用性&&开发者、系统管理员以及架构师等等&&从而帮助其充分利用容器技术优势以快速构建并测试可移植应用程序。每个人都可以在自己的笔记本上打包应用程序,并将其直接运行在任何公有云、私有云甚至是裸机之上。其座右铭是:一次构建,随处运行。
速度: Docker容器具备轻量化与高速特性。由于容器本身属于运行在内核之上的沙箱环境,因为其对资源的需求量极低。大家可以在数秒钟内完成容器的创建与运行,而虚拟机则由于需要引导完整的虚拟操作系统而耗费更多时间。
Docker Hub: Docker用户还能够享受由Docker Hub带来的丰富生态系统支持,我们可以将其理解成&Docker镜像的应用商店&。Docker Hub提供成千上万由社区开发的公共镜像,且可立即加以使用。我们可以轻松根据需要搜索到合适的镜像,将其提取并稍加修改即加以使用。
模块性与可扩展性: Docker允许我们轻松将应用程序的功能拆分成多个独立容器。举例来说,我们可以将自己的Postgres数据库运行在一套容器当中,并将Redis服务器运行在另一容器内,而Node.js也拥有自己的容器系统。在Docker的帮助上,大家能够轻松将这些容器对接起来以创建完整的应用程序,这就让未来的规模伸缩或者组件更新得以通过相互独立的方式完成。
最后但同样重要的是,Docker鲸鱼实在是太惹人喜爱了~
Docker基本概念
现在我们对Docker有了宏观印象,下面具体对其组件进行解读:
Docker Engine
Docker Engine属于Docker的运行层。这是一套轻量化运行时及工具组合,负责管理容器、镜像、构建 等等。它以原生方式运行在Linux系统之上,并由以下元素构成: Docker Daemon,运行在主机计算机之上。 Docker Client,负责与Docker Daemon通信以执行命令。 REST API,用于同Docker Daemon远程交互。
Docker Client
Docker Client正是我们作为最终用户的通信对象。我们可以将其视为Docker的UI。 我们进行的一切操作都将直接接入Docker Client,再由其将指令传递至Docker Daemon。
Docker Daemon
Docker Daemon直接将执行命令发送至Docker Client&&例如构建、运行以及分发等等。Docker Daemon运行在主机设备之上,但作为用户,我们永远不会直接与该Daemon进行通信。Docker Client也可以运行在主机设备上,但并非必需。它亦能够运行在另一台设备上,并与运行在目标主机上的Docker Daemon进行远程通信。
Dockerfile
Dockerfile是我们编写指令以构建Docker镜像的载体。这些指令包括: RUN apt-get y install some-package:安装某软件包 EXPOSE 8000: 开放端口 ENV ANT_HOME /usr/local/apache-ant:传递环境变量 类似的指令还有很多。一旦设置了Dockerfile,大家就可以利用docker build命令来构建镜像了。下面来看Dockerfile示例:
# Start with ubuntu 14.04
FROM ubuntu:14.04MAINTAINER preethi kasireddy iam.preethi.# For SSH access and port redirection
ENV ROOTPASSWORD sample# Turn off prompts during installations
ENV DEBIAN_FRONTEND noninteractive
RUN echo "debconf shared/accepted-oracle-license-v1-1 select true" | debconf-set-selections
RUN echo "debconf shared/accepted-oracle-license-v1-1 seen true" | debconf-set-selections# Update packages
RUN apt-get -y update# Install system tools / libraries
RUN apt-get -y install python3-software-properties \software-properties-common \bzip2 \ssh \net-tools \vim \curl \expect \git \nano \wget \build-essential \dialog \make \build-essential \checkinstall \bridge-utils \virt-viewer \python-pip \python-setuptools \python-dev
# Install Node, npm
RUN curl -sL /setup_4.x | sudo -E bash -
RUN apt-get install -y nodejs
# Add oracle-jdk7 to repositories
RUN add-apt-repository ppa:webupd8team/java
# Make sure the package repository is up to date
RUN echo "deb /ubuntu precise main universe" & /etc/apt/sources.list
# Update apt
RUN apt-get -y update
# Install oracle-jdk7
RUN apt-get -y install oracle-java7-installer
# Export JAVA_HOME variable
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle
# Run sshd
RUN apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo "root:$ROOTPASSWORD" | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\\s*required\\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
# Expose Node.js app port
EXPOSE 8000
# Create tap-to-android app directory
RUN mkdir -p /usr/src/my-app
WORKDIR /usr/src/my-app
# Install app dependencies
COPY . /usr/src/my-app
RUN npm install
# Add entrypoint
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["npm", "start"]
示例Dockerfile
Docker镜像
镜像属于只读模板,大家可以借此配合Dockerfile中的编写指令集进行容器构建。镜像定义了打包的应用程序以及其相关依赖。这些依赖就好像是其启动时需要运行的进程。 Docker镜像利用Dockerfile实现构建。Dockerfile中的每条指令都会在镜像中添加一个新的&层&,这些层则表现为镜像文件系统中的一个分区&&我们可以对其进行添加或者替换。层概念正是Docker轻量化的基础。Docker利用一套Union File System建立起这套强大的结构:
Union File System
Docker利用Union File System以构建镜像。大家可以将Union File System视为一套可堆叠文件系统,这意味着各文件系统中的文件与目录(在Docker中被称为分支)可以透明方式覆盖并构成单一文件系统。 覆盖分支内的各目录内容拥有同样的路径,并将被视为单一合并目录,这就避免了需要为每个层分别创建副本的麻烦。相反,这些目录可调用特定指针以指向同样的资源; 当特定层需要进行修改时,其会分别创建修改前与修改后的本地副本。通过这种方式,文件系统表现出可写入特性,但其实际上并未接受任何写入操作。(换言之,这是一套&写入即复制&系统。) 分层系统拥有两大核心优势: 无重复数据: 分层机制使得我们在使用镜像创建并运行新容器时无需复制完整的文件集,从而保证Docker容器实例拥有良好的运行速度与低廉的资源成本。 层隔离: 变更操作速度很快&&当我们对镜像进行变更时,Docker只需要对进行了变更的层进行广播。
Volumes属于容器中的&数据&部分,会在容器创建时进行初始化。Volumes机制允许我们持久保留并共享容器数据。数据卷 独立于默认Union File System之外,且作为普通目录及文件存在于主机文件系统当中。因此即使是在对容器进行销毁、更新或者重构时,数据卷仍然不受影响。当我们需要对某一数据卷进行更新时,直接加以变更即可。(作为另一项优势,数据卷还能够在不同容器之间进行共享与复用。)
Docker容器
如上所述,Docker容器将一款应用程序的软件打包在单一环境当中,同时包含全部运行必需的要素。其中包括操作系统、应用程序代码、运行时、系统工具、系统库等等。Docker容器由Docker镜像构建而成。由于镜像存在只读属性,因此Docker会在镜像在只读文件系统之上添加一套读取-写入文件系统以实现容器创建。 另外,在创建容器时,Docker还会创建一套网络接口以帮助容器同本地主机通信、对接可用IP地址并执行用户在定义镜像时所执行的进程以运行应用程序。 在成功创建了一套容器之后,我们随后可以将其运行在任何环境当中,而不必再做任何变更。
&容器&揭秘
打开容器,我们会发现其中包含大量活动组件。容器的实现机制一直令我感到惊讶而好奇,特别是考虑到容器不存在任何抽象的基础设施边界。在阅读了大量材料之后,我将结合自己的理解为大家进行讲解:) &容器&这一术语其实只是个抽象概念,用于表述多种不同的相关特性,而其与原词&container&的另一含义&集装箱&有着千丝万缕的联系。下面就来一起了解:
命名空间为容器提供对应的底层Linux系统视图,即限制容器的查看与访问范畴。当我们运行一套容器时,Docker会创建多个命名空间供特定容器使用。 Docker会在内核中使用多种不同类型的命名空间,例如:
NET: 为容器提供独特的系统网络堆栈视图(例如自有网络设备、IP地址、IP路由表、/proc/net目录、端口编号等等)。
PID: PID代表进程ID。如果大家曾经在命令行中运行过ps aux以检查当前系统正在运行的进程,就会发现其中一栏名为&PID&。PID命名空间为容器提供其能够查看与交互的进程范围,其中包括独立的init(PID 1),其属于&所有进程的元祖&。
MNT: 为容器提供独特的系统&mounts&视图。这样不同mount命名空间内的进程就将拥有彼此不同的文件系统结构。
UTS: UTS代表UNIX分时系统。它允许某一进程识别系统身份(例如主机名称或者域名等)。UTS允许容器拥有不同于其它容器以及主机系统的主机名称与NIS域名。
IPC: IPC代表进程间通信。IPC命名空间负责对运行在每套容器内的进程进行IPC资源隔离。
USER: 此命名空间用于对每套容器内的用户进行隔离。其允许各容器拥有不同的uid(即用户ID)与gid(组ID)视图区间,并将其与主机系统进行比对。这样一来,某一进程的uid与gid在用户命名空间之内与之外即有所不同,这也使得该进程能够在不影响容器内root权限的情况下,撤销同一用户在容器外的权限。
Docker将这些命名空间结合起来以隔离并创建容器。下面要讲的则是控制组。
控制组(也被称为cgroups)属于Linux内核中的一项功能,用于对一组进程的资源使用量(包括CPU、内存、磁盘I/O以及网络等)进行隔离、排序与计数。这意味着cgroup能够确保Docker容器只使用其必需的资源&&并在必要情况下设置其所能使用的资源上限。另外,cgroups还能够确保单一容器不至于占用太多资源并导致整体系统陷入瘫痪。 最后要说明的是Union文件系统:
隔离化Union File System
我们在之前的Docker镜像章节中已经解释过了:) 这就是关于Docker容器的全部内容了(当然,实现细节才是最麻烦的环节&&例如如何管理不同组件间的交互)。
Docker的未来:Docker与虚拟机将并生共存
尽管Docker已经开始逐步成为主流,但我认为它不太可能对虚拟机造成真正的威胁。容器将继续发展壮大,但虚拟机也仍然拥有适合自己的生存空间。 举例来说,如果我们需要在多台服务器上运行多款应用程序,那么最理想的办法就是使用虚拟机。在另一方面,如果我们需要运行同一应用程序的多套副本,那么Docker则拥有更多具体优势。 另外,尽管容器允许我们将应用程序拆分成多个功能组件,但这种分散化趋势意味着我们需要管理更多功能部件,即带来更为复杂的控制与协调任务。 安全同时也是Docker容器需要解决的一大难题&&由于各容器共享同一套内核,因此不同容器之间的屏障非常薄弱。与只需要调用主机虚拟机管理程序的虚拟机方案不同,Docker容器需要向主机内核发出系统调用,而这会带来更庞大的攻击面。出于安全性的考量,很多开发人员可能更倾向于选择虚拟机&&其由抽象化硬件进行隔离,从而显著提升了彼此交互的难度。 当然,安全性与管理等难题必将随着容器在生产环境下的进一步普及而得到解决。就目前来讲,关于容器与虚拟机孰优孰劣的议题已经成为开发人员与运维人员间的日常争论素材。
希望通过此文能让大家掌握Docker、虚拟机的基本概念和区别。容器时代即将到来!
本文转载自:/redhat-rhop-train/免费提供最新Linux技术教程书籍,为开源技术爱好者努力做得更多更好:}

我要回帖

更多关于 虚拟机安装docker 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信