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

Docker虚拟机_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Docker虚拟机
上传于|0|0|文档简介
&&Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
个人大数据技术博客:
扣扣: 微信:
今天云平台的同事提到, 现在的运维就是恶性循环, 因为大家都在申请机器, 显然的是, 大家申请机器都是按照自己的峰值申请的, 而为了保证突发状况, 如 ddos, 双11 等, 申请者甚至会两倍于自己的峰值去估算自己的服务. 由于资源紧张, 云平台会对其削减, 因为云平台也要为公司减少运维成本, 可能原来申请10台机器最后变成给5台, 而最终有经验的申请者会直接申请20台, 然后等削减成10台(正如鲁迅所说, 如果不说把屋顶掀了, 中国人根本不会同意在屋里装个窗户)申请容易而回收难, 云平台并没有能力去监控每台机器的使用量, 就算他们找到使用资源大大浪费的机器, 他们也难以说服拥有机器的团队回收其机器, 最终, 大量超高配的机器(比如64g 内存, 16核), 就贡献着几百的 qps, 造成极大的浪费也许自动化运维是每个云平台的目标, 将运维自动化, 私有化, 最后公有化, 而当今大热 docker 就是解决运维困境的一剂良药什么是 docker? 为了更好理解, 你可以直接和别人说它是虚拟机, 实际上 docker 并不是虚拟机, 它做的是 linux 的隔离, 但它的隔离做的如此之真实以至于让人觉得自己拥有可以一台完整的 linux 系统那 docker 和 虚拟机具体是什么区别呢, 虚拟机在底层模拟出各种硬件, cpu, 硬盘之类的, 而 docker 是在软件层面给资源分组, docker 性能无限接近原生, 因为 docker 用的就是系统自己的进程, 而虚拟机做的再好, 也做不出原生的感觉docker 的隔离技术源自于 Linux 容器 LXC(linux container), 听起名字就知道, 这和沙箱应该差不多, 可以把东西分开放, 也就是隔离的意思, 甚至可以在某些仓库中看到 docker 的名字叫 lxc-docker而 LXC 又是基于 cgroup 的 namespace, chroot 等, 由于我并不懂这些, 但 namespace 可以帮助我们理解, 就像我们写程序一样, 这是一个命名空间, 与其他 namespace 相区别cgroup 对于 docker 是至关重要的, 了解它才会觉得 docker 不神秘, cgroup 全称为 control group, 是 linux 内核提供的功能, 简单的说, 它的作用就是把系统运行的进程按用户自定义的群组区分, 也就是说 一个 docker, 一个 groupcgroup 有限制使用资源的能力blkio – 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)cpu – 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问cpuacct – 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告cpuset – 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点devices – 这个子系统可允许或者拒绝 cgroup 中的任务访问设备freezer – 这个子系统挂起或者恢复 cgroup 中的任务memory – 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告net_cls – 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包ns – 名称空间子系统看到上面的 cgroup 配置属性真的是恍然大悟, docker 成为当今最热的运维神器一点都不奇怪, 它简直就是为了运维而生, 弹性计算, 资源报表, 暂停服务, 资源限制 根本不在话下入门教程
帮 docker 吹了这么多牛, 得说说具体怎么用安装
不管你是什么系统, 你应该首先尝试脚本一键安装, 也是官方推荐的方法sudo curl -sL
如果你很不幸的失败了, 那你也许是苦逼的 centos 或者 redhat 使用者, 那建议你使用yum search docker
运气好的话你可以找到一个叫 docker.io 的程序, 没错就是他如果再不行, 恩, 那就只能上官网看英语安装文档了不得不承认我至今都没有成功的从源码安装过运行
docker 也需要一个 daemon(后台), 所以首先要启动 docker 服务(不知为啥很多教程根本不提这一步)sudo docker -d或者sudo docker -H tcp://127.0.0.1:4243 -d
如果没报啥错误, 并且 docker images 也能看到一个列表目录而不是报错, 那少年你一定是成功了docker 依赖系统模块 bridge, 可以用 modprobe bridge 来查看有没有阿里云默认是启动不了 docker 的, 输入 route del -net 172.16.0.0 netmask 255.240.0.0 可解决使用
使用前你不得不了解两个概念, 一个叫 image, 一个叫 container, 对初学者来说这俩可能意思有点接近或者混淆, 看这些比喻也许你一下子就明白了, image 是只读的模板, 用来生成你需要的 container, 而 container 也可以变成新的 image使用 docker 就是使用 container, 而 container 来自于 image, 因此你需要先有个 image, docker 的操作像极了 git, 你可以这样下载一个 imagedocker pull ubuntu
这样你就有了一个 ubuntu image, 可以用 docker images 看到这个新的 image使用这个 image, 可以向它发送一个命令, docker run ubuntu echo hello docker当然, 没人会这么无聊, come on! 我们需要像虚拟机一样使用它, 搭建属于我们自己的环境, 自己的系统, 把搭建完成的 container 变成一个新的 image, 这才是我们的目标!docker run -it ubuntu /bin/bash
没错, 这条神奇的命令终于让 docker 变得有趣起来, 它让我们像 ssh 进入虚拟机一样操作, 翱翔退出可以用 exit, 或者 CTRL + D可惜的是, 一旦退出, container 不在维持了, 我们不可能一直在 container 中不出来, 但我们也要保持 container 的状态, 那怎么办呢docker run -itd ubuntu /bin/bash # 后台执行 containerdocker ps # 找到后台执行的 container id 或昵称docker attach
# 重新 attach 这个 container
注意, 这时候如果 exit 依然会终止这个 container, 要想 detach 跳出一个 container, 你需要使用 CTRL + P, CTRL + Q, 这样我们就又能用 attach 重新进入 container, 真是来去自如也许你不了解这些命令参数的意思, 不要紧, 本文并不准备当一个解释参数的大妈, docker 像 git, svn 那样可以用 docker help
来非常方便的查看这些帮助觉得实用就赶紧试试吧!友情提示:Docker技术微信群
Rancher微信群 (已有Rancher公司成员)
Docker微信群1 (阿里云 环球公司 搜狐 等成员)
Docker微信群2 已满 (腾讯公司成员为主)
Docker微信群3(未要求改群名)
入群方法:关注“Docker圈”微信公众平台 回复“加群”;
或加:微信号 xiaoxiong-momoda来源分享:你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
【编者的话】本文主要介绍了容器与虚拟机的区别,在策略、性能以及安全等方面,作者一一回答了目前人们对容器与虚拟机区别的疑问。
“Docker和虚拟机有什么不同?”,这似乎是我听到的有关容器最常见的问题之一,我一般给出的答案取决于提出此问题的不同方式。但是我喜欢这样开头:“容器和虚拟机仅仅相似于它们都提供了隔离环境。” 接着我阐述他们之间的差异,“容器能做的事少得多并且使用起来相当廉价。而虚拟机提供整个虚拟化硬件层,可以做更多的事情但是使用成本显著。“ 我想有人会有疑问的最大的原因是这两种技术在功能上似乎类似,至少在第一点看来。
“它如何影响我的部署策略?”有人希望直接跳到结论或者他们想要的结果。 “这样会如何影响我的部署策略?我刚上云,难道真的要改变一切,重新来过?这要花费多少?这要花费多大精力来学习呢?“
如果你从头到尾的解释给他们听,通常他们会由怀疑变成好奇。向他们展示那些项目,比如Docker,如何更简单地使用容器,如何将已经实现的项目与他们在使用的工具整合。他们会明白的,虽然还是有一些工作要做,但是学习和整合很容易。他们仍会希望得到更多的细节。
“它的性能如何?”“它的性能如何?” 这个问题甚至比第一个还要常见。我不确定他们希望听到什么,还有为什么他们会这样问,但是答案会让他们吃惊:性能非常接近裸机(直接地/非虚拟化)的性能。他们不会相信,但是原因就是隔离并不是虚拟化。
Docker volumes只是绑定挂载文件(文件就像指针指向磁盘上的一个位置,它创建一个绑定挂载仅仅是创建一个指向同一地点的另一个文件而已)。读取或写入该文件基本上像裸机操作的那样廉价。另一方面,读取或写入Volume以外的Docker容器文件系统比较昂贵。所以说不要那样做。
Docker networking就像裸机的网络。有一组用于每个容器而创建的虚拟(即逻辑的)以太网接口。任何网络性能下降是由于额外的内部跳动,比如:NAT。
容器的建立在一组Linux内核提供的功能墙壁上。对于IO(如果有的话)很少需要额外的处理或重定向。容器是廉价的。因为 使它们工作的软件是内置于操作系统中的,因此你可以停止(或至少减少)虚拟化软件的开支(或云实例)。
“它是不是比虚拟机更不安全呢?”当然,精明健谈的会问,“它是不是比虚拟机更不安全呢?” 目前来说也许是的......。
这个比较复杂,因为它取决于你正在拿它们做什么。为了全面了解请参考 by 。我会尽力来总结概括。
容器使用由Linux内核提供的命名空间。大多数人把命名空间认为是一个上下文或域的授权决定(进程X有权访问资源Y)。
如果容器内的进程扫描文件系统来寻找要窃取的东西,它只能找到容器内明确可见的文件。如果容器内的进程中想尝试做一些恶意的事情,比如打开端口31337后门服务,它不会有多大好处,因为这个端口实际上不会暴露在容器外的任何地方。容器内部的恶意进程不能访问的任何容器外的其他进程的内存。
有几个方法可以摆脱容器的束缚,但这些通常需要容器的root访问权限。不要以root运行应用程序。通过简单的几个步骤稳固root访问权限。
容器使用来提供与虚拟机相同级别的资源使用保护机制。容器和虚拟机都可以获取整个网络链接。
有些人会指出并非所有的Linux内核是命名空间的。这意味着有一些资源尚未隔离。这可能是真的,但它正在发生变化。集成的其他稳固的工具,像AppArmor或SELinux,可以帮助你构建一些真正的堡垒。如果有额外的工作来使容器达到与虚拟机相同的安全级别,那么它是值得的。
容器提供的隔离对于更密切的软件集成可以声明性地减少。虚拟机则是刚性的。容器运行的是不完整的操作系统(尽管它们可以)。虚拟机必须运行完整的。容器比虚拟机使用更少的闲置资源。它们不运行完整的操作系统。容器在在云硬件(或虚拟机)中可以被复用,就像虚拟机在裸机上可以被复用。所不同的是...容器需要毫秒分配。虚拟机需要几分钟。所以,你可以另配、重新平衡、释放以及使用容器比虚拟机的迭代更加迅速。
老实说,我感觉大多数傻傻的。以我的经验最常见的原因是人们提供硬件(虚拟或物理)是提供的隔离。
隔离如果每个容器运行的只有一个服务或者数据库,这是比较容易管理的。而且比较容易监控性能,了解故障的影响,并预测成本。像亚马逊公司,团队拥有他们自己的软件和硬件,隔离是其中的关键。你有没有与其他团队分享过一个负载均衡的重要资源?那么,当因为你的服务把他们的VIP设置为激增队列来代替外溢,它们会失败或者在半夜你被叫醒,你就会渴望有隔离了。
离目标进程越远,隔离会变得更昂贵。虚拟机是伟大的,它通过抽象来增加并行,服务于多操作系统的使用情况以及业界最好的安全性。但对于隔离,它们相当的昂贵。
容器提供的隔离就便宜。趁热得到它。
如果你想到阅读更多有关Docker和容器的内容,请查阅我的书。目前可以在Manning Early Access Program浏览电子版。
原文链接: (翻译: )
===========================
田浩浩,USYD研究生,专注Docker学习研究
Email: .au
要回复文章请先或
wizmacau developer}

我要回帖

更多关于 docker和虚拟机的区别 的文章

更多推荐

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

点击添加站长微信