首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Hadoop概念学习系列之版本变迁(六)

至2012年5月,Apache Hadoop的四大分支构成了四个系列的Hadoop版本。 1. 0.20.X系列 0.20.X系列版本是最令用户感到疑惑的,因为它们具有的一些特性,trunk上没有;trunk上有的一些特性,0.20.X系列版本却没有。 2. 0.21.0/0.22.X系列 在这一版本中,将整个Hadoop项目分割成三个独立的模块,分别是Common、HDFS和MapReduce。 其中,HDFS和MapReduce都对Common模块有依赖性,但是MapReduce对HDFS并没有依赖性。那么,这样的话,MapReduce可以更容易地运行其他分布式文件系统,同时,模块间可以独立开发。 Common模块:最大的新特性是在测试方面上添加了Large-Scale Automated Test Framework 和 Fault Injection Framework 。 HDFS 模块 :主要增加的新特性包括支持追加操作与建立符号连接、 Secondary NameNode 改进(Secondary NameNode 被剔除,取而代之的是 Checkpoint Node,同 时添加一个 Backup Node 的角色,作为 NameNode 的冷备)、允许用户自定义 block 放置算法等。 MapReduce 模块 :在作业 API 方面,开始启动新 MapReduce API,但老的 API 仍然 兼容。 3. 0.23.X系列 0.23.X 是为了克服 Hadoop 在扩展性和框架通用性方面的不足而提出来的。它实际上 是一个全新的平台,包括分布式文件系统 HDFS Federation 和资源管理框架 YARN 两部分, 可对接入的各种计算框架(如 MapReduce、Spark等)进行统一管理。它的发行版自带 MapReduce 库,而该库集成了迄今为止所有的 MapReduce 新特性。 4. 2.X系列 同 0.23.X 系列一样,2.X 系列也属于下一代 Hadoop。与 0.23.X 系列相比,2.X 系列增 加了 NameNode HA 和 Wire-compatibility 等新特性。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5058162.html,如需转载请自行联系原作者

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

学习笔记-ELK5安装X-Pack

elk5和之前的版本不太一样,他将之前的三方插件集成到了xpack中,想要使用高级功能,必须安装xpack这个插件,但是这个xpack确实让人很头疼,如果配置不正确,es是收不到logstash传来的数据的,更别提Kibana能展示他了,根本就搜不到索引名称。 一、elasticsearch5按这X-Pack的步骤: 1、elasticsearch安装X-Pack: 在每个集群节点的运行ES_HOME里运行bin/elasticsearch-plugin install x-pack,我这里使用的是yum安装,所以ES_HOME是/usr/share/elasticsearch/。 1 bin /elasticsearch-plugin install x-pack 允许X-Pack创建上面的一系列索引。 2、重启elastcsearch服务 1 systemctlrestartelasticsearch 二、Kibana安装X-Pack 1、安装xpack 进入Kibana的安装目录,这里使用的是yum安装,在/usr/share/kibana下面,运行一下命令,在线安装: 1 2 3 cd /usr/share/kibana bin /kibana-plugin install x-pack systemctlrestartkibana 2、配置Kibana配置文件 将配置文件中下面两项取消注释: 这一个细节必须注意,重中之重,不然Kibana会连接不上es,密码是默认的Kibana登录密码,后续可以修改。 1 2 elasticsearch.username: "elastic" elasticsearch.password: "changeme" 3、登录Kibana 在浏览器上访问http://localhost:5601会出现一下页面,但是会出现认证登录。 三、登录认证 官网是这么说的,安装X-Pack后需要认证,而默认帐号:elastic,密码:changeme 四、添加logstash配置文件 1、添加logstash测试文件 在/etc/logstash/conf.d下面写一个测试文件 1 2 3 4 5 6 7 8 9 10 11 input{ stdin{} } output{ elasticsearch{ hosts=> "10.1.12.169:9200" index=> "test-messages-%{+YYYY.MM.dd}" user=> 'elastic' #需要在添加帐号密码,不然无法将数据传输到elasticsearch上 password=> 'changeme' } } 2、测试文件是否可用 1 2 [root@elkconf.d] #logstash-f/etc/logstash/conf.d/test.conf-t ConfigurationOK 3、测试输入是否成功 测试成功可以打开文件,输入进行测试了 1 2 3 4 [root@elkconf.d] #logstash-f/etc/logstash/conf.d/test.conf [root@elkconf.d] #logstash-f/etc/logstash/conf.d/test.conf Thestdinpluginisnowwaiting for input: helloworld 测试中多顶着es、logstash的日志,出了问题知道错在哪! 技术水平有限,先这么着吧。 本文转自 wangpengtai 51CTO博客,原文链接:http://blog.51cto.com/wangpengtai/1910397,如需转载请自行联系原作者

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

Android自动化测试之Robotium学习(四)

上一篇遗留了两个问题:一、如何找到要测试的apk的包名和主类名。二、怎样对要测试的apk进行去签名,并且使用debug签名。 一、先解决第一个问题,如何找到要测试的apk的包名和类名。 你要是有程序的源码或者是在测试你自己写的程序,这样就很简单了,你可以很清楚的找到你要测试的程序的包名和主类名。但是,我们通常遇见的情况就是只有一个apk,就比如只有一个豌豆荚apk。 主要有一下三种方法:1)。把豌豆荚apk装到模拟器或者真机上,然后到eclipse里面查看Logcat界面,进入豌豆荚主界面,你会在Logcat里面找到AcativityManager一项,后面会显示出你的主界面的包名和类名。如下图所示。 2)。使用Hierarchy Viewer这个工具查看。这个是Android tools下的工具,在eclipse选项里也存在,在eclipse的选项“DDMS--Java”那个选项里可以看到。不过在eclipse里使用这个工具有时会连接不上真机,我一般都是单独使用“Hierarchy Viewer”这个工具。这个工具在你的android sdk安装路径下的tools文件包里,名字叫做“hierarchyviewer.bat”。我一般都是把它发送到桌面上一个快捷方式启动,方面连接。这个工具的使用也很简单。连上真机或者打开模拟器,然后双击启动这个工具,两分钟之后,你就会看到如下界面: 这里面会详细显示你操作的模拟器或真机对应的包名和类名。当然,你在真机或者模拟器上,第一次点击豌豆荚程序进入主界面,就能找到了豌豆荚apk的包名和主类名。 3)。使用一个debug去签名工具,也可以轻松找到你要测得apk的包名和主类名,截图如下: 这个工具的使用重点在于去签名,放在第二个问题重点来讲。 二、怎样对要测试的apk进行去签名,并使用debug签名 关于android程序签名,众所周知,Android系统要求所有的程序经过数字签名才能安装,如果没有可用的数字签名,系统将不许安装运行此程序,不管是模拟器还是真实手机,每一个android程序都要会有一个签名文件。我们使用robotium进行测试apk时,也必须要知道要测程序的签名文件,否则,就只能把程序去签名然后使用debug签名。 1)。如果你拥有程序的签名文件时,你怎么添加这个签名文件呢? 在eclipse里选中项目,然后点击eclipse上面的“Windows”选项,选择最后一项“Preference”,然后点击“Android”选项,点击“Build”项,进入如下界面: 然后点击“Custom debug keystore”选项后面的“Browse”按钮,找到你的要测试程序的原始签名文件,添加进去: 然后点击“Apply”,点击“OK”即完成了签名的添加。 2)。只有一个apk时,并且不知道它的签名文件时,该怎么办? 这时我们要用到一个重签名工具re-sign.jar,这是robotium官网提供的,下载地址为: http://www.troido.de/re-sign.jar.下载之后,右键这个工具,在“打开方式”里,选择“Java(TM) Platform SE binary”选项,打开之后,显示如下: 接下来,图中已经标明,把你的apk拖进去,显示如下: 选中一个保存位置,点击图中的“保存”按钮,完成之后。会弹出如下提示: 出现这个界面,说明你对你要测的apk已经重签名成功了,这里的签名方式是debug签名。除了对程序重签名成功外,你的意外收获就是,也找到了你要测的apk的包名和主类名,也就是第一个问题的第三种方法。 签名成功后,你就可以把这个经过debug签名的apk安装到真机或者模拟器上。然后,运行你的robotium测试程序进行测试。 至此,robotium的使用,从下载到安装,以及测试代码的配置,都已详细的给出,终于可以长吁了一口气,至少不像刚写第一篇时,那位午饭说的“标题党”了。。。。。。 以后会对robotium代码测试中的一些主要问题,做一些总结,敬请期待。 本文转自 风泊海上 51CTO博客,原文链接:http://blog.51cto.com/fengbohaishang/1001723

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

Android自动化测试之Robotium学习(二)

新建好测试程序之后,我们需要做的就是把Robotium这个包导入进你的工程里。这样才能跟Robotium关联起来。 首先要去官网下载Robotium版本包( http://code.google.com/p/robotium/downloads/list)。 现在最新的版本是3.4.1,不过我现在在用3.1版本,就以3.1版本为例说明。点击下载“robotium-solo-3.1.jar”选项,即为所需的robotium包,而“robotium-solo-3.1-javadoc.jar”为robotium的api文档包,下载解压之后如图: 打开index-all.html,即可看到robotium的各种方法,robotium只有一个类Solo,建立一个Solo对象,就可以用这个对象,调用所有的方法。 接着说导包的事情。下载完robotium包之后,进入eclipse,选中你的项目,右键,点击“Properties”选项,再点击“Resource”选项下的“Java Build Path”,选中“Librararies”选项:如下图: 此时,点击“Add External JARs…”选项,找到你的robotium包所在的位置,添加进去: 然后,再点击最后一个选项栏“Order and Export”选项,把下面的android api版本和你导入的robotium包选项都勾选,如图所示: 点击“OK”即可。 不过,有时会出现这种情况:就是你进入“Java Build Path”选项后,会多出来一个“Android Dependencies”选项,如下图所示: 此时,你要做的就是,选中“Android Dependencies”,点击右侧的“Remove”选项,把这个去掉,否则你的测试程序会出现错误。 到此为止,你已经把robotium包下载并导入到你的项目中去,然后就可以写你的robotium测试程序了,至于怎么配置你的代码文件,下篇会有详细代码给出讲解。 本文转自 风泊海上 51CTO博客,原文链接:http://blog.51cto.com/fengbohaishang/1001521

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

Android自动化测试之Robotium学习(三)

导入好robotium包之后,我们就可以在自己的工程中新建测试类进行测试。下面以我们开始建的RobotiumTest项目为例进行说明。 代码如下: packagecom.android.adb.test; importcom.jayway.android.robotium.solo.Solo; importandroid.test.ActivityInstrumentationTestCase2; public classTestRobotium extends ActivityInstrumentationTestCase2 { //此处为你要测试的 apk的包名,这里我测得是豌豆荚2 private static finalString TARGET_PACKAGE_ID="com.wandoujia.phoenix2"; //此处的 classname是你要测得 apk的主类名,也就是进入 apk第一个activity的类名 private static finalString LAUNCHER_ACTIVITY_FULL_CLASSNAME="com.wandoujia.phoenix2.NewWelcomeActivity"; private staticClass<?> launcherActivityClass; // 定义一个休眠时间 2000毫秒 private static final int Sleeptime1= 2000; static { try { launcherActivityClass= Class. forName( LAUNCHER_ACTIVITY_FULL_CLASSNAME); } catch(ClassNotFoundException e) { throw newRuntimeException(e); } } @SuppressWarnings("unchecked") //创建与测试类同名的构造方法 publicTestRobotium() { super( TARGET_PACKAGE_ID, launcherActivityClass); } //定义一个Solo对象 privateSolo solo; protected voidsetUp() throwsException { //创建进入测试 apk界面的方法 solo= newSolo(getInstrumentation(),getActivity()); } //这是自己定义的一个测试case,只是简单进入界面,点击一下两个选项 public voidtest_Watch_001(){ solo.sleep( Sleeptime1); solo.clickOnText("管理"); solo.sleep( Sleeptime1); solo.clickOnText("连接"); solo.goBack(); } //测试类结束的方法 public voidtearDown() throwsException { try { solo.finalize(); } catch(Throwable e) { e.printStackTrace(); } getActivity().finish(); super.tearDown(); } } 这是我以自己下载的豌豆荚apk为测试例子,里面的注释已经很清楚了,除了一个自己写的测试case外,其他的几个方法,像TestRobotium()、setUp()、tearDown()方法,都是测试必须的。 这里主要说明的就是,你要找到你要测试的apk的包名和主类名,这个是必须的,没有源码可以,但是你要找不到这两个,你的robotium测试就进行不下去了。如果你没有源码时,仅有一个apk,怎样找到这个apk的包名和主类名呢,有两种方法,先放在这里,稍后再说。 主类配置好后,你的robotium测试程序配置还没有完成,还需要配置一下你的测试程序的AndroidManifest.xml文件,这个大家肯定很熟悉了。 下面是我的文件代码: <?xml version="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.adb.test" android:versionCode="1" android:versionName="1.0"> <!-- 最小的 api版本 --> <uses-sdk android:minSdkVersion="14"/> <!-- 添加这一句是减少一些控件点击失效的情况 --> <supports-screens android:anyDensity="true"/> <!-- 下面的配置是关键,正确填写你要测试的 apk的包名--> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.wandoujia.phoenix2"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name"> <!-- 引用android中测试的包 --> <uses-library android:name="android.test.runner"/> </application> </manifest> 同样,代码已经给出了注释,这里最要注意的,也是要正确添加你要测试的包名,以及引用robotium测试包。 这个程序的配置是最基础的,是每个robotium测试程序必须有的,其他的不同就是根据你测试的apk不同,书写不同的测试case了。 配置好之后,就可以选中你的项目,右键,点击“Run as”选项,然后选择“Android Junit Test”选项,(不是“Android Application”选项),然后开始进行测试了。 注意!注意!这里有两个前提:一、你的模拟器或着真机中已经安装了这个你要测试的apk。(我的是豌豆荚)。二、你的apk已经去过签名了,并且使用的是debug签名,否则除非你知道你要测试程序的原始签名是什么。 关于签名,这也是一个很重要的问题,等到下篇进行详解。这里给出两张上面的豌豆荚Robotium case运行成功的图片: (case中的点击“管理”选项) (case中的点击“连接选项”) 本文转自 风泊海上 51CTO博客,原文链接:http://blog.51cto.com/fengbohaishang/1001583

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

android 自动化测试之MonkeyRunner学习(二)

上次说到已经配好了MonkeyRunner的运行环境,现在讲解怎么进行简单的MonkeyRunner测试。这个拖了很久才有时间和心情总结一下。真是计划赶不上变化啊。 就不说废话了。http://developer.android.com/tools/help/MonkeyDevice.html,这个地址是android上的MonkeyRunner官方文档地址。上面关于MonkeyRunner的一些方法说的很详细。本篇不是详细解释MonkeyRunner方法的文章,只是根据我的理解,结合自己的一个例子讲解一下怎么使用MonkeyRunner写测试程序。 MonkeyRunner工具共有三个类:MonkeyRunner、MonkeyDevice、MonkeyImage。 一、MonkeyRunnner类: 这个类主要用于把MonkeyRunner连接至真机或者模拟器,另外有个显示提示信息的alert方法和一个选择方法比较常用。 二、MonkeyImage类: 这个类主要是测试过程中,用来保存测试截图,把图片保存成各种格式,并且可以比较两个MonkeyImage对象。 主要常用的有两个方法:writeToFile(stringpath,stringformat),这个是保存截图的位置,和命名,可以把图片保存到sdcard里面,也可以保存到电脑里面;sameAs(MonkeyImageother,floatpercent),这个用来比较两个截图是否相同,结果为boolean值。 三、MonkeyDevice类: 这个类的方法就多了一下,主要提供了安装和卸载程序包、启动一个活动及操作键盘等事件的方法。像里面的startActivity(stringuri,stringaction,stringdata,stringmimetype,iterablecategoriesdictionaryextras,componentcomponent,flags)启动一个应用,press(stringname,dictionarytype)点击控件,touch(integerx,integery,integertype)点击控件(通过坐标定位),drag(tuplestart,tupleend,floatduration,integersteps)拖拉控件等等方法比较常用。 MonekeyRunner这个测试工具用起来不算太难,下面给出一段代码简单解释一下: FetionTest.py #coding=utf-8Python程序的第一句,添加这句使注释支持中文 #导入需要的MonkeyRunner的包,也可以是自己写的类,如果文件很多的话 fromcom.android.monkeyrunnerimportMonkeyRunner,MonkeyDevice,MonkeyImage #连接真机,里面要写正确自己的真机对应的名字,cmd下命令下,可以用adbdevices看到 devices1=MonkeyRunner.waitForConnection(5,"1234567890ABCDEF") #连接模拟器 devices2=MonkeyRunner.waitForConnection(5,"emulator-5554") #启动飞信的主界面,这是我测的飞信程序,里面主要是配好飞信的包名和启动Activity devices1.startActivity (component='cn.com.fetion/.android.ui.activities.StartActivity') devices2.startActivity (component='cn.com.fetion/.android.ui.activities.StartActivity') #休眠8秒,便于帐号的登录 MonkeyRunner.sleep(8.0) #点击我的好友一栏,这里使用的是坐标方法 devices1.touch(202,258,"DOWN_AND_UP") #选中好友 devices1.touch(222,326,"DOWN_AND_UP") devices1.touch(442,325,"DOWN_AND_UP") #点击“加入黑名单” devices1.touch(223,563,"DOWN_AND_UP") #下面是进行截图,和保存图片 result1=device1.takeSnapshot() result1.writeToFile('E:\slack01.png','png') #点击返回键,可以找到模拟器上任何一个建对应的关键值,这个在官方文档里可以查到 device1.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP) result2=device1.takeSnapshot() result2.writeToFile('E:\slack02.png','png') 这个程序就简单说这些,另外可以对自己的程序进行优化,可以把不同的测试case封装到一个方法里,也可以把一些配置设置成全局变量,然后在不同的类里进行调用。这些需要简单了解一下Python的编程知识。 下面说一个比较好用的获取坐标的工具。就是用来获取真机上坐标的工具,当我们点击真机上的空间时,能显示真机上的点击点的坐标。 这个是一个可以自己定义的python文件,只有几句话: fromcom.android.monkeyrunnerimportMonkeyRunnerasmr fromcom.android.monkeyrunner.recorderimportMonkeyRecorderasrecorder #里面添加你的真机的名字 device=mr.waitForConnection(5,"MSM8225QRD5") recorder.start(device) 比如,我把它定义为monkey_recorder.py,然后放在G盘,在cmd下运行monkeyrunnermonkey_recorder.py,就会出现如下界面: 当我们在这个工具上点击时,真机也会跟着执行,并且会显示每一步我们点击的位置的坐标,比如,我点击打开音乐播放器会记录如下: 这个工具的好只有处你用过几次才知道的,呵呵,反正有些应用程序里很小的图标只能通过坐标获取点击事件,这个工具的优势就显示出来了。另外,需要注意,这个是不能用来获取模拟器坐标的,模拟器上的坐标只有自己下个截图工具,来量取坐标了。这一点确实很蛋疼。 软件工具都是这样,没有绝对的便利。MonkeyRunner也不例外。呵呵,这一次就写这么多吧,这个工具简单的使用介绍的也差不多了,更多的还需要自己去摸索,熟能生巧嘛。希望大家能多多分享,多多交流。 本文转自 风泊海上 51CTO博客,原文链接:http://blog.51cto.com/fengbohaishang/962705

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

Android自动化测试之Robotium学习(一)

Robotium是android测试中一个简单而又强大的工具。说它简单,是因为Robotium是基于Android测试框架InstrumentationTestCase2进行的2次封装,把一些基本操作又简化了一遍,它的文档只有一个Solo类,而且配置步骤是固定的几步。说它强大是因为,它在有源码是可以测试源码,进行白盒测试。没有源码时,只有一个应用程序的apk也可以对其进行黑盒测试。而且对程序上的每一个按钮,文本控件,图像,等都可以捕捉到,既可以使用按钮显示的名字进行点击,也可以使用坐标进行点击。 现在开始讲解怎样创建一个Robotium测试项目。 一、有源码时 先把程序源码导入到eclipse里面。然后在eclipse里面右键,点击“New”进入创建Android项目界面,如下图:(我的更新到android 4.1,里面的“Android Application Project”就是以前的“Android Project”). 然后,选择“Android Test Project”,注意不是“Android Application Project”,因为你创建的是测试项目,不是应用项目,里面的界面性的资源是用不到的,当然你误选择了“Android Application Project”,到后面通过配置还是可以进行测试的,只是会添加进很多没有用的资源。 点击“Next”,输入一个你的测试项目的名字:(比如RobotiumTest)。 点击“Next”,出现下面这个界面: (图3) 注意:这个界面是一个分水岭,如果你有要测试的源码时,你就点击“An existing Android project”选项,然后选择你要测试的源码,比如图中的“Nothing”,然后,点击“Next”,进入你Android api版本选择界面: 然后选择你需要的api版本,点击“Finish”即可。 二、无源码时: 这是最常见的一种情况。通常我们测试人员测试时,都是只有一个程序的apk,源码很少能见到,我们也没必要一定要有源码,甚至没有程序的签名也可以进行,当然这在后面会详细介绍。 接着上面的说,没有源码时,创建程序就如图(3)中,选择“This Project”选项,点击“Next”,同样进入android api选择界面,选择好你要用到的api版本,点击“Finish”选项,即可完成项目的创建。 如上图所示,只是一个空的android测试项目,不是应用项目,里面没有activity,布局文件等。肯定有人会问,这跟robotium有什么关系,没有看到一点robotium的影子,这话说的没错,现在这个项目跟robotium没一点关系。只是限于篇幅,不能一言道尽,欲知详情,且看下篇详解。 本文转自 风泊海上 51CTO博客,原文链接:http://blog.51cto.com/fengbohaishang/999764

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

docker学习笔记(一)——centos7 安装docker

Docker 最低支持 CentOS 7, 推荐Centos7.3版本 配置yum源 1 2 3 4 5 6 7 #tee/etc/yum.repos.d/docker.repo<<-'EOF'[dockerrepo] name=DockerRepository baseurl=https: //yum .dockerproject.org /repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https: //yum .dockerproject.org /gpg EOF 安装 Docker 更新yum软件源缓存,并安装docker-engine。 1 2 #yumupdate #yuminstalldocker-engine 启动 Docker 引擎 1 2 #systemctlenabledocker #systemctlstartdocker 以上就安装完了docker 本文转自 jackjiaxiong 51CTO博客,原文链接:http://blog.51cto.com/xiangcun168/1957360

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

docker学习笔记(三)——创建自定义镜像

首先拉取一个镜像,在这里以NGINX为例 1 2 3 4 [root@DockServeropt] #dockerpullnginx [root@DockServeropt] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE nginxlatestb8efb18f159b3weeksago107MB 启动NGINX镜像,映射出端口 1 2 3 4 5 [root@DockServeropt] #dockerrun--namewebserver-d-p80:80nginx 8f62585b370ca34eb8c438adbab0f972e1990cee25000a742c6a2d8e7ee7ba38 [root@DockServeropt] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 8f62585b370cnginx "nginx-g'daemon..." 6secondsagoUp6seconds0.0.0.0:80->80 /tcp webserver 访问端口,直接用命令行访问, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@DockServeropt] #curlhttp://127.0.0.1 <!DOCTYPEhtml> <html> < head > <title>Welcometonginx!< /title > <style> body{ width:35em; margin:0auto; font-family:Tahoma,Verdana,Arial,sans-serif; } < /style > < /head > <body> <h1>Welcometonginx!< /h1 > <p>Ifyouseethispage,thenginxwebserverissuccessfullyinstalledand working.Furtherconfigurationisrequired.< /p > <p>Foronlinedocumentationandsupportpleasereferto <ahref= "http://nginx.org/" >nginx.org< /a >.<br/> Commercialsupportisavailableat <ahref= "http://nginx.com/" >nginx.com< /a >.< /p > <p><em>Thankyou for usingnginx.< /em >< /p > < /body > < /html > 可以看到能够访问在nginx docker里的东东了,下面我们修改下首页内容 进入nginx docker 里面进行修改 1 2 3 4 5 进入docker [root@DockServeropt] #dockerexec-itwebserverbash root@8f62585b370c:/ #echo'<h1>Hello,Docker!</h1>'>/usr/share/nginx/html/index.html root@8f62585b370c:/ #exit exit 再次访问看看 1 2 [root@DockServeropt] #curlhttp://127.0.0.1 <h1>Hello,Docker!< /h1 > 可以看出,已经修改成功,我们保存成镜像 1 2 3 4 5 6 7 8 9 10 11 12 [root@DockServeropt] #dockercommit--author"DingJin<dingjin@gmail.com>"--message"修改nginx默认网页"webserverwebserver:v2 sha256:ca35d11b57bac6e3e4ebab15aaff528c8530f7f5e59e00f58fa61e86edf1aa91 [root@DockServeropt] #dockerimages REPOSITORYTAGIMAGEIDCREATEDSIZE webserverv2ca35d11b57ba6secondsago107MB nginxlatestb8efb18f159b3weeksago107MB 已经可以看到webserver:v2镜像了,运行下 [root@DockServeropt] #dockerrun--nameweb2-d-p81:80webserver:v2 1647edeba49aa664c0ccf642248f6b30b36c6b08990ede580a5803f1a59ae545 [root@DockServeropt] #curlhttp://127.0.0.1:81 <h1>Hello,Docker!< /h1 > 可以了解以下命令, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 查看webserver做了哪些更改,即和源镜像对比不同 [root@DockServeropt] #dockerdiffwebserver C /root A /root/ .bash_history C /run A /run/nginx .pid C /var C /var/cache C /var/cache/nginx A /var/cache/nginx/uwsgi_temp A /var/cache/nginx/client_temp A /var/cache/nginx/fastcgi_temp A /var/cache/nginx/proxy_temp A /var/cache/nginx/scgi_temp C /usr C /usr/share C /usr/share/nginx C /usr/share/nginx/html 查看webserver:v2历史文件变动记录 [root@DockServeropt] #dockerhistorywebserver:v2 IMAGECREATEDCREATEDBYSIZECOMMENT ca35d11b57ba4minutesagonginx-gdaemonoff;98B修改nginx默认网页 b8efb18f159b3weeksago /bin/sh -c #(nop)CMD["nginx""-g""daem...0B <missing>3weeksago /bin/sh -c #(nop)STOPSIGNAL[SIGTERM]0B <missing>3weeksago /bin/sh -c #(nop)EXPOSE80/tcp0B <missing>3weeksago /bin/sh -c ln -sf /dev/stdout /var/log/ngi ...0B <missing>3weeksago /bin/sh -capt-getupdate&&apt-getinst...52.2MB <missing>3weeksago /bin/sh -c #(nop)ENVNJS_VERSION=1.13.3....0B <missing>3weeksago /bin/sh -c #(nop)ENVNGINX_VERSION=1.13....0B <missing>3weeksago /bin/sh -c #(nop)MAINTAINERNGINXDocker...0B <missing>3weeksago /bin/sh -c #(nop)CMD["bash"]0B <missing>3weeksago /bin/sh -c #(nop)ADDfile:fa8dd9a679f473a...55.2MB 结合上篇,我们上传到本地私有仓库,然后就直接可以在本地调用了~~ 本文转自 jackjiaxiong 51CTO博客,原文链接:http://blog.51cto.com/xiangcun168/1957431

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

Android学习笔记--Android开发时常用控件(三)

ProgressBar(进度条) ListView(很重要的显示控件) 例:<ProgressBarandroid:id="@+id/pBar" Style="?Android:attr/progressBarStyleHorizontal"--水平方向的进度条 Android:layout_width="200dp" Android:layout_height="wrap_content" Android:visibility="gone" Android:max=200 /> 代码:1.声明变量 2.根据ID取得控件对象findViewById 3.设置监听类 ClassButtonLinstenerimplementsOnClickListener{ PublicvoidonClick(Viewv){ If(i==0){ pBar.setVisibility(View.VISIBLE); } Elseif(i<pBar.getMax()){ pBar.setProgress(i);--设置主进度条的当前值 pBar.setSecondaryProgress(i+10);--设置第二进度条的当前值 } Else{ pBar.setVisbility(View.GONE); } I=i+10; } } 4.绑定事件 myButton.setOnClickListener(newButtonLinstener()); 例:main布局文件 <ListViewandroid:id="@id/android:list" Android:layout_width="fill_parent" Android:layout_height="wrap_content" Android:drawSelecrorOnTop="false" Android:scrollbars="vertical"/> User布局文件略(两个TextView) 代码:publicclassActivityextendsListActivity{ super.onCreate(savedInstanceState); setContentView(R.layout.main); //用一个集合对象装数据 ArrayList<HashMap<Stirng,String>>list=newArrayList<HashMap<Stirng,String>>(); HashMap<String,String>Map1=newHashMap<String,String>(); HashMap<String,String>Map2=newHashMap<String,String>(); HashMap<String,String>Map3=newHashMap<String,String>(); Map1.put("user_name","zhangsan"); Map1put("user_ip","192.168.0.1"); Map2.put("user_name","lisi"); Map2.put("user_ip","192.168.0.2"); Map3.put("user_name","wangwu"); Map3.put("user_ip","192.168.0.3"); List.add(Map1); List.add(Map2); List.add(Map3); //listActivity对象,map,第二个布局文件,对应hashMap的值对(可想象成列),控件显示的位置 SimpleAdapterlistAdapter=newSimpleAdapter(this,list,R.layout.user,newString[]{"user_name","user_ip"},newint[]{R.id.user_ip,R.id.user_name}); setListAdapter(listAdapter); } //重写 ProtectedvoidonListItemClick(ListViewlv,Viewv,intposition,longid){ super.onListItemClick(1,v,position,id); System.out.println("id--------"+id); System.out.println("position-------"+position) } 本文转自My_King1 51CTO博客,原文链接:http://blog.51cto.com/apprentice/1360573,如需转载请自行联系原作者

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

开始学习Docker啦--容器理论知识(一)

一、容器核心技术 一谈到容器,我们都会想到 Docker。 Docker 现在几乎是容器的代名词。确实,是 Docker 将容器技术发扬光大。同时,我们也需要知道围绕 Docker 还有一个生态系统。Docker 是这个生态系统的基石,但完善的生态系统才是保障 Docker 以及容器技术能够真正健康发展的决定因素。 1、容器规范 容器不光是 Docker,还有其他容器,比如 CoreOS 的 rkt。为了保证容器生态的健康发展,保证不同容器之间能够兼容,包含 Docker、CoreOS、Google在内的若干公司共同成立了一个叫 Open Container Initiative(OCI) 的组织,其目是制定开放的容器规范。 2、容器 runtime runtime 是容器真正运行的地方。runtime 需要跟操作系统 kernel 紧密协作,为容器提供运行环境。 lxc、runc 和 rkt 是目前主流的三种容器 runtime。 lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作为 runtime。 runc 是 Docker 自己开发的容器 runtime,符合 oci 规范,也是现在 Docker 的默认 runtime。 rkt 是 CoreOS 开发的容器 runtime,符合 oci 规范,因而能够运行 Docker 的容器。 3、容器管理工具 光有 runtime 还不够,用户得有工具来管理容器啊。容器管理工具对内与 runtime 交互,对外为用户提供 interface,比如 CLI。这就好比除了 JVM,还得提供 java 命令让用户能够启停应用不是。 lxd 是 lxc 对应的管理工具。 runc 的管理工具是 docker engine。docker engine 包含后台 deamon 和 cli 两个部分。我们通常提到 Docker,一般就是指的 docker engine。 rkt 的管理工具是 rkt cli。 4、容器定义工具 容器定义工具允许用户定义容器的内容和属性,这样容器就能够被保存,共享和重建。 docker image 是 docker 容器的模板,runtime 依据 docker image 创建容器。 dockerfile 是包含若干命令的文本文件,可以通过这些命令创建出 docker image。 ACI (App Container Image) 与 docker image 类似,只不过它是由 CoreOS 开发的 rkt 容器的 image 格式。 5、Registry 容器是通过 image 创建的,需要有一个仓库来统一存放 image,这个仓库就叫做 Registry。 Docker Hub(https://hub.docker.com) 是 Docker 为公众提供的托管 Registry,上面有很多现成的 image,为 Docker 用户提供了极大的便利。 Quay.io(https://quay.io/)是另一个公共托管Registry,提供与 Docker Hub 类似的服务。 6、容器 OS 由于有容器 runtime,几乎所有的 Linux、MAC OS 和 Windows 都可以运行容器。但这不并没有妨碍容器 OS 的问世。 容器 OS 是专门运行容器的操作系统。与常规 OS 相比,容器 OS 通常体积更小,启动更快。因为是为容器定制的 OS,通常它们运行容器的效率会更高。 目前已经存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的杰出代表。 二、说说容器 1、什么是容器 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。 Containers vs. virtual machines 容器在 Host 操作系统的用户空间中运行,与操作系统的其他进程隔离。这一点显著区别于的虚拟机。 传统的虚拟化技术,比如 VMWare, KVM, Xen,目标是创建完整的虚拟机。为了运行应用,除了部署应用本身及其依赖(通常几十 MB),还得安装整个操作系统(几 GB)。 Virtual Machine diagramContainer diagram 由于所有的容器共享同一个 Host OS,这使得容器在体积上要比虚拟机小很多。另外,启动容器不需要启动整个操作系统,所以容器部署和启动速度更快,开销更小,也更容易迁移。 Containers and Virtual Machines Together 2、为什么使用容器 如今的系统在架构上较十年前已经变得非常复杂了。以前几乎所有的应用都采用三层架构(Presentation/Application/Data),系统部署到有限的几台物理服务器上(Web Server/Application Server/Database Server)。 而今天,开发人员通常使用多种服务(比如 MQ,Cache,DB)构建和组装应用,而且应用很可能会部署到不同的环境,比如虚拟服务器,私有云和公有云。 一方面应用包含多种服务,这些服务有自己所依赖的库和软件包;另一方面存在多种部署环境,服务在运行时可能需要动态迁移到不同的环境中。这就产生了一个问题: 如何让每种服务能够在所有的部署环境中顺利运行? 聪明的技术人员从传统的运输行业找到了答案。 几十年前,运输业面临着类似的问题。 每一次运输,货主与承运方都会担心因货物类型的不同而导致损失,比如几个铁桶错误地压在了一堆香蕉上。另一方面,运输过程中需要使用不同的交通工具也让整个过程痛苦不堪:货物先装上车运到码头,卸货,然后装上船,到岸后又卸下船,再装上火车,到达目的地,最后卸货。一半以上的时间花费在装、卸货上,而且搬上搬下还容易损坏货物。 幸运的是,集装箱的发明解决这个难题。 打一个比方,集装箱(容器)对于远洋运输(应用运行)来说十分重要。集装箱(容器)能保护货物(应用),让其不会相互碰撞(应用冲突)而损坏,也能保障当一些危险货物发生规模不大的爆炸(应用崩溃)时不会波及其它货物(应用)但是把货物(应用)装载在集装箱(容器)中并不是一件简单的事情。而出色的码头工人(Docker)的出现解决了这一问题。它(Docker)使得货物装载到集装箱(容器)这一过程变得轻而易举。对于远洋运输(应用运行)而言,用多艘小货轮(虚拟机)代替原来的大货轮(实体机)也能保证货物(应用)彼此之间的安全,但是和集装箱(容器)比,成本过高,但适合运输某些重要货物(应用)。 任何货物,无论钢琴还是保时捷,都被放到各自的集装箱中。集装箱在整个运输过程中都是密封的,只有到达最终目的地才被打开。标准集装箱可以被高效地装卸、重叠和长途运输。现代化的起重机可以自动在卡车、轮船和火车之间移动集装箱。集装箱被誉为运输业与世界贸易最重要的发明。 Docker 将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker 可以将任何应用及其依赖打包成一个轻量级、可移植、自包含的容器。容器可以运行在几乎所有的操作系统上。 其实,“集装箱” 和 “容器” 对应的英文单词都是 “Container”。 “容器” 是国内约定俗成的叫法,可能是因为容器比集装箱更抽象,更适合软件领域的原故吧。 3、容器的优势 对于开发人员 容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。 对于运维人员 只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。 注:部分内容参照文章《每天五分钟玩转Docker容器技术》 本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/2044331,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册