说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Docker:集装箱式“运输”在软件上的实现

HTML文档下载 WORD文档下载 PDF文档下载
如今,“集装箱化思维”被运用在软件“运输”上,Docker可以看作是用代码编写出来的国际集装箱,它可以把任何应用及相关依赖项打包成一个轻量、可移植、自包涵式的容器。

Docker是由PaaS提供商dotCloud在2013年年初创建的一款开源应用引擎,Docker可以自动将任何应用打包成轻量、可移植、自包涵的容器引擎。开发者构建的应用可以一次构建全平台运行,包括本地开发机器,生产环境,虚拟机和云等。

Docker基于Go语言开发,代码托管在 Github上,并遵循Apache 2.0开源协议。近期,这个项目得到了越来越多的用户追捧,Github上的Star数已经9000多,Google的Compute Engine也支持 Docker,而在国内,知名的 百度也把Docker作为其Paas的基础。


来自Docker官方博客

Docker容器可以封装任何有效负载,几乎可以在任何服务器之间进行一致性运行。

Docker的常用案例包括:

  • 自动打包和部署应用
  • 创建轻量、私有的PaaS环境
  • 自动化测试和持续集成/部署
  • 部署并扩展Web应用、数据库和后端服务器

背景

十五年前,几乎所有的应用都是采用定义良好的堆栈编写,并且部署到单一的专有服务器上。今天,开发人员可以使用现成的最佳服务组合构建和装配应用程序,并且为这些应用程序进行跨不同硬件环境的多重部署做好了准备,包括公共的、私有的和虚拟化的服务器。


图1 IT演变

这种设置可能会用在:

  • 不同服务和“依赖抵御”之间的相互不良反应
  • 在快速迁移和跨不同硬件之间面临挑战,不可能管理一个跨多个服务并且被部署在不同硬件类型上的矩阵。


图2 多个栈和多种硬件环境所面临的挑战

我们可以看到,这里有大量的组合和排列应用/服务以及随时需要考虑每一个应用程序被写入或改写的硬件环境。这将给编写应用程序的开发人员和试图创建一个稳定、安全、高性能操作环境的人们带来一个困难的局面。


图3 使用动态栈和动态硬件环境创建一个N*N矩阵

那么,该如何解决这种局面呢?让我们举个运输界的例子,在1960年之前,大多数散货通过船进行托运,托运人和承运人很担心不同类型的货物之间会发生些不良反应(例如,一批铁压在一袋香蕉上)。同样,各种不同运输方式之间进行转换也是非常痛苦的,其中一大半的时间都是花在港口对货物进行卸载,然后再装载,并且还要等待同一批货物一起被装到火车、卡车等交通工具上。这样,在多种不同物品和多个不同的运输机制之间就存在一个N*N的矩阵。


图4 1960年之前的海运

幸运地是,标准集装箱的出现解决了以上所面临的难题。任何货物,从开心果到保时捷,都可以通过标准集装箱进行包装。托运人员或承运人可以把集装箱进行密封或者禁止再次打开,直到运输到目的地。在运输过程中,集装箱可以被卸载、装载、堆积、运输并且还可以有效地长距离运输。集装箱颠覆了全球运输方式——一个标准,让货物在火车、汽车、轮船之间畅通无阻。今天,有1800万只集装箱进行着90%的世界贸易。


图5 一个标准容器(集装箱)的出现解决了运输方面的难题

在某种程度上,Docker可以看作是用代码编写出来的国际集装箱。


图6 软件“运输”解决方案也是一个标准的容器系统

Docker可以把任何应用及相关依赖项打包成一个轻量、可移植、自包涵式的容器,该容器拥有标准的操作,从而能够实现自动化。与此同时,所有的应用都可以运行在任何Linux服务上。相同的容器,开发者可以在笔记本上有规模的运行、生产、也可以在虚拟机、逻辑服务器、OpenStack集群、公共实例、或以上所有结合(的方式)上运行。

换句话说,开发者构建的应用只需一次构建即可多平台运行。运营人员只需配置他们的服务,即可运行所有的应用。

Docker的主要功能特征


物理容器 Docker
内容无关性(Content Agnostic)
相同的集装箱可以容纳几乎任何类型的货物
可以封装任何有效负载及其依赖项
硬件无关性(Hardware Agnostic)

同一标准的容器允许把货物从船上运输到火车、卡车上,直到运输到仓库,整个过程无需整理货物或打开容器

使用操作系统基元(例如:LXC)几乎可以在任何平台上运行——虚拟机、裸机、OpenStack、公共IaaS等,并且无需修改

内容隔离和交互 无需担心铁压在香蕉上,容器可以堆积运输 资源、网络和内容隔离,避免依赖地狱
自动化

标准的接口使其易于实现自动化装卸、搬运等

运行、启动、停止、提交、搜索等都有标准的操作,非常适合devops:CI、CD、自动扩展、混合云

高效 无需打开或修改,可以在起始两地快速地移动/运输
轻量级、几乎没有任何偏向和启动惩罚,可以进行快速移动和操作
职责分离
托运人担心盒子内部、承运人担心盒子外部
开发人员担心代码,运营人员担心基础设施 

更多技术特性:

  • 文件系统隔离:每个进程容器都运行在一个完全独立的根文件系统里;
  • 资源隔离:系统资源,例如CPU、内存等,使用cgroups分配在不同的流程容器里;
  • 网络隔离:每个进程容器携带自身的一个虚拟接口和IP地址运行在自己的网络空间;
  • 即写即拷(Copy-on-write):使用即写即拷方式创建根文件系统,这样部署速度极快、内存和硬盘空间极少;
  • 日志:Docker将会收集和记录每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索;
  • 变更管理:容器文件系统的变更可以提交到新的映像(image)中,并可重复使用以创建更多的容器。无需使用模板或手动配置;
  • 交互式shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互shell。

Docker有哪些基本功能?

Docker让开发和运维变的简单。下面这幅图会让你对Docker基本功能有个很好的认识,Docker会将网络,存储这些事情都配好。下载应用并安装。并配置一些参数,打包上传Image。此外,Container既可以手动创建,也可以自动创建,如果源码库里面包涵DockerFile文件,那么将会自动创建,容器里不仅包涵应用,还包括应用的所有依赖项。

开发人员可以使用Docker Search命令在Docker Registry(无论是公有还是私有的)里搜索Containers,并且还可以使用Docker Pull命令从注册表里推送Container,使用Docker Run命令执行启动、运行、停止等操作。值得注意的是,Run命令的对象可能是你自己的服务器、公共实例或者是两者的组合。


图7 Docker的基本功能

关于Docker的完整功能列表,大家可以访问: http://docs.docker.io/en/latest/commandline/

Docker的三种运行方式:作为守护进程,在Linux主机上管理LXC容器;作为一个CLI,与守护进程的REST API进行对话(docker run ...);作为仓库的客户端,分享你所构建的内容(docker pull, docker commit)。

Containers是如何工作的?与VMs有何不同?

一个Container通常包含应用及应用依赖项,Container用来隔离进程,这些进程主要运行在主机操作系统上的隔离区和用户空间。

这个是明显不同于传统的VMs。传统的硬件虚拟化(例如VMWare、KVM、Xen、EC2)旨在创造一个完整虚拟机。每个虚拟化应用不仅包含应用的二进制文件,还需运行该应用程序所需的库、一个完整的Guest操作系统。


图8  Containers vs. 传统VMs

由于所有的容器共享同一个操作系统(以及二进制文件和库),所以,他们明显要比VM小的多,这样,就完全可以在一个物理主机上托管100个VMs(一般VM数量会受到严格限制)。此外,因为它们使用主机操作系统,重启一个VM并不意味着要重启操作系统,因此,容器更加轻便、高效。

Docker中的容器效率会更高。因为一个传统的VM、应用、每个应用副本以及每个应用微小的变更都需要重新创建一个完整的VM。

如上图所示,一个新的应用在主机上仅仅包含应用及其二进制文件/库,这样就无需创建一个新的客户机操作系统。

如果你想在主机上运行该应用的几个副本,你甚至无需复制共享的二进制文件。

最后,即使你对应用进行了变更,你也无需拷贝变更内容。


图9 Mechanism让Docker容器更轻量

这不仅让存储和容器运行变得更高效,还让应用程序更新变得极其简便。正如下图所示,更新一个容器只需应用差异的地方。


图10 修改和更新Container

下面分享一些比较酷的Docker用例

实例 实例描述 链接
构建自己的PaaS
Dokku——Docker实现的mini-Heroku。你所见过最小的PaaS实现
http://bit.ly/191Tgsx
基于指令环境的Web
JiffyLab——基于指令环境的Web,使用更轻量、Python和UNIX shell
http://bit.ly/12oaj2K
应用部署简便

使用Docker部署Java应用

在Docker上运行Drupal

在Docker上安装Redis

http://bit.ly/11BCvvu
http://bit.ly/15MJS6B
http://bit.ly/16EWOKh
创建安全沙盒 Docker让安全沙盒的创建更简单
http://bit.ly/13mZGJH
创建自己的SaaS
把Memcached作为服务 http://bit.ly/11nL8vh
应用程序自动化部署
使用Docker的Push-button部署
http://bit.ly/1bTKZTo
持续集成部署 dotCloud的Docker和Strider的下一代持续集成&部署
http://bit.ly/ZwTfoy
轻量级桌面虚拟化
Docker桌面:通过SSH运行一个内部Docker容器 http://bit.ly/14RYL6x

备注:以上链接需翻墙

相关资料:

  • Docker官网
  • Docker托管地址
  • Docker入门教程

推荐阅读:

俄罗斯搜索霸主Yandex推出基于Docker的开源PaaS服务Cocaine

超越Google,他企图将整个互联网塞进1台电脑

PaaS乱局:Container的新机遇

【MDCC专访】环信CEO刘俊彦:音视频即时通讯将成为技术壁垒 第十七届全国工程建设计算机应用大会在京召开,AMD受邀详解GPU Computing! 哪一门开发语言薪水最高? 借助ArangoDB,带你玩转Google图算法引擎Pregel 【最具价值CTO评选秀】MediaV CTO胡宁:技术女神的自我奋斗 豌豆荚邓草原:如何实现实时响应式平台 必须谨记!Node.js安全开发技巧 聚焦新平台新应用 IBM 2014技术峰会上海站顺利落幕 《近匠》NAGA娜迦信息:移动安全加固定制化 棱镜、飞流、TalkingData三方解读:手游如何高效运营 【MDCC秀场】枕戈待旦——秉持移动开发大潮下的主角思想 Netflix的首席产品官Neil Hun谈推荐系统打造和AWS实践 微信开放WiFi接口,醉翁之意在乎O2O还是大数据? 软硬整合:基于云的微型智能防丢设备Linquet 【MDCC专访】AppCan CTO赵庆华:助力企业快速移动化 使用Bluemix中的Rules服务构建一个酒店预订应用程序 基于IBM Bluemix开发微信公共账号应用 用Cloudant在Bluemix上构建一个简单的文字游戏应用程序 IBM Bluemix是什么? 【最具价值CTO评选秀】纷享销客CTO刘晨:企业移动的技术挑战 【最具价值CTO评选秀】能做存储的超级计算机——任宇翔和以色列团队的创业故事 OpenStack Swift存储策略 分享5个可视化的正则表达式编辑工具 在iOS程序中使用Bluemix云推送服务 GitHub开源任务列表组件 表白健身小能手!详解Apple Watch特色功能 高逼格不任性!个人智能航空摄影飞行设备ZANO Clappr——开源的Web视频播放器 东软举办2014解决方案论坛 将全面推进BBC战略 Google Glass已死,智能眼镜长存! 五个步骤,保护移动应用免受恶意攻击 IIS不能访问asp文件,只能访问html文件,而且网页中的所有弹出类网页链接全都打不开(在线等) 在JSP里边怎么动态插入文件 设计物流系统应该考虑那些问题,实现那些功能,拜托 设计物流系统应该考虑那些问题,实现那些功能,拜托 php中的register_globals为off,怎么获得url中传递参数 设计物流系统应该考虑那些问题,实现那些功能,拜托 上海日記:震撼 这是为什么? 在JBuilder 下 如何单步debug SOAP 服务器端程序? 求助:手机短信是以什么编码发送的呢?UTF还是普通的GB2312? 另外移动和联通用的编码一样么? 急求《c#高级编程》2nd 英文版! windows 2003 下我的p4x266e 板载声卡驱动好了,但是没有声音,怎么解决? SOS:菜鸟问题! 如何来判断字段类型????初级问题..... 求助:请问vbscript什么函数可以让一个单精度的数保留两位小数 wps2000加密文件问题 程序员调查 C/S下如何访问ODBC数据库,客户端不配置任何东西。 大家有何看法???????????? 程序在系统启动时起动,如何做? 局域網計算機間訪問問題﹐進來看看﹗﹗ 为什么我向数据库插入数字时总是出错? 做网页是用切片好做还是用表格好? ftp代码,求救 中秋节,你和MM咋过的,有过风花雪月的事吗? 庆祝升级!!!一夜间有多了一条裤衩,爽歪歪了 我想捕获特殊字段…………高分…… 如何在iframe中表格边框成虚线? Repeater模版列中如何动态添加checkbox控件? 局网能用,internet上该如何用? 请问如何将自已做的网站在sohu、sina上做链接?收费吗? 请问ID怎么传送!!! 传递参数?? 请教高手:码距、码字概念,请举例说明。 原来有朋友问过我流水号要怎样生成才好,今天把这个函数奉献给CSDN里的新手们! 在PHP中有没有表示“千分位”的函数呢?怎么实现呢 开发工时问题,有数据库开发经验者请进 想上一套抄表系统,熟悉的清介绍一下功能,构造以及价格 TListView出现List index out of bounds 错误 在html里面实现在线播放时怎么定制自己的界面?? 请问谁知道 Result中的getArray()怎么用?如何将得到的sql数组转换成String[]或int[]? 请问用xdoclet生成ejb存根类具体是怎么做的 求助:我想要一个在单文档中使用滚动条的例子,只要很简单的就行,谢谢! applet问题,找了很多论坛高手都没有人能解决! 如何取得客户端的ip 急问:怎样把从库中读取的文件保存在客户端指定的文件名? 高分求助,有没有人见过一个叫TTF160_TLB的pas或dcu文件?在哪儿可以找到 请教:BSTR如何正确使用 小弟初学delphi问个问题 大力救救我!!! 各位可不可以说说,大家在对录入的数据审核时,该如何实现???? 北通 蝙蝠DF和DE哪个好?有什么区别? 用列举法表示集合A={y|y=(|sinx|/sinx)+(cosx/|cosx|),x属于R且x≠kπ/2}=? {an}是等比数列,那么lg(an)是否一定是等差数列?如果不一定,请写出不一定的理由;如果一定,请给以证明. 描写维吾尔人载歌载舞时的热闹景象,记住是热闹景象! 已知集合A={x.log2(x-1) 根据在电视中见过的维吾尔人载歌载舞的情景,用一段话描述他们优美的舞姿 英语翻译QUOTE意思不是报价, 提起维吾尔旗,我们眼前就会浮现出他们载歌载舞.(修改病句)卷纸上的题,怀疑会不会有字印错了. 提起维吾尔族我们就会浮现出他们的载歌载舞修改病句 北京的英语角在哪?国贸附近有吗?想练练英语,希望大家给点意见,具体 在三里屯哪啊? 根据在电视中见过的维吾尔人载歌载舞的情景,用一段话描述一下他们优美的舞姿 阿根廷政府宣布萨缅托城铁完全由国家运英一新郎忘预约教堂 为遮丑谎称有炸弹俄总统普京要求市长们多上网杭州楼市进入大营销时代 商品房库存量浙江温岭村民收获“巨无霸”番薯 重达奶茶MM棒球帅气照 青春女神美翻了英国少年考好成绩卖关子 慈父见成绩单澳大利亚蓝山火情缓解 居民返家解救被美国小学大会上警察枪支走火 致3名儿美国就宠物食品安全发出警告 恐引发致女子梦游跌落地铁 幸得乘客跳下月台救中信银行总行营业部获评“小微企业金融石倚洁唱响星城贺岁第一声她,“中国造”的正能量不花电费的中央空调问世凉茶广告官司未了汽车限购不是万全之计蔡锷路迈腾今年累计销量逾17万辆“欢庆女神”降临长沙汽车有纠纷 商家来举证快乐舞蹈暗功秘典我是萨满大清中国红三界流浪记乾坤泣血逐修罗球星之天赋异能异界异域帝终神始臭名昭着密咒师蝴蝶谷旅游黎村苗寨旅游红叶谷旅游石泉老街旅游水磨镇旅游大政殿旅游文溯阁旅游十王亭旅游碧潭观鱼旅游哈尔登旅游胡雪岩纪念馆旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘