首页 文章 精选 留言 我的

精选列表

搜索[知识库管理],共10000篇文章
优秀的个人博客,低调大师

android 中resources管理

主要存在于res/value文件夹中 定义: dimen.xml:主要用于设置像素默认值 <resources> res/values/dimens.xml <dimen name="sp_12">12sp</dimen> <dimen name="sp_13">13sp</dimen> <dimen name="dip_40">40dip</dimen> <dimen name="dip_45">45dip</dimen> </resources> 代码使用: int width=getContext().getResources().getDimension(R.dimen.tab_width); xml文件使用: android:layout_width="@dimen/tab_width" color.xml设置颜色 <?xml version="1.0" encoding="utf-8"?> <resources> <item type="drawable" name="main_background">#FFE7E7E7</item> <item type="drawable" name="newslist_item_background">#FFE7E7E7</item> <item type="color" name="white">#FFFFFFFF</item> <item type="color" name="category_title_normal_background">#FFADB2AD</item> <item type="color" name="gold">#b89766</item> <item type="color" name="transparent">#000000</item> <item type="color" name="textcolor">#FFFFFF</item> <item type="color" name="bgcolor">#000000</item> </resources> 或 <?xml version="1.0" encoding="UTF-8"?> <resources> <color name="contents_text">#ff000000</color> <color name="encode_view">#ffffffff</color> <color name="possible_result_points">#c0ffff00</color> <color name="result_points">#c000ff00</color> <color name="result_text">#ffffffff</color> <color name="result_view">#b0000000</color> <color name="share_text">#ff000000</color> <color name="status_view">#50000000</color> <color name="status_text">#ffffffff</color> <color name="transparent">#00000000</color> <color name="viewfinder_frame">#ff000000</color> <color name="viewfinder_laser">#ffff0000</color> <color name="viewfinder_mask">#60000000</color> <color name="red">#ffff0000</color> <color name="blue">#ff3590c4</color> <color name="green">#7700ff00</color> <color name="yellow">#ffff7000</color> <color name="screen_background_white">#00ffffff</color> <color name="translucent_background">#00000000</color> <color name="white_background">#00ffffff</color> <color name="gray_background">#fff7f7f7</color> <color name="solid_red">#ffff0000</color> <color name="solid_while">#ff888888</color> <color name="solid_saffron">#ffff6414</color> <color name="solid_blue">#ff0000ff</color> <color name="solid_green">#ff00ff00</color> <color name="solid_yellow">#ffffff00</color> <color name="saffron">#ffffa649</color> <color name="titlebackgroundcolor">#fffe8625</color> <color name="listitem_divide">#ffd4d3d3</color> <color name="gray">#ff666664</color> <color name="deep_gray">#ff555555</color> <color name="light_gray">#ff757575</color> <color name="btn_focused_color_yellow">#fffdfdfd</color> <color name="btn_pressed_color_light">#fffdfdfd</color> <color name="btn_default_color_light">#ffff5f11</color> <color name="rounded_container_border">#ffb7babb</color> <color name="base_start_color_default">#ffffffff</color> <color name="base_end_color_default">#ffffffff</color> <color name="base_start_color_pressed">#ffff7a13</color> <color name="base_center_color_pressed">#ffff8c2f</color> <color name="base_end_color_pressed">#ffffa254</color> <color name="text_color_default">#ff000000</color> <color name="text_color_pressed">#ffffffff</color> </resources> 调用color标签:android:background="@color/red"@color/是调用res/下的匹配的color标签 也可以将color标签嵌入到selector的item标签中使用 <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true"android:color="@color/red"/><item android:color="@color/green" /></selector> 代码设置color方法: testview.setTextColor(Color.parseColor("FFFFFF")); testview.setTextColor(Color.GRAY); tv.setTextColor(Color.rgb(255,255,255)); testview.setTextColor(getContext().getResources().getColor(R.color.my_color)); array.xml <resources> <declare-styleable name="DragSort"> <attr name="collapsed_height" format="dimension" /> <attr name="drag_scroll_start" format="float" /> <attr name="max_drag_scroll_speed" format="float" /> <attr name="float_background_color" format="color" /> <attr name="remove_mode"> <enum name="clickRemove" value="0" /> <enum name="flingRemove" value="1" /> </attr> <attr name="track_drag_sort" format="boolean" /> <attr name="float_alpha" format="float" /> <attr name="slide_shuffle_speed" format="float" /> <attr name="remove_animation_duration" format="integer" /> <attr name="drop_animation_duration" format="integer" /> <attr name="drag_enabled" format="boolean" /> <attr name="sort_enabled" format="boolean" /> <attr name="remove_enabled" format="boolean" /> <attr name="drag_start_mode"> <enum name="onDown" value="0" /> <enum name="onMove" value="1" /> <enum name="onLongPress" value="2" /> </attr> <attr name="drag_handle_id" format="integer" /> <attr name="fling_handle_id" format="integer" /> <attr name="click_remove_id" format="integer" /> <attr name="use_default_controller" format="boolean" /> </declare-styleable> </resources> 代码使用: TypedArray array = getContext().obtainStyledAttributes(attrs, R.styleable.DragSort, 0, 0); mItemHeight = Math.max(1, array.getDimensionPixelSize(R.styleable.DragSortListView_collapsed_height, 1)); mTrackDragSort = array.getBoolean( R.styleable.DragSortListView_track_drag_sort, false); xml使用: <ListPreference android:title="@string/page_animation" android:defaultValue="@string/default_page_animation" android:entries="@array/page_animation_labels" android:entryValues="@array/page_animations" android:key="pageAnimation" /> strings.xml:主要设置文本 <resources> <string name="button_confirm">确定</string> <string name="button_cancel">取消</string> <string-array name="page_animations"> <item>100</item> <item>0</item> <item>1</item> <item>2</item> <item>3</item> </string-array> </resources> 代码使用: testview.setText(getString(R.string.button_confirm)); xml使用: android:text="@string/button_confirm" 风格style与主题theme区别: 1:style主要用于View,theme主要用于Activity以及Application 2、style主要用于设置View的属性,theme主要用设置Activity的样式如是:否全屏 3、style与theme都是以<style><item>文本</item></style>创建,只是item的内容不一样 style定义: style.xml文件 <resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="TitleStyle"> <item name="android:textSize">18sp</item> <item name="android:textColor">#ec9237</item> </style> <style name="Title" parent="@style/TitleStyle">(继承TitleStyle属性) <item name="android:textSize">5sp</item> </style> </resources> 代码使用: xml使用: <EditText android:layout_height="wrap_content" android:text="EditText" style="@style/Title" android:layout_width="fill_parent" android:id="@+id/editText1" /> ----------------------------------------------- theme: style.xml 1.<?xml version="1.0" encoding="utf-8"?> <resources> <style name="theme1"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">?android:windowNoTitle</item> </style> <style name="theme2.a"> <item name="android:windowNoTitle">true</item> <item name="android:windowFullscreen">?android:windowNoTitle</item> </style> </resources> 代码使用: 注意:setTheme应该在setContentView之前调用。 setTeme(R.theme.theme1);/setTeme(R.style.theme1) setContentView(R.layout.main); xml使用主题: <application android:icon="@drawable/icon" android:label="@string/app_name" android:theme="@style/theme1"> <activity android:name=".MessageShowActivity" android:label="@string/app_name" android:windowSoftInputMode="adjustPan" android:screenOrientation="portrait" android:theme="@style/theme2"> </activity> </application> --------------------------------- android的selector是在drawable/xxx.xml中创建的: selector:主要用设置view点击选中显示效果 <selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:color="hex_color" android:state_pressed=["true" | "false"] android:state_focused=["true" | "false"] android:state_selected=["true" | "false"] android:state_checkable=["true" | "false"] android:state_checked=["true" | "false"] android:state_enabled=["true" | "false"] android:state_window_focused=["true" | "false"] /></selector>android:drawable 放一个drawable资源 android:state_pressed 是否按下,如一个按钮触摸或者点击。 android:state_focused 是否取得焦点,比如用户选择了一个文本框。 android:state_hovered 光标是否悬停,通常与focused state相同,它是4.0的新特性 android:state_selected 被选中,它与focus state并不完全一样,如一个list view 被选中的时候,它里面的各个子组件可能通过方向键,被选中了。 android:state_checkable 组件是否能被check。如:RadioButton是可以被check的。 android:state_checked 被checked了,如:一个RadioButton可以被check了。 android:state_enabled 能够接受触摸或者点击事件 android:state_activated 被激活(这个麻烦举个例子,不是特明白) android:state_window_focused 应用程序是否在前台,当有通知栏被拉下来或者一个对话框弹出的时候应用程序就不在前台了-------<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_window_focused="false" android:drawable="@drawable/pic1" /><!-- 没有焦点时的背景图片--> <item android:state_focused="true" android:state_pressed="true" android:drawable="@drawable/pic2" /><!-- 非触摸模式下获得焦点并单击时的背景图片--> <item android:state_focused="false" android:state_pressed="true" android:drawable="@drawable/pic3" /><!-- 触摸模式下单击时的背景图片--> <item android:state_selected="true" android:drawable="@drawable/pic4" /><!--选中时的图片背景--> <item android:state_focused="true" android:drawable="@drawable/pic5" /><!--获得焦点时的图片背景--> </selector> 在xml中使用示例: res/color/button_text.xml <?xml version="1.0" encoding="utf-8"?><selectorxmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#ffff0000"/><!-- pressed --> <item android:state_focused="true" android:color="#ff0000ff"/><!-- focused --> <itemandroid:color="#ff000000"/><!-- default --></selector> <Button android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="@string/button_text"android:textColor="@color/button_text"/> 参考:http://www.cnblogs.com/navy-wang/p/3314034.html 本文转自欢醉博客园博客,原文链接http://www.cnblogs.com/zhangs1986/p/3624482.html如需转载请自行联系原作者 欢醉

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

Android RingtoneManager铃声管理

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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 package com.Aina.Android; import java.io.File; import android.app.Activity; import android.content.Intent; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.view.View; import android.widget.Button; public class Test extends Activity { /** Called when the activity is first created. */ private Button btn1 = null ; private Button btn2 = null ; private Button btn3 = null ; private static final int Ringtone = 0 ; private static final int Alarm = 1 ; private static final int Notification = 2 ; private static final String FileRingtone = Environment .getExternalStorageDirectory() + "/music/ringtones" ; private static final String FileAlarm = Environment .getExternalStorageDirectory() + "/music/alarms" ; private static final String FileNotification = Environment .getExternalStorageDirectory() + "/music/notifications" ; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); btn1 = (Button) this .findViewById(R.id.Button01); btn2 = (Button) this .findViewById(R.id.Button02); btn3 = (Button) this .findViewById(R.id.Button03); btn1.setOnClickListener( new Button.OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub if (isFile(FileRingtone)) { // 打开系统铃声设置 Intent intent = new Intent( RingtoneManager.ACTION_RINGTONE_PICKER); // 设置类型为来电 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); // 设置显示的标题 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "设置来电铃声" ); startActivityForResult(intent, Ringtone); } } }); btn2.setOnClickListener( new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (isFile(FileAlarm)) { Intent intent = new Intent( RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALARM); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "设置闹钟铃声" ); startActivityForResult(intent, Alarm); } } }); btn3.setOnClickListener( new Button.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub if (isFile(FileNotification)) { Intent intent = new Intent( RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, "设置通知铃声" ); startActivityForResult(intent, Notification); } } }); } /** * 设置铃声之后的回调函数 */ @Override protected void onActivityResult( int requestCode, int resultCode, Intent data) { super .onActivityResult(requestCode, resultCode, data); if (resultCode != RESULT_OK) { return ; } else { // 得到我们选择的铃声 Uri uri = data .getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (uri != null ) { switch (requestCode) { case Ringtone: RingtoneManager.setActualDefaultRingtoneUri( this , RingtoneManager.TYPE_RINGTONE, uri); break ; case Alarm: RingtoneManager.setActualDefaultRingtoneUri( this , RingtoneManager.TYPE_ALARM, uri); break ; case Notification: RingtoneManager.setActualDefaultRingtoneUri( this , RingtoneManager.TYPE_NOTIFICATION, uri); break ; default : break ; } } } } /** * 判断文件是否存在,不存在则创建. * * @param path * @return */ private boolean isFile(String path) { boolean b = false ; File f = new File(path); if (f.exists()) { b = true ; } else { if (f.mkdirs()) { b = true ; } else { b = false ; } } return b; } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <? xml version="1.0" encoding="utf-8"?> < LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> < TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> < Button android:text="设置来电铃声" android:id="@+id/Button01" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ Button > < Button android:text="设置闹钟铃声" android:id="@+id/Button02" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ Button > < Button android:text="设置通知铃声" android:id="@+id/Button03" android:layout_width="fill_parent" android:layout_height="wrap_content"> </ Button > </ LinearLayout > 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 <? xml version="1.0" encoding="utf-8"?> < manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Aina.Android" android:versionCode="1" android:versionName="1.0"> < application android:icon="@drawable/icon" android:label="@string/app_name"> < activity android:name=".Test" android:label="@string/app_name"> < intent-filter > < action android:name="android.intent.action.MAIN" /> < category android:name="android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > </ application > < uses-permission android:name="android.permission.INTERNET" /> < uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> </ manifest > 本文转自java豆子博客园博客,原文链接:http://www.cnblogs.com/error404/archive/2011/08/04/2127233.html,如需转载请自行联系原作者

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

Docker数据管理

Docker的数据卷是可以绕过文件系统的,而且数据卷是可以共享,可重用的 查看数据卷: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [root@docker~] #dockerinspect-f``.`Volumes`volume-test1 map[ /data : /var/lib/docker/volumes/9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5/_data ] [root@docker~] #cd/var/lib/docker/ [root@dockerdocker] #ls containersdevicemappergraphinitlinkgraph.dbrepositories-devicemappertmptrustvolumes [root@dockerdocker] #cdvolumes/ [root@dockervolumes] #ls-lrt total8 drwxr-xr-x3rootroot4096Feb2409:2963ccf5d524567c835c6d542cfc74d1a28d28fdf48a0bca0c517cb8dedf46b632 drwxr-xr-x3rootroot4096Feb2409:309f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5 [root@dockervolumes] #cd9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5/ [root@docker9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5] # [root@docker~] #dockerrun-it--namevolume-test1-hnginx-v/datacentos [root@nginx/] #ls/data 测试: 1、系统随机生成的目录,进行挂载 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 容器的宿主机: [root@docker9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5] #ls _data [root@docker9f36c1a9b7728974566268a2beebb0b917226952280c96107388469659bfcfe5] #cd_data/ [root@docker_data] #ls passwd [root@docker_data] #ddif=/dev/zeroof=test.isobs=1Mcount=10 10+0records in 10+0recordsout 10485760bytes(10MB)copied,0.00956288s,1.1GB /s [root@docker_data] #ls passwd test .iso 容器内: [root@nginx/] #cd/data/ [root@nginxdata] #ls [root@nginxdata] #cp/etc/passwd. [root@nginxdata] #ls passwd [root@nginxdata] #ls passwd test .iso 说明:容器的宿主机的目录已共享给容器使用(删除容器后,原有的数据卷目录中的文件仍旧是存在的) 2、系统指定的目录,进行挂载 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 宿主机的操作: [root@docker~] #mkdir-p/volume-test2-data [root@docker~] #dockerrun-it-d--namevolume-test2-hcentos7--restart=always-v/volume-test2-data:/centos-datacentos 29e9a41e563d514c8b9f14d14a0426af955651b28109c4851cfec40a186244d0 [root@docker~] #dockerps-l CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 29e9a41e563dcentos "/bin/bash" 7secondsagoUp5secondsvolume-test2 [root@docker~] #cp-r/usr/share/doc/abrt-2.0.8//volume-test2-data/ [root@docker~] #ls-l/volume-test2-data/ total4 drwxr-xr-x2rootroot4096Feb2409:58abrt-2.0.8 容器内的操作: [root@docker~] #./in.sh29e9a41e563d [root@centos7/] #df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/docker-8 :3-8388750-29e9a41e563d514c8b9f14d14a0426af955651b28109c4851cfec40a186244d09.8G230M9.0G3%/ tmpfs1.9G01.9G0% /dev shm64M064M0% /dev/shm /dev/sda3 193G11G173G6% /etc/hosts [root@centos7/] #cd/centos-data/ [root@centos7centos-data] #ls abrt-2.0.8 [root@centos7centos-data] #cp/etc/passwd. [root@centos7centos-data] #ls abrt-2.0.8 passwd [root@docker_data] #ls/volume-test2-data/ abrt-2.0.8 passwd 3、系统指定的目录,进行挂载(可挂载多个,并设置权限,默认为rw权限) 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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 宿主机的操作: 先删除原有的容器 [root@docker~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 29e9a41e563dcentos "/bin/bash" 11minutesagoUp11minutesvolume-test2 8884fc392971nginx"nginx-g'daemonof13hoursagoUp51minutes80 /tcp ,443 /tcp nginxdocker 14caa9ab03a9dockerui /dockerui "/dockerui" 46hoursagoUp51minutes0.0.0.0:9000->9000 /tcp dockerui_qinwen e278cabec91ecentos "/bin/bash" 47hoursagoUp51minutescentos_aways 删除正在允许的容器时,会有报错信息: [root@docker~] #dockerrm29e9a41e563d-f Errorresponsefromdaemon:Cannotdestroycontainer29e9a41e563d:Conflict,Youcannotremovearunningcontainer.Stopthecontainerbeforeattemptingremovaloruse-f Errorresponsefromdaemon:nosuch id :-f Error:failedtoremovecontainers:[29e9a41e563d-f] [root@docker~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 29e9a41e563dcentos "/bin/bash" 11minutesagoUp11minutesvolume-test2 8884fc392971nginx"nginx-g'daemonof13hoursagoUp52minutes80 /tcp ,443 /tcp nginxdocker 14caa9ab03a9dockerui /dockerui "/dockerui" 46hoursagoUp52minutes0.0.0.0:9000->9000 /tcp dockerui_qinwen e278cabec91ecentos "/bin/bash" 47hoursagoUp52minutescentos_aways 先停止容器,然后再进行删除: [root@docker~] #dockerstop29e9a41e563d 29e9a41e563d [root@docker~] #dockerrm29e9a41e563d 29e9a41e563d [root@docker~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 8884fc392971nginx"nginx-g'daemonof13hoursagoUp52minutes80 /tcp ,443 /tcp nginxdocker 14caa9ab03a9dockerui /dockerui "/dockerui" 46hoursagoUp52minutes0.0.0.0:9000->9000 /tcp dockerui_qinwen e278cabec91ecentos "/bin/bash" 47hoursagoUp52minutescentos_aways 运行一个基于centos镜像的容器,容器名称为volume-test2,并设置容器中的主机名为centos7(仅对容器有效),挂载本地的 /volume-test2-data 以及 /opt 目录,并且指定 /opt 目录对容器是只读的 [root@docker~] #dockerrun-it-d--namevolume-test2-hcentos7--restart=always-v/volume-test2-data:/centos-data-v/opt:/opt:rocentos 37652d4601948fe8421c0371278e9bee8c5cbb35f16c7bf755764d56ddafa304 [root@docker~] #dockerps-l CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 37652d460194centos "/bin/bash" 16secondsagoUp15secondsvolume-test2 [root@docker~] #./in.sh37652d460194 容器内的操作: [root@centos7/] #cd/opt/ [root@centos7opt] #ls rh [root@centos7opt] #ls opt.isorh [root@centos7opt] #touch123.txt touch :cannot touch ‘123.txt’:Read-only file system --volume-from: 继承容器数据卷的操作: [root@docker~] #dockerrun-it-d--restart=always--namevolume-test04--volumes-fromvolume-test2centos 94ea720a2c418286d26068d126df35523742e2f910685863f876c3ba9c09638c [root@docker~] #dockerps-l CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 94ea720a2c41centos "/bin/bash" 6secondsagoUp4secondsvolume-test04 [root@docker~] #./in.sh94ea720a2c41 [root@94ea720a2c41/] #ls/ anaconda-post.logcentos-dataetcliblost+foundmntprocrunsrvtmpvar bindevhomelib64mediaoptrootsbinsysusr [root@94ea720a2c41/] #cd/opt/ [root@94ea720a2c41opt] #ls opt.isorh [root@94ea720a2c41opt] #cd/centos-data/ [root@94ea720a2c41centos-data] #ls abrt-2.0.8 passwd [root@94ea720a2c41centos-data] #touch12345.txt [root@94ea720a2c41centos-data] #cd/opt [root@94ea720a2c41opt] #ls opt.isorh [root@94ea720a2c41opt] #touch111 touch :cannot touch ‘111’:Read-only file system 拥有volume-test2的容器的操作: [root@docker~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 94ea720a2c41centos "/bin/bash" 45secondsagoUp43secondsvolume-test04 37652d460194centos "/bin/bash" AboutanhouragoUpAboutanhourvolume-test2 8884fc392971nginx"nginx-g'daemonof14hoursagoUpAboutanhour80 /tcp ,443 /tcp nginxdocker 14caa9ab03a9dockerui /dockerui "/dockerui" 47hoursagoUpAboutanhour0.0.0.0:9000->9000 /tcp dockerui_qinwen e278cabec91ecentos "/bin/bash" 2daysagoUpAboutanhourcentos_aways [root@docker~] #./in.sh37652d460194 [root@centos7/] #ls anaconda-post.logcentos-dataetcliblost+foundmntprocrunsrvtmpvar bindevhomelib64mediaoptrootsbinsysusr [root@centos7/] #cd/centos-data/ [root@centos7centos-data] #ls abrt-2.0.8 passwd [root@centos7centos-data] #ls 12345.txtabrt-2.0.8 passwd 进一步进行测试: 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 [root@docker~] #dockerrun-it-d--restart=always--namevolume-test04--volumes-fromvolume-test2centos 94ea720a2c418286d26068d126df35523742e2f910685863f876c3ba9c09638c 宿主机上的操作: [root@docker~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 94ea720a2c41centos "/bin/bash" 14minutesagoUp14minutesvolume-test04 37652d460194centos "/bin/bash" AboutanhouragoUpAboutanhourvolume-test2 8884fc392971nginx"nginx-g'daemonof14hoursagoUp2hours80 /tcp ,443 /tcp nginxdocker 14caa9ab03a9dockerui /dockerui "/dockerui" 47hoursagoUp2hours0.0.0.0:9000->9000 /tcp dockerui_qinwen e278cabec91ecentos "/bin/bash" 2daysagoUp2hours [root@docker~] #dockerstop37652d460194 37652d460194 [root@docker~] #dockerps CONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES 94ea720a2c41centos "/bin/bash" 14minutesagoUp14minutesvolume-test04 8884fc392971nginx"nginx-g'daemonof14hoursagoUp2hours80 /tcp ,443 /tcp nginxdocker 14caa9ab03a9dockerui /dockerui "/dockerui" 47hoursagoUp2hours0.0.0.0:9000->9000 /tcp dockerui_qinwen e278cabec91ecentos "/bin/bash" 2daysagoUp2hourscentos_aways [root@docker_data] #cd/volume-test2-data [root@dockervolume-test2-data] #ls 12345.txtabrt-2.0.8 passwd [root@dockervolume-test2-data] #ls-lrt total8 drwxr-xr-x2rootroot4096Feb2409:58abrt-2.0.8 -rw-r--r--1rootroot692Feb2410:01 passwd -rw-r--r--1rootroot0Feb2411:1612345.txt 容器内的操作: [root@94ea720a2c41opt] #cd/centos-data/ [root@94ea720a2c41centos-data] #ls-lrt total8 drwxr-xr-x2rootroot4096Feb2401:58abrt-2.0.8 -rw-r--r--1rootroot692Feb2402:01 passwd -rw-r--r--1rootroot0Feb2403:1612345.txt [root@94ea720a2c41centos-data] # 说明: 1、验证后可以发现,ro权限是正常的 2、这种映射在Dockerfile里面是没法使用的 3、这里我们不管volume-test2 所属的容器是否正在允许,在新主机中均能够继承 本文转自 冰冻vs西瓜 51CTO博客,原文链接:http://blog.51cto.com/molewan/1744570,如需转载请自行联系原作者

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

docker镜像、容器管理

Docker优势 1)更高效的利用系统资源 无论是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。 2)更快速的启动时间 Docker容器应用,由于直接 运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启 动时间。 3)一致的运行环境 Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性 4)持续交付和部署 使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。 二:为什么要使用Docker 不仅仅开发团队可以理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像 5)更轻松的迁移 Docker可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的,不用担心运行环境的变化导致应用无法正常运行的情况。 6)更轻松的维护和扩展 Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也 使得应用的维护更新更加简单。 7)对比传统虚拟机 特性 容器 虚拟机 硬盘使用 一般为MB 一般为GB 系统支持量 单机支持上千个容器 一般为几十个 首先使用yum安装docker 查看docker版本信息 或者使用docker info俩种办法 显示本机images PEPOSITORY——来自哪个仓库TAG——标记IMAGE ID——镜像ID号CREATED——创建时间SIZE——镜像大小 查找images镜像 获取下载images镜像 查看文件镜像 或者俩种办法 使用docker commit来扩展一个image 在容器种添加mariadb 需要yum 查看结果 1)从dockerfile来创建image #this is a comment FROM docker.io/jdeathe/centos-ssh:latest MAINTAINER tom <tom@example.com> RUN yum -q -y install apr apr-util RUN yum -q -y install httpd 然后生成镜像 修改镜像标签 从本地镜像导入 上传镜像登录用户名密码 二移除本地镜像 存出镜像 载入 从本地镜像导入镜像库 三容器 Docker包括三个概念 镜像(lmage) 容器(Container) 仓库(Repository) 1)Docker镜像 对于Linux而言,内核启动后,会挂载root文件系统为其提供用户空间支持。而Docker镜像(Image),就相当于是一个root文件系统。 2)Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资 源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境 变量、用户等)。 3)镜像不包含任何动态数据,其内容在构建之后也不会被改变。 4)镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生 改变,后一层上的任何改变只发生在自己这一层 如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。 1镜像容器 命令使用 命令输出 查看容器帮助docker ps -h 容器启动 容器停止 容器进程守护 查看容器信息ID容器名等 进入容器 删除处于UP的容器 批量删除多个容器 本文转自柴鑫旺 51CTO博客,原文链接:http://blog.51cto.com/chaixinwang/1956900,如需转载请自行联系原作者

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

Swarm Mode服务管理

环境准备 [root@swarm-manager ~]# cat > ./sources.list <<END > deb http://mirrors.aliyun.com/debian stretch main contrib non-free > deb http://mirrors.aliyun.com/debian stretch-proposed-updates main contrib non-free > deb http://mirrors.aliyun.com/debian stretch-updates main contrib non-free > deb http://mirrors.aliyun.com/debian-security/ stretch/updates main non-free contrib > END [root@swarm-manager ~]# cat Dockerfile FROM nginx:latest ADD sources.list /etc/apt/sources.list RUN apt-get update && apt-get install -y dnsutils iproute2 net-tools curl && apt-get clean ADD index.html /usr/share/nginx/html/index.html [root@swarm-manager ~]# echo "nginx:v1" > index.html [root@swarm-manager ~]# docker build -t registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 . [root@swarm-manager ~]# echo "nginx:v2" > index.html [root@swarm-manager ~]# docker build -t registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 . [root@swarm-manager ~]# docker push registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 [root@swarm-manager ~]# docker push registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 create [root@swarm-manager ~]# docker service create --name nginx registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 [root@swarm-manager ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS 63c04khgjl03 nginx replicated 1/1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 [root@swarm-manager ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zo87xl8e3in9 nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Running Running 4 minutes ago update [root@swarm-manager ~]# docker service update --network-add my-network --publish-add 80:80 nginx [root@swarm-manager ~]# docker service ls ID NAME MODE REPLICAS IMAGE PORTS 63c04khgjl03 nginx replicated 1/1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 *:80->80/tcp [root@swarm-manager ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lppql3gw8phx nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Running Running 3 minutes ago zo87xl8e3in9 \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Shutdown Shutdown 3 minutes ago Scale [root@swarm-manager ~]# docker service scale nginx=2 [root@swarm-manager ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS lppql3gw8phx nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Running Running 4 minutes ago zo87xl8e3in9 \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Shutdown Shutdown 4 minutes ago qqptr8htux76 nginx.2 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node2 Running Running 2 minutes ago update & rollback 查看当前版本 [root@swarm-manager ~]# curl 127.0.0.1 nginx:v1 进行rolling update [root@swarm-manager ~]# docker service update --image registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 nginx [root@swarm-manager ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS iwpnzn3ss6uo nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 swarm-node1 Running Running 4 minutes ago lppql3gw8phx \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Shutdown Shutdown 4 minutes ago zo87xl8e3in9 \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Shutdown Shutdown 5 minutes ago 1c47y3e14dc0 nginx.2 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 swarm-node2 Running Running 3 minutes ago qqptr8htux76 \_ nginx.2 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node2 Shutdown Shutdown 3 minutes ago [root@swarm-manager ~]# curl 127.0.0.1 nginx:v2 进行rollback [root@swarm-manager ~]# docker service update --rollback nginx nginx [root@swarm-manager ~]# docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xign4i5kxc0m nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Running Running 3 minutes ago iwpnzn3ss6uo \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 swarm-node1 Shutdown Shutdown 3 minutes ago lppql3gw8phx \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Shutdown Shutdown 5 minutes ago zo87xl8e3in9 \_ nginx.1 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node1 Shutdown Shutdown 6 minutes ago em9hv301ga5f nginx.2 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node2 Running Running 3 minutes ago 1c47y3e14dc0 \_ nginx.2 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v2 swarm-node2 Shutdown Shutdown 3 minutes ago qqptr8htux76 \_ nginx.2 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 swarm-node2 Shutdown Shutdown 4 minutes ago [root@swarm-manager ~]# curl 127.0.0.1 nginx:v1 healthcheck 增加健康检查 [root@swarm-manager ~]# docker service update --health-cmd "curl -f http://localhost/ || exit 1" nginx [root@swarm-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f7e1935f1c22 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 "nginx -g 'daemon ..." 17 seconds ago Up 12 seconds (health: starting) 80/tcp nginx.1.9dz6g3bizl4kwh8lctr552c6a [root@swarm-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f7e1935f1c22 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 "nginx -g 'daemon ..." 44 seconds ago Up 38 seconds (healthy) 80/tcp nginx.1.9dz6g3bizl4kwh8lctr552c6a 故障测试 可见当健康状态异常时,将会停止并移除掉异常的容器并重新启动一个新的容器。 [root@swarm-node1 ~]# docker exec -it f7e1935f1c22 rm -f /usr/share/nginx/html/index.html [root@swarm-node1 ~]# date Wed Aug 16 16:48:41 CST 2017 [root@swarm-node1 ~]# docker events --since "2017-08-16T16:48:35" 2017-08-16T16:48:40.063995281+08:00 container exec_create: rm -f /usr/share/nginx/html/index.html f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=lkb6ags10aprqvzii5aht3pjf, com.docker.swarm.task.name=nginx.1.lkb6ags10aprqvzii5aht3pjf, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.lkb6ags10aprqvzii5aht3pjf) ... 2017-08-16T16:49:57.889494869+08:00 container health_status: unhealthy f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=lkb6ags10aprqvzii5aht3pjf, com.docker.swarm.task.name=nginx.1.lkb6ags10aprqvzii5aht3pjf, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.lkb6ags10aprqvzii5aht3pjf) 2017-08-16T16:49:59.891503804+08:00 container kill f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=lkb6ags10aprqvzii5aht3pjf, com.docker.swarm.task.name=nginx.1.lkb6ags10aprqvzii5aht3pjf, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.lkb6ags10aprqvzii5aht3pjf, signal=15) 2017-08-16T16:49:59.964124883+08:00 container die f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=lkb6ags10aprqvzii5aht3pjf, com.docker.swarm.task.name=nginx.1.lkb6ags10aprqvzii5aht3pjf, exitCode=0, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.lkb6ags10aprqvzii5aht3pjf) 2017-08-16T16:50:00.289350308+08:00 network disconnect i6xug49nwdsxauqqpli3apvym (container=f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a, name=ingress, type=overlay) 2017-08-16T16:50:00.289489879+08:00 network disconnect vxe1cwk14avlfp2xjgymhkhdl (container=f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a, name=my-network, type=overlay) 2017-08-16T16:50:00.345105732+08:00 container stop f7e1935f1c2263112fe86a6e74c0d23a2ff369ffd54eab2781f2645a7dc7810a (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=lkb6ags10aprqvzii5aht3pjf, com.docker.swarm.task.name=nginx.1.lkb6ags10aprqvzii5aht3pjf, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.lkb6ags10aprqvzii5aht3pjf) 2017-08-16T16:50:00.922761678+08:00 container create 2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934 (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=y00kqcu26sq75js3fvpqx4kt5, com.docker.swarm.task.name=nginx.1.y00kqcu26sq75js3fvpqx4kt5, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.y00kqcu26sq75js3fvpqx4kt5) 2017-08-16T16:50:03.006063329+08:00 network destroy vxe1cwk14avlfp2xjgymhkhdl (name=my-network, type=overlay) 2017-08-16T16:50:03.376037876+08:00 container destroy 965a0ce53c2c0f2d5a740cb87c39ea51d164f1a6cf5bea0cf0679883dd99cb5c (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=xign4i5kxc0mfp1pji7zzkoo1, com.docker.swarm.task.name=nginx.1.xign4i5kxc0mfp1pji7zzkoo1, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.xign4i5kxc0mfp1pji7zzkoo1) 2017-08-16T16:50:05.720425867+08:00 network connect i6xug49nwdsxauqqpli3apvym (container=2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934, name=ingress, type=overlay) 2017-08-16T16:50:05.808884815+08:00 network disconnect i6xug49nwdsxauqqpli3apvym (container=2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934, name=ingress, type=overlay) 2017-08-16T16:50:05.919636688+08:00 network create vxe1cwk14avlfp2xjgymhkhdl (name=my-network, type=overlay) 2017-08-16T16:50:06.102359133+08:00 network connect i6xug49nwdsxauqqpli3apvym (container=2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934, name=ingress, type=overlay) 2017-08-16T16:50:06.453151382+08:00 network connect vxe1cwk14avlfp2xjgymhkhdl (container=2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934, name=my-network, type=overlay) 2017-08-16T16:50:07.062684099+08:00 container start 2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934 (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=y00kqcu26sq75js3fvpqx4kt5, com.docker.swarm.task.name=nginx.1.y00kqcu26sq75js3fvpqx4kt5, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.y00kqcu26sq75js3fvpqx4kt5) 2017-08-16T16:51:07.221879814+08:00 container exec_create: /bin/sh -c curl -f http://localhost/ || exit 1 2132a1bd9287bc377f0800d9a06e6876aaddb9a71b0afd567c3838fbb6aa3934 (com.docker.swarm.node.id=y83k6khc3vxmch1qd3j8kl4ak, com.docker.swarm.service.id=63c04khgjl033syhc5ef0e9g9, com.docker.swarm.service.name=nginx, com.docker.swarm.task=, com.docker.swarm.task.id=y00kqcu26sq75js3fvpqx4kt5, com.docker.swarm.task.name=nginx.1.y00kqcu26sq75js3fvpqx4kt5, image=registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1@sha256:b223de06038b1187d1d1b955df759839712a10cde33d7f2784ef3f9f5573ad71, name=nginx.1.y00kqcu26sq75js3fvpqx4kt5) [root@swarm-node1 ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2132a1bd9287 registry.cn-hangzhou.aliyuncs.com/vnimos/nginx:v1 "nginx -g 'daemon ..." 31 minutes ago Up 30 minutes (healthy) 80/tcp nginx.1.y00kqcu26sq75js3fvpqx4kt5 constraint & placement lable [root@swarm-manager ~]# docker node update --label-add project=nginx swarm-node2 [root@swarm-manager ~]# docker node update --label-add "datacenter=xiamen" swarm-node1 [root@swarm-manager ~]# docker node update --label-add "datacenter=fuzhou" swarm-node2 [root@swarm-manager ~]# docker node inspect -f {{.Spec.Labels}} swarm-node1 map[datacenter:xiamen] [root@swarm-manager ~]# docker node inspect -f {{.Spec.Labels}} swarm-node2 map[datacenter:fuzhou project:nginx] constraint [root@swarm-manager ~]# docker service create --replicas=4 --constraint 'node.hostname == swarm-node1' --name nginx-c1 nginx [root@swarm-manager ~]# docker service create --replicas=4 --constraint 'node.labels.project == nginx' --name nginx-c2 nginx [root@swarm-manager ~]# docker service ps nginx-c1 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS sqcyg8wm8gdt nginx-c1.1 nginx:latest swarm-node1 Running Running 5 minutes ago ttst5umkpt6g nginx-c1.2 nginx:latest swarm-node1 Running Running 5 minutes ago lpiz1vsaj6p3 nginx-c1.3 nginx:latest swarm-node1 Running Running 5 minutes ago ykvrdyty4qie nginx-c1.4 nginx:latest swarm-node1 Running Running 5 minutes ago [root@swarm-manager ~]# docker service ps nginx-c2 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS x322u16dfnyt nginx-c2.1 nginx:latest swarm-node2 Running Running 5 minutes ago zjp93whpf4ah nginx-c2.2 nginx:latest swarm-node2 Running Running 5 minutes ago ff3usxkpo5ae nginx-c2.3 nginx:latest swarm-node2 Running Running 5 minutes ago p3g0haaqg6yu nginx-c2.4 nginx:latest swarm-node2 Running Running 5 minutes ago placement [root@swarm-manager ~]# docker service create --replicas=6 --placement-pref 'spread=node.labels.datacenter' --name nginx-c3 nginx [root@swarm-manager ~]# docker service ps nginx-c3 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS p3y7774kpu0w nginx-c3.1 nginx:latest swarm-node2 Running Running 3 minutes ago 081l22wh87ok nginx-c3.2 nginx:latest swarm-node1 Running Running 3 minutes ago lj1t30mok3te nginx-c3.3 nginx:latest swarm-node1 Running Running 3 minutes ago fhb90j6brwuv nginx-c3.4 nginx:latest swarm-node2 Running Running 3 minutes ago ein699law198 nginx-c3.5 nginx:latest swarm-node2 Running Running 3 minutes ago vo91976o481m nginx-c3.6 nginx:latest swarm-node1 Running Running 3 minutes ago deploy Docker1.13推出了一个新版本的Docker Compose(V3)。该版本的主要特征是,允许Swarm Mode使用Docker Compose文件定义直接部署服务。 定义compose-file [root@swarm-manager ~]# cat docker-compose.yml version: '3' services: mysql: image: mysql environment: - MYSQL_ROOT_PASSWORD=password wordpress: image: wordpress ports: - 80:80 links: - mysql:mysql environment: - WORDPRESS_DB_PASSWORD=password 在Swarm Mode下,需要使用docker stack deploy命令进行部署,如果直接使用docker-compose up则将会出现如下警告: [root@swarm-manager ~]# docker-compose up WARNING: The Docker Engine you're using is running in swarm mode. Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node. To deploy your application across the swarm, use `docker stack deploy`. 通过compose-file部署多个Service # docker stack deploy --compose-file=docker-compose.yml demo# docker stack ps demo5.1366.14# docker stack services demo11808011,如需转载请自行联系原作者

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

Hadoop的管理目录

HDFS文件结构 1、NameNode的文件结构,NameNode会创建VERSION、edits、fsimage、fstime文件目录。其中dfs.name.dir属性是一个目录列表,是每个目录的镜像文件。VERSION文件是JAVA属性文件,其中包含运行HDFS的版本信息。包含内容: 其中,namespaceID是文件系统的唯一标识符,当文件系统第一次格式化时,便会被创建,这个标识符是必须跟各DataNode及诶单和NameNode保持一致。NameNode会使用它识别新的DataNode,DataNode只有在向NameNode注册后才会获得此namespaceID。cTime属性标记了NameNode存储空间创建的时间。对于新格式化的,这里时间为0,只要文件系统被更新,就会更新到一个新的时间戳上。StorageType指出此存储目录包含一个NameNode的数据结构,在DataNode中它的属性值为DATA_NODE. LayoutVersion是一个负的整数,定义了HDFS持久数据结构的版本。各节点的版本号要一致。 在NameNode的存储目录中还包含edits、fsimage、fstime三个文件,它们都是二进制的文件,可以通过HadoopWritable对象进行序列化。 2、编辑日志(edit log)及文件系统映像(filesystem image) (1)当客户执行写操作时,首先NameNode会在编辑日志中写下记录,并在内存中保存一个文件系统元数据,这个描述符在编辑日志有了改动后更新,内存中的元数据用来提供读数据请求服务。 (2)编辑日志会在每次成功操作之后,且成功代码尚未返回给客户端之前进行刷新和同步。对于要写入多个目录的操作,写入流要刷新和同步到所有的副本上,保证操作不会因为故障而丢失数据。 (3)fsimage文件是文件系统元数据的持久性检查点,和编辑日志不同,它不会在每个文件系统写操作后进行更新,因为如果NameNode失败,那么元数据的最新状态可以通过从磁盘中读取fsimage文件加载到内存中来进行重建恢复,然后进行编辑日志中的操作(NameNode启动时也做的事情)。一个fsimage文件中包含以序列化格式存储的文件系统目录和文件inodes.每个inodes表征一个文件或目录的元数据信息,以及文件的副本数、修改和访问时间等信息。 Hadoop在NameNode之外的节点上运行了一个Secondary NameNode进程,它的任务是为原NameNode内存中的文件系统元数据产生检查点。是一个辅助NameNode处理fsimage和编辑日志的节点,它从NameNode中拷贝fsimage和编辑日志到零食目录合并成一个新的fsimage,随后会将新的fsimage上传到NameNode,这样NameNode便可更新fsimage并删除原来的编辑日志了。 NameNode在安全模式下,可通过以下命令运行这个过程: hadoop dfsadmin -saveNamespace

资源下载

更多资源
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文件系统,支持十年生命周期更新。

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部分的功能。

用户登录
用户注册