首页 文章 精选 留言 我的

精选列表

搜索[解释型编程语言],共10000篇文章
优秀的个人博客,低调大师

灾难恢复在云计算中的解释

云计算中的灾难恢复是一个相对较新的概念,并且像许多技术趋势一样,有很多炒作和错误的信息。在来自Jacob Gsoedl的“存储”杂志文章中,人们可以了解云计算的顶级灾难恢复问题,如安全和数据恢复,以及云中的灾难恢复是否是组织的不错选择等问题。 云计算,以及移动和平板设备,使人们步入了高科技的时代。但是当谈到是否有炒作时,云计算比人们认为的额更多,这产生了意想不到的后果,有时会超过它的实际效用。 虽然基于云计算的灾难恢复的概念(以及一些产品和服务)仍然是新兴的,但一些企业,特别是中小企业,正在发现并开始利用灾难恢复的云服务。它可能对于捆绑IT资源的公司是一个有吸引力的替代方案,因为的使用云服务的成本非常适合那些采用灾难恢复,其中基础设施服务器大多数时间空闲的企业。在云计算中部署灾难恢复站点可减少对数据中心空间,IT基础架构,以及IT资源的需求,从而大幅降低成本,使小型企业能够部署只能在大型企业中使用的灾难恢复选项。总部在马萨诸塞州米尔福德的企业战略集团(ESG)的高级分析师Lauren Whitehouse说:“基于云计算的灾难恢复将讨论从数据中心空间和硬件迁移到云容量规划。” 但是云计算中的灾难恢复并不是一个完美的解决方案,企业在投资之前需要清楚地了解它的缺点和挑战。安全通常位于关注列表的前列: ·数据是否安全地传输并存储在云计算中? ·如何验证用户? ·密码是唯一的选择,还是云计算提供商提供某种类型的双因素身份验证? ·云计算提供商是否满足法规要求? 并且因为云计算需要通过互联网访问,带宽需求也需要清楚地了解。只有规划带宽需求才能将数据迁移到云计算中,而没有对在灾难发生,时如何使数据可访问的充分分析存在风险: ·组织是否具有将所有用户重定向到云计算的带宽和网络容量? ·如果计划从云计算恢复到内部部署基础架构,恢复需要多长时间? 云计算备份服务和开源备份应用程序提供商Zmanda公司首席执行官兼创始人Chander Kant表示:“如果用户使用基于云计算的备份作为灾难恢复的一部分,需要设计备份集以进行恢复。” 其他关键考虑因素包括云计算提供商的可靠性,可用性以及在灾难进行期间为用户提供服务的能力。选择一个云服务提供商或管理服务提供商(MSP),可以在约定的条件下提供服务是至关重要的,而做出错误的选择可能不会让用户陷入IT地狱,但却很容易陷入困境。 在云端蓝图中设计灾难恢复 正如传统的灾难恢复一样,在云计算中没有一个单一的灾难恢复蓝图。每个企业在其运行的应用程序以及应用程序与其业务和其所在行业的相关性方面是独一无二的。因此,云计算灾难恢复计划(也称为云计算灾难恢复蓝图)对每个组织都非常具体和独特。 分类是用于推导传统和基于云计算的灾难恢复计划的首要原则。设计灾难恢复计划的过程始于识别应用程序,服务和数据并确定其优先级,并在出现重大业务影响之前为每个计算机确定可接受的停机时间。然后,优先级和所需的恢复时间目标(RTO)将确定灾难恢复方法。 在此过程中,识别关键资源和恢复方法是最相关的方面,因为企业需要确保所有关键应用程序和数据都包含在其蓝图中。同样,为了控制成本并在计划需要执行时确保快速和集中的恢复,企业需要确保忽略不相关的应用程序和数据。灾难恢复计划越集中,企业就越有可能定期测试并在定义的目标内执行。 通过识别和确定优先级的应用程序以及定义的RTO(恢复时间目标),企业可以确定实现RTO的最佳和最具成本效益的方法,这需要通过应用程序和服务来完成。在极少数情况下,企业将拥有一个适用于所有应用程序和数据的灾难恢复方法;更有可能会得到几个方法来保护应用程序和数据与类似的RTO集群。Acronis公司虚拟化实践经理Seth Goodling说:“成本和恢复目标的组合推动了不同级别的灾难恢复。” 在云选项中的灾难恢复 托管应用程序和托管和受灾难恢复。越来越受欢迎的选择是将主要生产和灾难恢复实例放入云计算中,并由管理服务提供商(MSP)处理。通过这样做,企业将获得云计算的所有优势,从基于使用的成本到消除内部部署基础设施。而不是自己实施,企业推迟灾难恢复到云或管理服务提供商。服务提供商的选择和谈判适当的服务级协议(SLA)的过程是至关重要的。通过将控制交给服务提供商,企业需要确保能够在主要实例和灾难恢复实例的定义SLA中提供不间断服务。StorageIO集团创始人,高级分析师Greg Schulz说:“服务级别协议与云计算提供商的相关性不能夸大,而SLA正在协商访问企业的应用程序。” 对于电子邮件和一些其他业务应用程序(如客户关系管理)来说,纯云游戏正变得越来越受欢迎,Salesforce.com一直是领先的云服务CRM市场领导者。 备份到云中并从云中灾难恢复。在这种方法中,应用程序和数据保持内部,数据被备份到云计算中,并在发生灾难时恢复到本地硬件上。换句话说,云计算中的备份成为基于磁带的异地备份的替代。 当考虑云备份和恢复时,清楚地了解备份和更有问题的恢复方面至关重要。备份到云计算是相对直接的,备份应用程序供应商已经扩展他们的备份套件,选择直接备份到流行的云服务提供商,如AT&T,亚马逊,微软公司,Nirvanix公司和Rackspace。CommVault系统公司工程联盟总监David Ngo说,“我们的云连接器将重复数据删除,压缩和加密的数据迁移到云计算中,并允许设置云计算中数据的保留时间,他们恰当地总结了企业应该查找的功能将数据移动到云中的产品。同样,云网关,如Cirtas Bluejet云存储控制器,F5ARX云扩展器,NasuniFiler,Riverbed Whitewater和Twin Strata Cloud Array,可用于将数据移动到云计算中。他们跨越内部部署和云存储,并保持云计算中的内部数据和数据同步。” 使用基于云计算的备份进行灾难恢复的具有挑战性的方面是恢复。由于要恢复的带宽有限且可能达到数TB,因此在定义的RTO内将数据恢复回本地可能是具有挑战性的。某些云备份服务提供商提供将数据还原到磁盘的选项,然后将其发送给客户以进行本地本地恢复。另一个选项是最近备份的大型本地缓存,可用于本地灾难恢复。 “我坚信备份需要是本地的,并从那里发送到云;换句话说,云计算备份成为企业的二次异地备份。”OS33公司基础设施部门总裁Jim Avazpour说。 另一方面,根据要恢复的数据,诸如压缩和更重要的是重复数据删除的功能可以使从云计算中的数据到内部部署基础设施的恢复成为可行的选择。一个很好的例子就是位于密歇根州的Rockford建筑公司,该公司使用Stor Simple设备对其Exchange和Share Point基础设施进行基于云的保护。“在灾难发生的情况下,我们将从云计算中提取虚拟机;通过Stor Simple的重复数据删除技术,我们几乎只能下载一个完整的虚拟机副本,而其他版本的差异则不同。”Rockford建筑公司IT副总裁Shaun Partridge说。 备份和恢复到云。在这种方法中,数据不会恢复回内部部署基础设施;相反,它被恢复到云中的虚拟机。这需要云存储和云计算资源,例如亚马逊的弹性计算云(EC2)。恢复可以在声明或连续(预先阶段)发生灾难时进行。通过预定恢复使预分阶段的DR虚拟机保持相对最新状态对于需要满足积极的RTO的情况至关重要。一些云服务提供商促进提供云虚拟机作为其DR产品的一部分。FalconStor软件公司企业解决方案副总裁ChrisPoelker说:“多家云服务提供商使用我们的产品进行安全的重复数据删除复制,并将服务器虚拟化到云中。 复制到云计算中的虚拟机。对于需要积极的恢复时间和恢复点目标(RPO)以及应用程序感知的应用程序,复制是选择的数据移动选项。复制到云计算的虚拟机可用于保护云和内部生产实例。 换句话说,复制适用于云计算的虚拟机到云计算的虚拟机和内部部署到云计算虚拟机数据保护。复制产品基于连续数据保护(CDP),例如CommVault连续数据复制器,快照或基于对象的云存储,如EMC Atmos或日立内容平台(HCP)。日立数据系统公司高级技术专家和高级总监内容服务主管Robert Primmer说:“云计算服务提供商Peak Web Hosting使本地HCP实例能够复制到Peak Web HCP实例,而不是另一个内部HCP实例。” 本文出处:畅享网 本文来自云栖社区合作伙伴畅享网,了解相关信息可以关注vsharing.com网站。

优秀的个人博客,低调大师

处理器Cortex的名词解释

ARM公司在经典处理器ARM11以后的产品改用Cortex命名,并分成A、R和M三类,旨在为各种不同的市场提供服务。 Cortex系列属于ARMv7架构,这是到2010年为止ARM公司最新的指令集架构。(在2011年,ARMv8架构在 TechCon上推出) ARMv7架构定义了三大分工明确的系列: “A”系列:面向尖端的基于虚拟内存的操作系统和用户应用;“R”系列:针对实时系统;“M”系列:对微控制器。 即:由于应用领域不同,基于ARMv7架构的Cortex处理器系列所采用的技术也不相同,基于ARMv7A的称为Cortex-A系列,基于ARMv7R的称为Cortex-R系列,基于ARMv7M的称为Cortex-M系列。 简单来说,Cortex就是ARM公司一个系列处理器的名称。比如英特尔旗下处理器有酷睿、奔腾、赛扬。 ARM在最初的处理器型号都用数字命名,最后一个是ARM11系列,在应用ARMv7架构后,推出了Cortex这一系列,老式的则命名为Classic系列。我的GitHub地址: https://github.com/heizemingjun 我的博客园地址: http://www.cnblogs.com/chenmingjun 我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun Copyright ©2018 黑泽明军 【转载文章务必保留出处和署名,谢谢!】

优秀的个人博客,低调大师

简短而有效的python queue队列解释

Queue.qsize() 返回队列的大小 Queue.empty() 如果队列为空,返回True,反之False Queue.full() 如果队列满了,返回True,反之False Queue.full 与 maxsize 大小对应 Queue.get([block[, timeout]])获取队列,timeout等待时间 Queue.get_nowait() 相当Queue.get(False) 非阻塞 Queue.put(item) 写入队列,timeout等待时间 Queue.put_nowait(item) 相当Queue.put(item, False) Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号 Queue.join() 实际上意味着等到队列为空,再执行别的操作

优秀的个人博客,低调大师

MaxCompute( 原ODPS)下的表分区解释

大数据计算服务(MaxCompute,原名 ODPS,https://www.aliyun.com/product/odps)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。MaxCompute 向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全。 ODPS分区字段一般来说都是重复性非常强的字段,比如说时间,某一天可能会产生几万条数据,把这一天产生的数据就存入到一个分区中,而时间(某天)就是分区字段,时间(某天)所在的列就是分区列。也就是说,基于分区列的数据作为一个纬度,进行了数据块的划分存储,加快查询速度。每一个分区块里面的数据是完整性的,而不是分区列里的一列或者几列数据。在ODPS中最多支持六级分区。也就是说partition by里面

优秀的个人博客,低调大师

(转载)iOS - layoutSubviews、drawRect、awakeFromNib和 loadNibNamed解释

原文地址:http://blog.csdn.net/xiaohe901216/article/details/50380625 awakeFromNib 当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的 awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNib 。 viewDidLoad 当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad。 layoutSubviews layoutSubviews方便数据计算,drawRect方便视图重绘。 layoutSubviews在以下情况下会被调用: 1、init初始化不会触发layoutSubviews。 2、addSubview会触发layoutSubviews。 3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。 4、滚动一个UIScrollView会触发layoutSubviews。 5、旋转Screen会触发父UIView上的layoutSubviews事件。 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。 7、直接调用setLayoutSubviews。 drawRect drawRect在以下情况下会被调用: 1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect 掉用是在Controller->loadView,?Controller->viewDidLoad?两方法之后掉用的.所以不用担心在 控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View?draw的时候需要用到某些变量 值). 2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。 3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。 4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。 以上1,2推荐;而3,4不提倡 ? drawRect方法使用注意点: 1、 若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate 的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay?或 者?setNeedsDisplayInRect,让系统自动调该方法。 2、若使用calayer绘图,只能在drawInContext:?中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法 3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来调用setNeedsDisplay实时刷新屏幕 initWithNibName initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的. initWithCoder initWithCoder 是一个类在IB中创建但在xocde中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xcode中通过 initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.或者是一个view的nib文件,类似方法创建时调用initWithCoder 关于 initWithNibName 和 loadNibNamed 的区别和联系 之所以要把这两者来一起讲,我觉的我也有点困惑,到底用那种?其实真正搞清楚了他们之间的差别,就不会这么迷惘了。因为这两个方法,根本就不是一路货色。 既然,是要说明这2个方法,那就着重将区别吧。 但是第一步,还是要罗嗦一下,他们的联系:可以使用此方法加载用户界面(xib文件)到我们的代码中,这样,可以通过操作这个加载进来的(xib)对象,来操作xib文件内容。 下面进入主题,谈区别: ShowViewController的initWithNibName方法 ShowViewController * showMessage = [[ShowViewController alloc] initWithNibName:@"ShowViewController" bundle:nil]; self.showViewController = showMessage; 2.VideoCellController的loadNibNamed方法 NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"SaveViewController" owner:self options:nil] ; self.showViewController = [nib lastObject]; [nib objectAtIndex:0]; 总结: 只看他们初始化,那可能感觉是一样的。但是如果,打开分别看xib的关系的时候,才恍然大悟,原来他们的集成类都不一样。 initWithNibName要加载的xib的类为我们定义的视图控制器类 2.加载方式不同 initWithNibName方法:是延迟加载,这个View上的控件是 nil 的,只有到 需要显示时,才会不是 nil loadNibNamed方法:即时加载,用该方法加载的xib对象中的各个元素都已经存在。 (认真理解这句帮规:when using loadNibNamed:owner:options:, the File's Owner should be NSObject, the main view should be your class type, and all outlets should be hooked up to the view, not the File's Owner.) initWithCoder和initWithFrame的区别 initWithoder 是当从nib文件中加载对象的时候会调用,比如你的view来自nib那么就会调用这个view的这个函数。(由框架调用) initWithFrame (是由用户调用,来初始化对象的)

优秀的个人博客,低调大师

Filebeat的架构分析、配置解释与示例

打开微信扫一扫,关注微信公众号【数据与算法联盟】 转载请注明出处: http://blog.csdn.net/gamer_gyt 博主微博: http://weibo.com/234654758 Github: https://github.com/thinkgamer 写在前边的话 在看filebeat之前我们先来看下Beats,Beats 平台是 Elastic.co 从 packetbeat 发展出来的数据收集器系统。beat 收集器可以直接写入 Elasticsearch,也可以传输给 Logstash。其中抽象出来的 libbeat,提供了统一的数据发送方法,输入配置解析,日志记录框架等功能。也就是说,所有的 beat 工具,在配置上,除了 input 以外,在output、filter、shipper、logging、run-options 上的配置规则都是完全一致的 而这里的filebeat就是beats 的一员,目前beat可以发送数据给Elasticsearch,Logstash,File,Console四个目的地址。filebeat 是基于原先 logstash-forwarder 的源码改造出来的。换句话说:filebeat 就是新版的 logstash-forwarder,也会是 ELK Stack 在 shipper 端的第一选择。 Filebeat的架构设计 当我们安装完filebeat之后,我们可以在filebeat的安装目录下看到两个文件 filebeat.template.json (输出的文件格式,在filebeat的template中指定,当服务启动时,会被加载) filebeat.yml(所有的配置都在该文件下进行) 整体架构理解: 上边我们也说了filebeat是用来收集日志的,那么在filebeat.yml中会配置指定的监听文件,也就是上图中的一个个log,这个log的目录是在prospectors中设置,在看配置文件的时候便可以很明白的看出来,对于prospectors定位每个日志文件,Filebeat启动harvester。每个harvester读取新的内容一个日志文件,新的日志数据发送到spooler(后台处理程序),它汇集的事件和聚合数据发送到你已经配置了Filebeat输出。 环境准备 要开始使用自己的Filebeat设置,安装和配置这些相关产品: Elasticsearch存储和索引数据。 Kibana为UI。 Logstash(可选)将数据插入到Elasticsearch。 具体配置可参考:http://blog.csdn.net/gamer_gyt/article/details/52654263 部署filebeat deb: curl -L -O https://download.elastic.co/beats/filebeat/filebeat_1.3.1_amd64.deb sudo dpkg -i filebeat_1.3.1_amd64.deb rpm: curl -L -O https://download.elastic.co/beats/filebeat/filebeat-1.0.1-x86_64.rpm sudo rpm -vi filebeat-1.0.1-x86_64.rpm mac: curl -L -O https://download.elastic.co/beats/filebeat/filebeat-1.3.1-darwin.tgz tar xzvf filebeat-1.3.1-darwin.tgz win: 下载windows zip文件 点击下载. 解压文件到 C:\Program Files. 重命名为 Filebeat. 打开PowerShell提示符作为管理员(右键单击PowerShell的图标,并选择以管理员身份运行)。如果您运行的是Windows XP,则可能需要下载并安装PowerShell 运行以下命令来安装Filebeat作为Windows服务 cd ‘C:\Program Files\Filebeat’ C:\Program Files\Filebeat> .\install-service-filebeat.ps1 在启动filebeat服务之前,需要先修改配置文件,接下来我们看下配置文件 配置解析 上边我么也说了FileBeat的四种输出方式为输出到Elasticsearch,logstash,file和console,下面我们具体看下示例 PS: 这里说的是需要修改的配置文件,没有提的就是不需要修改 每次修改完配置文件都需要重启filebeat服务 这里不要追究时间的问题,小主是测试,主要是为了方便记录 这里主要是自定义监听文件的路劲,我设置的是/opt/elk/log/*.log 然后在filebeat.yml中的prospectors路径设置如下(该配置为以下四种方式通用) paths: - /opt/elk/log/*.log 1:output of Elasticsearch filebeat.yml中output的配置将除了es之外注释掉 output elasticsearch: hosts: ["192.168.197.128:9200"] #es的ip地址和端口,如果有多个,中间用逗号分隔 worker: 1 #对应es的个数 index: "filebeat" #索引根名称 template: name: "filebeat" #模板名字和对应的json文件 path: "filebeat.template.json" max_retries: 3 #发送到特定logstash的最大尝试次数。如果达到该次数仍不成功,事件将被丢弃。默认是3,值0表示禁用重试。值小于0将无限重试知道事件已经发布。 bulk_max_size: 20000 #单个elasticsearch批量API索引请求的最大事件数。默认是50 timeout: 90 #elasticsearch请求超时事件。默认90秒 flush_interval: 5 #新事件两个批量API索引请求之间需要等待的秒数。如果bulk_max_size在该值之前到达,额外的批量索引请求生效。 往log文件中追加日志 echo “123456789” >> test1.log 这个时候我们看一下效果: 2:output of logstash filebeat.yml中output的配置将除了logstash之外注释掉 output: logstash: hosts: ["192.168.197.130:5044"] worker: 2 loadbalance: true index: filebeat 这里 worker 的含义,是 beat 连到每个 host 的线程数。 在 loadbalance 开启的情况下,意味着有 4 个worker 轮训发送数据 则对应的logstash配置,编写一个配置文件 sudo vim filebeat_logstash_out.conf beat 写入 Logstash 时,会配合 Logstash-1.5 后新增的 metadata 特性。将 beat 名和 type 名 记录在 metadata 里。所以对应的 Logstash 配置应该是这样: input { beats { port => 5044 } } output { elasticsearch { hosts => ["http://192.168.197.128:9200"] index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}" document_type => "%{[@metadata][type]}" } stdout{ codec=>rubydebug } } 启动conf bin/logstash -f config/filebeat_logstash_out.conf 往log文件中追加日志 echo “2222333344445555” >> test1.log 前往查看效果: 3:output of File filebeat.yml中output的配置将除了file之外注释掉 output: file: path: "/opt/elk/log/filebeat_output_file" filename: filebeat rotate_every_kb: 10000 number_of_files: 7 往log文件中追加日志: echo “this is filebeat output of file” >> test1.log 查看效果: 4:output of Console filebeat.yml中output的配置将除了cosnsole之外注释掉 output: console: pretty: true 重启启动服务: sudo filebeat -e -c /etc/filebeat/filebeat.yml 往log文件中追加日志: echo “this is filebeat output of console” >> test1.log 前往服务启动窗口查看效果: ELK+Filebeat的Demo 1:在/opt/elk/log目录下有三个文件分别是test1.log,test2.log,test3.log** 2:通过python脚本往三个文件中追加内容,内容格式如下: name age address company aa 23 beijing alibaba Python的脚本内容如下: #-*-coding:utf-8-*- name_list = ['aa','bb','cc','dd','ee'] addr_list = ['beijing','shanghai','guangzhou'] company_list =['baidu','tengxun','alibb'] import random import time def get_name(): return name_list[random.randint(0,4)] def get_age(): return random.randint(20,25) def get_addr(): return addr_list[random.randint(0,2)] def get_comp(): return company_list[random.randint(0,2)] if __name__=="__main__": while True: print("%s %s %s %s"%(get_name(),get_age(),get_addr(),get_comp())) str_line = get_name()+" "+str(get_age())+" "+get_addr()+" "+get_comp() import os os.system("echo %s >> test1.log" % str_line) time.sleep(1) 3:filebeat 的配置文件使用output=logstash filebeat.yml output: logstash: hosts: ["192.168.197.130:5044"] worker: 2 loadbalance: true index: filebeat 4:filebeat_logstash_out.conf input { beats { port => 5044 } } filter{ if [type] == 'log'{ grok{ match=>{ "message"=>"%{WORD:username} %{WORD:age} %{WORD:address} %{WORD:company}" } } } } output { elasticsearch { hosts => ["http://192.168.197.128:9200"] index => "%{[@metadata][beat]}-%{+YYYY.MM}" document_type => "%{[@metadata][type]}" } stdout{ codec=>rubydebug } } 5:启动服务 启动python脚本 启动conf配置文件 6:web查看结果 END 推荐一篇讲解配置含义的文章: http://www.ttlsa.com/elk/elk-beats-common-configure-section-describe/

优秀的个人博客,低调大师

Docker快速部署(实战型)

运维人员的解放----Docker快速部署 Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container) 作者:杨云1028来源:51CTO|2014-09-12 14:50 源贴:http://os.51cto.com/art/201409/451117.htm Docker是一个用了一种新颖方式实现的超轻量虚拟机,在实现的原理和应用上还是和VM有巨大差别,专业的叫法是应用容器(Application Container)。(我个人还是喜欢称虚拟机) Docker应用容器相对于VM有以下几个优点: 启动速度快,容器通常在一秒内可以启动,而VM通常要更久 资源利用率高,一台普通PC可以跑上千个容器,你跑上千个VM试试 性能开销小,VM通常需要额外的CPU和内存来完成OS的功能,这一部分占据了额外的资源 因为VM的Hypervisor需要实现对硬件的虚拟化,并且还要搭载自己的操作系统,自然在启动速度和资源利用率以及性能上有比较大的开销。 个人体会较深的两处优点: 1、快速部署,传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;Docker的部署模式是:复制->运行。 2、可以保证线上与测试环境一致,计划以后上线就直接复制测试使用的docker容器) 什么是docker? http://oilbeater.com/docker/2014/06/29/what-is-docker.html 为什么你应该关注docker? http://oilbeater.com/docker/2014/06/13/why-you-should-care-about-docker.html 1、docker安装 debian7安装docker 参考地址:http://www.webmaster.me/server/installing-docker-on-debian-wheezy-in-60-seconds.html echodebhttp://get.docker.io/ubuntudockermain|sudotee/etc/apt/sources.list.d/docker.listsudoapt-keyadv--keyserverkeyserver.ubuntu.com--recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9sudoapt-getupdatesudoapt-getinstall-ylxc-docker #四行命令,Docker就安装好了。下面创建一个ubuntu虚拟系统: dockerpullubuntu#此处是从官网拉取名为ubuntu的image,也可手动在https://index.docker.io上搜索想要的镜像。dockerrun-i-tubuntu/bin/bash#创建一个容器,-t是临时终端。 ubuntu12.04、windows、macOS安装docker 参考docker中文文档http://www.widuu.com/docker/ 2、docker使用过程实践 2.1在测试机启动容器,安装ssh dockerrun-i-tubuntu/bin/bash#此方式运行的容器,退出后容器就会关闭。apt-getinstallopenssh-server#安装ssh#需要修改/etc/sshd/sshd_config文件中内容PermitRootLoginyesUsePAMno 2.2启动ssh,容器以后台方式运行 dockerrun-d-p50001:22<容器id>/usr/sbin/sshd-D#容器id可通过dockerps-a查看,最上面的为最新的。 2.3通过ssh连接到容器安装软件 sshroot@127.0.0.1-p50001#连上后想装什么就装什么,可使用exit退出容器,但后台还会运行。 2.4服务安装完成后,停止容器。 dockerstop<容器id>#停止运行的容器 2.5把容器提交生成最新的镜像 dockercommit<容器id>debian02#把这个容器提交生成新的debian02镜像(该镜像是原始镜像与容器的整合) 2.6打包镜像 dockersavedebian02>/root/debian02.tar#debian02镜像打包 2.7在另外的机器上导入镜像 dockerload<debian02.tar#导入镜像dockerimages#查看存在的镜像 2.8启动容器 dockerrun-h="redis-test"--nameredis-test-d-p51000:22-p51001:3306-p51003:6379-p51004:6381-p51005:80-p51006:8000-p51007:8888debian02/etc/rc.local#此处是我测试机器启动命令,指定主机名与端口映射。#启动后,后面又装了程序,开机自启动命令可放在/etc/rc.local文件中。docker容器迁移简单方便,可以任意的拷贝部署,以后再也不怕新部署环境了,一堆依赖装的想死有木有。 3、关于docker容器的端口映射 由于docker容器的IP地址每次启动都会变,所以不适用于手动添加端口映射(难道每次重启都来查看容器的IP么?),所以需要每次启动容器时由docker程序自动添加NAT规则,前期尽可能的把需要映射的端口在创建容器时配置好,如下: dockerrun-h="activemq"--nameactivemq-d-p51000:22-p51001:3306-p51003:6379-p51004:6381-p51005:80-p51006:8000-p51007:8888debian/base/etc/rc.local#此处我把mysql,redis,nginx,ssh都进行了映射。 后续对于docker容器的管理,记住容器的名称,如上述名称是activemq,则使用docker stop,start来控制容器进程。 dockerstopactivemqdockerstartactivemq 当然,也可以不让docker每次启动容器修改容器的IP地址,参考如下: docker网络配置:http://www.open-open.com/lib/view/open1404896485747.html 4、关于docker容器的多程序开机自动运行 docker容器每次启动时,开机自启动的命令都要在启动容器前指定。如docker run -I -t debian /bin/bash命令,只会运行/bin/bash程序,其它的程序都不会运行,对于要跑多个程序的容器特别纠结。 多程序开机自动运行方法: 可把前面所说的启动命令换成dockerrun -I -t debian /etc/rc.local,在容器中把所有需要开机自的启动命令放在/etc/rc.local中,就可以达到多程序开机自启动了。 后台运行则是:docker run -d -p 50001:22 debian /etc/rc.local。注意:run命令是创建一个新的容器,如果要启动一个曾经运行过的容器,则用命令docker ps -a中找对应的容器ID,然后使用docker start <容器ID>即可。 5、关于docker容器和镜像的关系 无论容器里做什么操作,写文件,删文件。该容器的基本镜像都不会有任何改变。 这是因为Docker从父镜像建立增量镜像,只存储每个容器的更改。因此,如果你有一个300MB的父镜像,如果你在容器中安装了50MB的额外应用或服务,你的容器只有50MB,父镜像还是300MB。 但是可以使用Dockfile或commit命令来,把增量镜像和父镜像一起生成一个新的镜像。 commit使用: dockercommit<容器id><新镜像名称> Dockfile使用: root@yangrong:/data#catDockerfileFROMubuntu/testa#这是基础镜像CMD["/root/start.sh"]#这是启动命令root@yangrong:/data#dockerbuild-t<新镜像名>./ 关于Dockfile更多参数参考地址: http://www.tuicool.com/articles/FRvAbe http://www.colorscode.net/2014/01/04/howto-build-image-with-automatic-startup-ssh-service-from-dockerfile/ 6、docker参数详解 dockeruseageofdocker-D默认false允许调试模式(debugmode)-H默认是unix:///var/run/docker.socktcp://[host[:port]]来绑定或者unix://[/path/to/socket]来使用(二进制文件的时候),当主机iphost=[0.0.0.0],(端口)port=[4243]或者path=[/var/run/docker.sock]是缺省值,做为默认值来使用-api-enable-cors默认flase允许CORSheader远程api-b默认是空,附加在已存在的网桥上,如果是用'none'参数,就禁用了容器的网络-bip默认是空,使用提供的CIDR(ClasslessInter-DomainRouting-无类型域间选路)标记地址动态创建网桥(dcoker0),和-b参数冲突-d默认false允许进程模式(daemonmode)-dns默认是空,使docker使用指定的DNS服务器-g默认是"/var/lib/docker":作为docker使用的根路径-icc默认true,允许inter-container来通信-ip默认"0.0.0.0":绑定容器端口的默认Ip地址-iptables默认true禁用docker添加iptables规则-mtu默认1500:设置容器网络传输的最大单元(mtu)-p默认是/var/run/docker.pid进程pid使用的文件路径-r默认是true重启之前运行的容器-s默认是空,这个是docker运行是使用一个指定的存储驱动器-v默认false打印版本信息和退出 7、docker run命令详解 Usage:dockerrun[OPTIONS]IMAGE[:TAG][COMMAND][ARG...]Runacommandinanewcontainer-a=map[]:附加标准输入、输出或者错误输出-c=0:共享CPU格式(相对重要)-cidfile="":将容器的ID标识写入文件-d=false:分离模式,在后台运行容器,并且打印出容器ID-e=[]:设置环境变量-h="":容器的主机名称-i=false:保持输入流开放即使没有附加输入流-privileged=false:给容器扩展的权限-m="":内存限制(格式:<number><optionalunit>,unit单位=b,k,morg)-n=true:允许镜像使用网络-p=[]:匹配镜像内的网络端口号-rm=false:当容器退出时自动删除容器(不能跟-d一起使用)-t=false:分配一个伪造的终端输入-u="":用户名或者ID-dns=[]:自定义容器的DNS服务器-v=[]:创建一个挂载绑定:[host-dir]:[container-dir]:[rw|ro].如果容器目录丢失,docker会创建一个新的卷-volumes-from="":挂载容器所有的卷-entrypoint="":覆盖镜像设置默认的入口点-w="":工作目录内的容器-lxc-conf=[]:添加自定义-lxc-conf="lxc.cgroup.cpuset.cpus=0,1"-sig-proxy=true:代理接收所有进程信号(eveninnon-ttymode)-expose=[]:让你主机没有开放的端口-link="":连接到另一个容器(name:alias)-name="":分配容器的名称,如果没有指定就会随机生成一个-P=false:Publishallexposedportstothehostinterfaces公布所有显示的端口主机接口 8、docker常用命令总结 dockerpull<镜像名:tag>#从官网拉取镜像dockersearch<镜像名>#搜索在线可用镜像名 8.1查询容器、镜像、日志 dockertop<container>#显示容器内运行的进程dockerimages#查询所有的镜像,默认是最近创建的排在最上。dockerps#查看正在运行的容器dockerps-l#查看最后退出的容器的IDdockerps-a#查看所有的容器,包括退出的。dockerlogs{容器ID|容器名称}#查询某个容器的所有操作记录。dockerlogs-f{容器ID|容器名称}#实时查看容易的操作记录。 8.2删除容器与镜像 dockerrm$(dockerps-a-q)#删除所有容器dockerrm<容器名orID>#删除单个容器dockerrmi<ID>#删除单个镜像dockerrmi$(dockerimages|grepnone|awk'{print$3}'|sort-r)#删除所有镜像 8.3启动停止容器 dockerstop<容器名orID>#停止某个容器dockerstart<容器名orID>#启动某个容器dockerkill<容器名orID>#杀掉某个容器 8.4容器迁器 dockerexport<CONTAINERID>>/home/export.tar#导出cat/home/export.tar|sudodockerimport-busybox-1-export:latest#导入export.tar文件dockersavedebian>/home/save.tar#将debian容器打包dockerload</home/save.tar#在另一台服务器上加载打包文件 save和export的对比参考地址: http://www.fanli7.net/a/bianchengyuyan/C__/20140423/452256.html 8.5运行一个新容器 #运行一个新容器,同时为它命名、端口映射。以debian02镜像为例dockerrun-h="redis-test"--nameredis-test-d-p51000:22-p51001:3306-p51003:6379-p51004:6381-p51005:80-p51006:8000-p51007:8888debian02/etc/rc.local#从container中拷贝文件,当container已经关闭后,在里面的文件还可以拷贝出来。sudodockercp7bb0e258aefe:/etc/debian_version.#把容器中的/etc/debian_version拷贝到当前目录下。 8.6 docker Dockfile镜像制作 root@yangrong:/data#catDockerfileFROMubuntu/testa#这是基础镜像CMD["/root/start.sh"]#这是启动命令root@yangrong:/data#dockerbuild-t<新镜像名>./#生成新的镜像 Dockfile更多参数参考: http://www.tuicool.com/articles/FRvAbe http://www.colorscode.net/2014/01/04/howto-build-image-with-automatic-startup-ssh-service-from-dockerfile/ <完> 如有疑问,欢迎留言讨论。qq:10286460 原文链接:http://yangrong.blog.51cto.com/6945369/1551327 【编辑推荐】 运维堡垒机(跳板机)系统 python 专访又拍云邵海杨:自动化运维之路如何走 干货:基于网易的OpenStack部署运维实战 PHP开发的LVS管理系统:运维与开发的深思 开源工具Panamax大大简化Docker管理程序 本文转自rshare 51CTO博客,原文链接:http://blog.51cto.com/1364952/1958128,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册