青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

zhiye_wang

向星空仰望的越深,越發(fā)現(xiàn)自己的渺小

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  31 隨筆 :: 1 文章 :: 2 評論 :: 0 Trackbacks

2016年4月20日 #

ubuntu安裝OpenLDAP(二) 配置LDAP

上一篇博文中,我們成功的安裝了OpenLDAP-2.4.4到系統(tǒng)中,這篇文章介紹如何配置一個我

們自己的ldap服務(wù)器來使用。

1 配置ldap的dc和cn

vim /usr/local/etc/openldap/slapd.conf

修改其中的下面兩行:

suffix      "dc=example,dc=com"

rootdn      "cn=Manager,dc=example,dc=com"

我修改后的效果如圖:


啟動slapd

# su root -c /usr/local/libexec/slapd

驗證一下能不能使用:

# ldapsearch -x -b '' -s base'(objectclass=*)'


說明ldap服務(wù)器已經(jīng)可以使用了。

3 新建管理賬號
建立一個
cloudsoar.ldif 文件

# vim cloudsoar.ldif

dn: dc=cloudsoar,dc=com

objectclass: dcObject

objectclass: organization

o: cloudsoar company

dc: cloudsoar

 

dn:cn=Manager,dc=cloudsoar,dc=com

objectclass:organizationalRole

cn: Manager

將文件中的內(nèi)容插入數(shù)據(jù)庫

ldapadd -x -D "cn=Manager,dc=cloudsoar,dc=com"-W -f cloudsoar.ldif 

如果需要密碼,我們的默認(rèn)密碼是:secret(位于/usr/local/etc/openldap/slapd.conf


這里可以看到節(jié)點已經(jīng)插入到ldap了。這里的cloudsoar是我起的域名,您也可以根據(jù)需要設(shè)置一個自己喜歡的域名。

查詢一下:

# ldapsearch -x -b 'dc=cloudsoar,dc=com''(objectclass=*)'


這里我還是不放心,從另外一臺安裝了windows操作系統(tǒng)的電腦上,使用LDAPAdmin.exe 來連接試試。



可以看到我的ldap已經(jīng)可以使用了。


posted @ 2016-04-20 17:31 zhiye_wang 閱讀(345) | 評論 (0)編輯 收藏

ubuntu安裝OpenLDAP(附錯誤的詳細(xì)解決辦法)

下載OpenLDAP源碼


 http://www.openldap.org/software/download/

或者

 ftp://ftp.openldap.org/pub/OpenLDAP/openldap-release.tgz


解壓到本地

 # gunzip-c openldap-VERSION.tgz | tar xf -

# cd openldap-2.4.44

# ./configure

 configure: error: BDB/HDB: BerkeleyDB notavailable

提示本地沒有安裝BerkeleyDB數(shù)據(jù)庫

安裝BerkeleyDB

 Oracle官網(wǎng)下載:

 http://www.oracle.com/technetwork/database/database-technologies/berkeleydb/downloads/index.html

解壓到本地


切換到build_unix 目錄

# cd build_unix

# ../dist/configure

# make

# make install

root@cloudsoar-virtual-machine:/home/cloudsoar/db-6.2.23/build_unix#make install

Installing DB include files:/usr/local/BerkeleyDB.6.2/include ...

Installing DB library:/usr/local/BerkeleyDB.6.2/lib ...

libtool: install: cp -p .libs/libdb-6.2.so/usr/local/BerkeleyDB.6.2/lib/libdb-6.2.so

libtool: install: cp -p .libs/db_upgrade/usr/local/BerkeleyDB.6.2/bin/db_upgrade

libtool: install: cp -p .libs/db_verify/usr/local/BerkeleyDB.6.2/bin/db_verify

Installing documentation:/usr/local/BerkeleyDB.6.2/docs ...

查看安裝


設(shè)置到系統(tǒng)變量

不設(shè)置的話,等下安裝OpenLDAP時候執(zhí)行./configure檢查時候還會報同樣的錯

# vim /etc/ld.so.conf

添加一行:/usr/local/BerkeleyDB.6.2/lib/

保存退出。

執(zhí)行生效:ldconfig –v

繼續(xù)安裝openldap-2.4.44


切換到openldap的源碼目錄下,重新執(zhí)行configure文件

./configure CPPFLAGS="-I/usr/local/BerkeleyDB.6.2/include-D_GNU_SOURCE" LDFLAGS="-L/usr/local/BerkeleyDB.6.2/lib"

執(zhí)行后報錯

error: BerkeleyDB version incompatible withBDB/HDB backends

這里找不到原因,后來查看openladp-2.4.44,目錄的README文件發(fā)現(xiàn)如下內(nèi)容:


郁悶,原來openldap-2.4.44要求用Oracle Berkeley 4.4-4.8或者5.0-5.1版本的,而我用的是db-6.2.23.tar.gz版本的。

沒辦法,只有重新去Oracle官網(wǎng)下載一個db-5.1.29.tar.gz版本的。

按照安裝Berkeley 6.2的方法再次安裝Berkeley DB 5.1。

# cd build_unix

# ../dist/configure

# make

# make install

# vim /etc/ld.so.conf

添加一行:/usr/local/BerkeleyDB.5.1/lib/

保存退出。

執(zhí)行生效:ldconfig –v

 

安裝openldap          

切換到openldap-2.4.44目錄

./configure CPPFLAGS="-I/usr/local/BerkeleyDB.5.1/include-D_GNU_SOURCE" LDFLAGS="-L/usr/local/BerkeleyDB.5.1/lib"

執(zhí)行完畢可以看到提示我執(zhí)行make depand


編譯軟件

根據(jù)http://www.openldap.org/doc/admin24/install.html的安裝步驟繼續(xù)執(zhí)行

執(zhí)行命令:make depend


執(zhí)行命令:make

10 測試軟件

根據(jù)官方文檔說明:Once the software has been properly configured and successfullymade, you should run the test suite to verify the build.

我們也需要測試一下安裝是否成功,執(zhí)行命令:make test


說明安裝環(huán)境是沒問題了。

11 安裝openldap到系統(tǒng)

根據(jù)官方文檔說明:By default OpenLDAP Software is installed in /usr/local. If youchanged this setting with the --prefix configure option, it will be installedin the location you provided.

我們可以加–prefix 參數(shù)來指定我們自己想要安裝的位置。默認(rèn)是安裝到 /usr/local目錄下。

執(zhí)行命令:su root -c 'make install'


到這里openldap-2.4.44已經(jīng)成功的安裝到我的系統(tǒng)當(dāng)中。默認(rèn)的配置文件在 /usr/local/etc/openldap 下。


posted @ 2016-04-20 17:27 zhiye_wang 閱讀(1012) | 評論 (0)編輯 收藏

2016年4月13日 #

     摘要: CentOS安裝運行mongo docker鏡像背景: 根據(jù)需要,我需要安裝一個mongoDB數(shù)據(jù)庫,并且需要通過docker鏡像作為容器運行這個 mongoDB 數(shù)據(jù)庫步驟:1 下載鏡像首先從 docker hub 下載 mongoDB 的 docker 鏡像使用 docker search 命令查看有哪些可以下載的鏡像12345[root@bogon test]# dock...  閱讀全文
posted @ 2016-04-13 11:42 zhiye_wang 閱讀(363) | 評論 (0)編輯 收藏

2016年3月28日 #

Go 語言教程筆記(

一 Go語言決策

if 語句

if語句包含一個布爾表達(dá)式后跟一個或多個語句

語法

if語句在Go編程語言的語法是:

if(boolean_expression)

{

   /* statement(s) will execute if the boolean expression is true */

如果布爾表達(dá)式的值為 true,那么if語句里面代碼塊將被執(zhí)行。如果if語句的結(jié)束(右大括號后)

布爾表達(dá)式的值為false,那么語句之后第一行代碼會被執(zhí)行。

例子:

package main  import "fmt"  func main() {    /* local variable definition */    var a int = 10      /* check the boolean condition using if statement */    if( a < 20 ) {        /* if condition is true then print the following */        fmt.Printf("a is less than 20\n" )    }    fmt.Printf("value of a is : %d\n", a) }

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

a is less than 20; value of a is : 10

if else 語句

if語句可以跟著一個可選的else語句,布爾表達(dá)式是假時它被執(zhí)行。

語法

在Go編程語言中的if ... else語句的語法是:

if(boolean_expression) {    /* statement(s) will execute if the boolean expression is true */ } else {   /* statement(s) will execute if the boolean expression is false */ }

如果布爾表達(dá)式的值為true,那么if代碼塊將被執(zhí)行,否則else代碼塊將被執(zhí)行

例子:

package main  import "fmt"  func main() {    /* local variable definition */    var a int = 100;      /* check the boolean condition */    if( a < 20 ) {        /* if condition is true then print the following */        fmt.Printf("a is less than 20\n" );    } else {        /* if condition is false then print the following */        fmt.Printf("a is not less than 20\n" );    }    fmt.Printf("value of a is : %d\n", a);  }

當(dāng)上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

a is not less than 20; value of a is : 100

if...else if...else 語句

if語句可以跟著一個可選的else if ... else語句,這是非常有用的使用單個 if...else if 語句聲明測試各種條件。

當(dāng)使用if , else if , else語句有幾點要記住使用:

if可以有零或一個else,它必須跟從else if后面。

一個if可以有零到個多else if并且它們必須在else之前。

一旦一個else if測試成功,其它任何剩余else if將不會被測試。

語法

if...else if...else在Go編程語言中語句的語法是:

if(boolean_expression 1) {    /* Executes when the boolean expression 1 is true */ } else if( boolean_expression 2) {    /* Executes when the boolean expression 2 is true */ } else if( boolean_expression 3) {    /* Executes when the boolean expression 3 is true */ } else  {    /* executes when the none of the above condition is true */ }

例子:

package main  import "fmt"  func main() {    /* local variable definition */    var a int = 100      /* check the boolean condition */    if( a == 10 ) {        /* if condition is true then print the following */        fmt.Printf("Value of a is 10\n" )    } else if( a == 20 ) {        /* if else if condition is true */        fmt.Printf("Value of a is 20\n" )    } else if( a == 30 ) {        /* if else if condition is true  */        fmt.Printf("Value of a is 30\n" )    } else {        /* if none of the conditions is true */        fmt.Printf("None of the values is matching\n" )    }    fmt.Printf("Exact value of a is: %d\n", a ) }

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果

None of the values is matching Exact value of a is: 100

switch 語句

switch語句可以讓一個變量對反對值的列表平等進(jìn)行測試。每個值被稱為一個的情況(case),

變量被接通檢查每個開關(guān)盒(switch case)。

在Go編程,switch有兩種類型。

 表達(dá)式Switch - 在表達(dá)式switch,case包含相比較,switch表達(dá)式的值。

 類型Switch - 在這類型switch,此時含有進(jìn)行比較特殊注明開關(guān)表達(dá)式的類型。

 表達(dá)式Switch

在Go編程語言中表達(dá)switch語句的語法如下:

switch(boolean-expression or integral type){     case boolean-expression or integral type  :        statement(s);           case boolean-expression or integral type  :        statement(s);      /* you can have any number of case statements */     default : /* Optional */        statement(s); }

以下規(guī)則適用于switch語句:

在switch語句中使用的表達(dá)式必須具有整體或布爾表達(dá)式,或者是一個類型,其中所述類具有

一個單一的轉(zhuǎn)換函數(shù),以一個整體或布爾值。如果表達(dá)不通過,默認(rèn)值是true。可以有任意數(shù)

量的case語句在switch內(nèi)。每個case后跟值進(jìn)行比較,以及一個冒號。constant-expression 

的情況,必須是相同的數(shù)據(jù)類型,在switch的變量,它必須是一個常量或文字。

當(dāng)變量被接通等于case的值,以下case中將執(zhí)行語句。在case語句中break不是必需。

switch語句可以有一個可選默認(rèn)情況下,它必須出現(xiàn)在開關(guān)結(jié)束。缺省情況下,可用于執(zhí)行任

務(wù)時沒有的case為true。則case在默認(rèn)情況下也不是必須的。

例子

package main  import "fmt"  func main() {    /* local variable definition */    var grade string = "B"    var marks int = 90     switch marks {       case 90: grade = "A"       case 80: grade = "B"       case 50,60,70 : grade = "C"       default: grade = "D"      }     switch {       case grade == "A" :          fmt.Printf("Excellent!\n" )            case grade == "B", grade == "C" :          fmt.Printf("Well done\n" )             case grade == "D" :          fmt.Printf("You passed\n" )             case grade == "F":          fmt.Printf("Better try again\n" )       default:          fmt.Printf("Invalid grade\n" );    }    fmt.Printf("Your grade is  %s\n", grade );       }

當(dāng)上述代碼被編譯和執(zhí)行時,它產(chǎn)生了以下結(jié)果:

Well done Excellent! Your grade is  A

類型Switch

在Go編程語言的一個類型switch語句的語法如下:

switch x.(type){     case type:        statement(s);           case type:        statement(s);      /* you can have any number of case statements */     default: /* Optional */        statement(s); }

以下規(guī)則適用于switch語句:

在switch語句中使用必須有接口的變量表達(dá)式{}輸入。

在switch內(nèi)可以有任意數(shù)量case語句。每一種case后跟的值進(jìn)行比較,以及一個冒號。

case 類型必須是相同的數(shù)據(jù)類型,在switch的變量,它必須是一個有效的數(shù)據(jù)類型。

當(dāng)變量被接通等于某一case中的值,以下case語句將執(zhí)行。在case語句塊的break不是必需的。

switch語句可以有一個可選默認(rèn)case,它必須出現(xiàn)在switch的結(jié)束。缺省情況下,可用于執(zhí)行

任務(wù)時沒有匹配case時。default不是必需的。

例子

package main  import "fmt"  func main() {    var x interface{}          switch i := x.(type) {       case nil:	            fmt.Printf("type of x :%T",i)                       case int:	            fmt.Printf("x is int")                              case float64:          fmt.Printf("x is float64")                  case func(int) float64:          fmt.Printf("x is func(int)")                             case bool, string:          fmt.Printf("x is bool or string")              default:          fmt.Printf("don't know the type")         }    }

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

type of x :<nil>

 select語句

select語句的語法如下:

select {     case communication clause  :        statement(s);           case communication clause  :        statement(s);      /* you can have any number of case statements */     default : /* Optional */        statement(s); }

以下規(guī)則適用于select語句:

可以有任意數(shù)量的范圍內(nèi)選擇一個case語句。每一種情況下后跟的值進(jìn)行比較,以及一個冒號。

對于case的類型必須是一個通信通道操作。

當(dāng)通道運行下面發(fā)生的語句這種情況將執(zhí)行。在case語句中break不是必需的。

select語句可以有一個可選默認(rèn)case,它必須出現(xiàn)在select的結(jié)束前。缺省情況下,可用于執(zhí)行

任務(wù)時沒有的情況下是真實的。在默認(rèn)情況下break不是必需的。

例如:

package main  import "fmt"  func main() {    var c1, c2, c3 chan int    var i1, i2 int    select {       case i1 = <-c1:          fmt.Printf("received ", i1, " from c1\n")       case c2 <- i2:          fmt.Printf("sent ", i2, " to c2\n")       case i3, ok := (<-c3):  // same as: i3, ok := <-c3          if ok {             fmt.Printf("received ", i3, " from c3\n")          } else {             fmt.Printf("c3 is closed\n")          }       default:          fmt.Printf("no communication\n")    }     }   

讓我們編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

no communication

posted @ 2016-03-28 16:54 zhiye_wang 閱讀(177) | 評論 (0)編輯 收藏

Go 語言教程筆記(二)

一 Go 語言常量

常量是指該程序可能無法在其執(zhí)行期間改變的固定值。這些固定值也被稱為文字。

常量可以是任何像一個整型常量,一個浮點常量,字符常量或字符串文字的基本數(shù)據(jù)類型。還

有枚舉常量。常量是一樣,只是它們的值不能自己定義后進(jìn)行修改常規(guī)變量處理。

整形常量

一個整數(shù)文字也可以有一個后綴為U和L的組合,分別為無符號和長整型。后綴可以是大寫或小

寫,并且可以以任意順序。可以是十進(jìn)制,八進(jìn)制,或十六進(jìn)制常數(shù)。前綴指定基或基數(shù):0x

或 0X 的十六進(jìn)制,0 表示八進(jìn)制,并沒有十進(jìn)制。

整數(shù)常量的一些例子:

212         /* Legal */

215u        /* Legal */

0xFeeL      /* Legal */

078         /* Illegal: 8 is not an octal digit */

032UU       /* Illegal: cannot repeat a suffix */

不同類型的整型常量的例子:

85         /* decimal */

0213       /* octal */

0x4b       /* hexadecimal */

30         /* int */

30u        /* unsigned int */

30l        /* long */

30ul       /* unsigned long */

浮點文本(常量)

浮點字面具有一個整數(shù)部分,一個小數(shù)點,一個小數(shù)部分,和一個指數(shù)部分。你可以表示十進(jìn)

制形式或指數(shù)形式浮點文字。同時采用十進(jìn)制形式表示,則必須包括小數(shù)點,指數(shù),或兩者并

用而指數(shù)形式表示,則必須包括整數(shù)部分,小數(shù)部分,或者兩者兼而有之。有符號的指數(shù),通

過e或E表示。

下面是浮點面值的一些例子:

3.14159       /* Legal */

314159E-5L    /* Legal */

510E          /* Illegal: incomplete exponent */

210f          /* Illegal: no decimal or exponent */

.e55          /* Illegal: missing integer or fraction */

字符串文字

字符串文字或常量用雙引號“”。一個字符串包含類似于字符文字字符:普通字符,轉(zhuǎn)義序列

和通用字符。可以使用字符串和分隔使用空格打破一個長行成多行。

"hello, dear"

"hello, 

dear"

"hello, " "d" "ear"

const 關(guān)鍵字

package main

import "fmt"

func main() {

   const LENGTH int = 10

   const WIDTH int = 5   

   var area int

   area = LENGTH * WIDTH

   fmt.Printf("value of area : %d", area)   

}

習(xí)慣大寫定義常量是一個良好的編程習(xí)慣。

二 Go 語言運算符

Go語言有豐富的內(nèi)置運算符和運算符:

算術(shù)運算符

關(guān)系運算符

邏輯運算符

位運算符

賦值運算符

其它運算符


算術(shù)運算符

運算符描述示例
+兩個操作數(shù)相加A + B = 30
-第一個操作數(shù)減第二操作數(shù)A - B = -10
*兩個操作數(shù)相乘A * B = 200
/通過去分子除以分母B / A = 2
%模運算和整數(shù)除法后的余數(shù)B % A = 0
++運算符遞增整數(shù)值增加一A++ = 11
--運算符遞減整數(shù)值減一A-- = 9

關(guān)系運算符

運算符描述示例
==檢查兩個操作數(shù)的值是否相等,如果是的話那么條件為真。(A == B) 不為 true.
!=檢查兩個操作數(shù)的值是否相等,如果值不相等,則條件變?yōu)檎妗?/td>(A != B) 為true.
>檢查左邊的操作數(shù)的值是否大于右操作數(shù)的值,如果是的話那么條件為真。(A > B) 不為 true.
<檢查左邊的操作數(shù)的值是否小于右操作數(shù)的值,如果是的話那么條件為真。(A < B) 為 true.
>=檢查左邊的操作數(shù)的值是否大于或等于右操作數(shù)的值,如果是的話那么條件為真。(A >= B) 不為 true.
<=檢查左邊的操作數(shù)的值是否小于或等于右操作數(shù)的值,如果是的話那么條件為真。(A <= B) 為 true

邏輯運算符

&&所謂邏輯與運算符。如果兩個操作數(shù)都非零,則條件變?yōu)檎妗?/td>(A && B) 為 false.
||所謂的邏輯或操作。如果任何兩個操作數(shù)是非零,則條件變?yōu)檎妗?/td>(A || B) 為 true.
!所謂邏輯非運算符。使用反轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為真,那么邏輯非操后結(jié)果為假。!(A && B) 為 true.

位運算符

pqp & qp | qp ^ q
00000
01011
11110
10011

假設(shè),如果A =60;且b =13;現(xiàn)在以二進(jìn)制格式它們?nèi)缦拢?/p>

A = 0011 1100

B = 0000 1101

-----------------

A&B = 0000 1100

A|B = 0011 1101

A^B = 0011 0001

~A  = 1100 0011

C語言支持位運算符列在如下表。假設(shè)變量A=60和變量B=13,則

其它運算符

還有其他一些重要的運算符,包括sizeof和?:在Go語言中也支持。

Go語言運算符優(yōu)先級

分類 運算符 關(guān)聯(lián) 
后綴() [] -> . ++ - -  從左到右
一元+ - ! ~ ++ - - (type)* & sizeof 從右到左
乘法* / % 從左到右
相加  + - 從左到右 
移動<< >> 從左到右
關(guān)系< <= > >= 從左到右
相等== != 從左到右
按位與從左到右
按位異或從左到右
按位或 從左到右
邏輯與 && 從左到右
邏輯或 || 從左到右
條件 ?: 從左到右
賦值= += -= *= /= %=>>= <<= &= ^= |= 從右到左
逗號 從左到右
posted @ 2016-03-28 16:17 zhiye_wang 閱讀(338) | 評論 (0)編輯 收藏

Go 語言教程筆記(一)

一 Go 語言環(huán)境設(shè)置 

本地環(huán)境設(shè)置

在這里我們介紹設(shè)置Go編程語言環(huán)境,需要在你的計算機上的準(zhǔn)備以下兩個軟件,(A)文本編

輯器和(B)Go編譯器。

文本編輯器

我的環(huán)境是ubuntu,直接用 vim

Go編譯器

ubuntu下面直接安裝

# apt-get install golang


例子:

# vim hello.go

  1 package main

  2 

  3 import fmt "fmt"

  4 

  5 func main() {

  6     fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界 ");

  7 }                                                                        

go語言中如果有if等后面需要跟大括號的語句,強制使用大擴(kuò)號跟if寫在一行。


編譯運行:

# go run hello.go 

Hello, world; or Καλημέρα κόσμε; or こんにちは 世界


二 Go 語言程序結(jié)構(gòu) 

在我們學(xué)習(xí)Go編程語言的基本構(gòu)建模塊,看看一個最低限度的Go程序結(jié)構(gòu),這樣我們

就可以把它作為即將到來的章節(jié)的參考。

Go 程序包含以下部分

包聲明

導(dǎo)入包

函數(shù)

變量

語句和表達(dá)式

注釋

例如:

 1 package main

  2 

  3 import fmt "fmt"

  4 

  5 func main() {

  6     fmt.Printf("Hello, world; or Καλημέρα κόσμε; or こんにちは 世界 ");

  7 }  

第一行定義了這個程序包的名稱。這是一個必須聲明為Go程序運行在什么包。main包是起始

點來運行程序。每個包都有一個與之關(guān)聯(lián)的路徑和名稱。

下一行import "fmt" 是告訴編譯器去包含文件在包fmt的預(yù)處理命令。

下一行 func main()主要功能是為程序執(zhí)行的開始。

如果有注釋,/*...*/會被編譯器被忽略,它已被加入到程序添加注釋。因此,這樣的行稱為程

序中的注釋。注釋也使用//類似于Java或C++注釋。

下一行 fmt.Println(...)是提供另一種功能,使消息“Hello, World!”要顯示在屏幕上。這

里fmt包已導(dǎo)出。


三 Go 語言的基本語法

標(biāo)識符

Go語言不允許標(biāo)識符中的標(biāo)點字符,如@,$和%。

Go是一種區(qū)分大小寫的編程語言

Manpower 和 manpower 在Go中是兩個不同的標(biāo)識符

標(biāo)識符開始以字母A到Z或a到z或下劃線_后跟零個或多個字母,下劃線和數(shù)字(0?9)

關(guān)鍵詞

下面的列表顯示了Go的保留字。這些保留的字可以不被用作常量或變量,或任何其他的標(biāo)識符

名稱。

break  default  func  interface  select

case  defer  go  map  struct

chan  else  goto  package  switch

const  fallthrough  if  range  type

continue  for  import  return  var

在 Go 中空白格

僅包含空格,可能與注釋行,被稱為一個空行,Go編譯器完全忽略它。

var age int;

必須有至少一個空白字符(通常是一個空格)int和age之間的編譯器,以便能夠區(qū)分它們

fruit = apples + oranges;   // get the total fruit

fruit和=之間或=和apples,雖然是自由的,如果想便于閱讀的目的,最好包括一些空格


四 Go 語言數(shù)據(jù)類型

在Go編程語言,數(shù)據(jù)類型指用于聲明變量或不同類型的功能的廣泛的系統(tǒng)。變量的類型決定了

有多少空間占用的存儲和存儲方式的位模式將被解釋。

Go的數(shù)據(jù)類型可分類如下:

Boolean Types

它們是布爾類型,它由兩個預(yù)定義的常量:(a) true (b) false

Numeric Types

它們是算術(shù)類型,表示整數(shù)類型或b。在整個程序浮點值

string types:

一個字符串類型代表組字符串值。它的值是一個字節(jié)序列。字符串是一次創(chuàng)造了穩(wěn)定的類型,

這是不可能改變一個字符串的內(nèi)容。預(yù)聲明的字符串類型為字符串。

Derived types:

它們包括:(a)指針類型,(b)數(shù)組類型,(c)結(jié)構(gòu)類型,(d)聯(lián)盟類型及(e)函數(shù)類型(f)切片類(g)

函數(shù)類型(h)接口類型(i)地圖類型(j)管道類型。

數(shù)組類型和結(jié)構(gòu)類型被統(tǒng)稱為聚合類型。函數(shù)的類型指定的一組具有相同的參數(shù)和結(jié)果類型所

有函數(shù)。

整數(shù)

1 uint8

8位無符號整數(shù) (0 - 255)

2 uint16

16位無符號整數(shù) (0 - 65535)

3 uint32

32位無符號整數(shù) (0 - 4294967295)

4  uint64

64位無符號整數(shù) (0 - 18446744073709551615)

5  int8

有符號8位整數(shù) (-128 - 127)

6  int16

有符號16位整數(shù) (-32768 - 32767)

7  int32

有符號的32位整數(shù) (-2147483648 - 2147483647)

8  int64

有符號的64位整數(shù) (-9223372036854775808 - 9223372036854775807)

浮點類型

1  float32

IEEE-754 32-bit 浮點數(shù)

2  float64

IEEE-754 64-bit 浮點數(shù)

3  complex64

復(fù)數(shù)與float32實部和虛部

4  complex128

復(fù)數(shù)與float64實部和虛部

其他數(shù)值類型

1  byte

相同于 uint8

2  rune

相同于 int32

3  uint

32 或 64 位

4  int

相同于 uint 的大小

5  uintptr

一個無符號整數(shù)來存儲指針值的解釋的比特位


五 Go 語言變量

變量是什么,只不是給定到存儲區(qū)域,我們的程序可以操縱的名稱。在Go中每個變量具有特定

的類型,它確定的大小和可變的存儲器的布局;能確定存儲器內(nèi)存儲的值的范圍;和組操作可以施

加到變量。

一個變量名可以由字母,數(shù)字和下劃線。它必須以字母或下劃線。大寫和小寫字母是不同的,因

為Go是區(qū)分大小寫的?;谠摶绢愋驮谇懊娴恼鹿?jié)中說明的那樣,將有以下基本變量類型:

byte  通常單個字節(jié)(一個字節(jié)),這是一個字節(jié)的類型

int  整數(shù)最自然的尺寸的機器

float32  單精度浮點值

Go編程語言也可以定義各種其他類型的變量,我們將在以后的章節(jié)列出,如:枚舉,指針,數(shù)

組,結(jié)構(gòu),聯(lián)合,等等。

Go中變量定義

var variable_list optional_data_type;

optional_data_type可以包括字節(jié),整型,float32,complex64,布爾或任何用戶定義的對象

等有效Go的數(shù)據(jù)類型,variable_list可以由用逗號分隔的一個或多個標(biāo)識符名稱。一些有效的聲

明如下所示:

var    i, j, k int;

var   c, ch byte;

var  f, salary float32;

d = 42;

var i, j, k; 既聲明并定義了變量i,j和k;這指示編譯器創(chuàng)建一個名為i,j和k的 int類型變量。變量

可以再聲明時候初始化。變量的類型是由編譯器自動根據(jù)傳遞給它的值判斷。

variable_name = value;

d = 3, f = 5;    // declaration of d and f. Here d and f are int 

對于沒有初始化定義:具有靜態(tài)存儲時間變量的隱含零初始化(所有字節(jié)的值為0);所有其它變量

的初始值是它們的數(shù)據(jù)類型的零值。

靜態(tài)類型聲明

package main

import "fmt"

func main() {

   var x float64

   x = 20.0

   fmt.Println(x)

   fmt.Printf("x is of type %T ", x)

}

編譯運行結(jié)果是:

20

x is of type float64

動態(tài)類型聲明/類型推斷

示例

試試下面的例子,其中的變量已經(jīng)聲明沒有任何類型的,并已確定在主函數(shù)中初始化。如果類型推斷的,我們已經(jīng)初始化的變量y使用:=運算符,x初始化使用=運算符。

package main

import "fmt"

func main() {

   var x float64 = 20.0

   y := 42 

   fmt.Println(x)

   fmt.Println(y)

   fmt.Printf("x is of type %T ", x)

   fmt.Printf("y is of type %T ", y)  

}

編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

20

42

x is of type float64

y is of type int

混合變量聲明

不同類型的變量可以一步到位使用類型推斷聲明。

package main

import "fmt"

func main() {

   var a, b, c = 3, 4, "foo"  

   fmt.Println(a)

   fmt.Println(b)

   fmt.Println(c)

   fmt.Printf("a is of type %T ", a)

   fmt.Printf("b is of type %T ", b)

   fmt.Printf("c is of type %T ", c)

}

編譯和運行上面的程序,這將產(chǎn)生以下結(jié)果:

3

4

foo

a is of type int

b is of type int

c is of type string

posted @ 2016-03-28 15:33 zhiye_wang 閱讀(353) | 評論 (0)編輯 收藏

2016年3月17日 #

     摘要: Rancher 快速上手指南操作(1)該指南知道用戶如何快速的部署Rancher Server 管理容器。前提是假設(shè)你的機器已經(jīng)安裝好docker了。1 確認(rèn) docker 的版本,下面是 ubuntu 的輸出[#63#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker version[sudo] password for cl...  閱讀全文
posted @ 2016-03-17 11:03 zhiye_wang 閱讀(5990) | 評論 (0)編輯 收藏

第四章 使用Docker鏡像和倉庫(二)

回顧:

開始學(xué)習(xí)之前,我先pull下來ubuntu和fedora鏡像

[#9#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull fedora

Using default tag: latest

latest: Pulling from library/fedora

9bdb5101e5fc: Pull complete 

Digest: sha256:1fa98be10c550ffabde65246ed2df16be28dc896d6e370dab56b98460bd27823

Status: Downloaded newer image for fedora:latest

[#10#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull ubuntu

Using default tag: latest

latest: Pulling from library/ubuntu

ebe73f29e6e1: Pull complete 

4976a0f2dc03: Pull complete 

5c117067c385: Pull complete 

001d664e2dd4: Pull complete 

Digest: sha256:7eb6ad74ec4fbe56ac194d8760063c88ca362f05a9038f2bc4f09a51849a4a53

Status: Downloaded newer image for ubuntu:latest

4.5.6 Dockerfile 和構(gòu)建緩存

想略過緩存功能,可以使用 docker build 的 --no-cache 標(biāo)志

sudo docker build --no-cache -t="zhiyewang/static_web" .

4.5.7 基于構(gòu)建緩存的 Dockerfile 模板

FROM ubuntu:14.04

MAINTAINER zhiyewang "zhiye_wang@yeah.net"

ENV REFRESHED_AT 2016-03-16

RUN apt-get -qq update

這里要想重新構(gòu)建 Dockerfile ,只需要將第三行的日期修改以下即可。將會更新 APT 包的緩

存。

4.5.8 查看新鏡像

查看鏡像如何構(gòu)建出來,可以使用 docker history 命令??梢钥吹叫聵?gòu)建的 zhiyewang/stat

 ic_web 鏡像的每一層。以及創(chuàng)建這些層的 Dcoekrfile 命令。

4.5.9 從構(gòu)建的新鏡像啟動容器

上一節(jié)成功使用 Dockerfile 命令構(gòu)建出 zhiyewang/static_web 這個鏡像。現(xiàn)在我們來試試

看鏡像是否工作正常。z

基于新構(gòu)建的鏡像啟動一個新容器。

 

[#17#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -d -p 80 --name stati

c_web zhiyewang/static_web nginx -g "daemon off;"

d4d9024c688d267761dee792e0b0686a6b2d06dcf53e656c98d95408f4894974

這條命令基于方才構(gòu)建的鏡像名字,啟動了一個名為 static_web 的新容器。 同時指定了 -d 選

項,告訴 Docker 以分離的方式在后臺運行。同時也指定了在新容器中運行的命令: nginx -g "

daemon off;"。這將以前臺的方式啟動 Nginx。新標(biāo)志 -p 用來控制 Docker 在運行時應(yīng)該公

開哪些網(wǎng)絡(luò)端口給外部(宿主機)。

 

[#19#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker ps -l

CONTAINER ID        IMAGE                            COMMAND                           PORTS                  

d4d9024c688d        zhiyewang/static_web   "nginx -g 'daemon off"         0.0.0.0:32768->80/tcp 

可以看到容器中的 80 端口被映射到宿主機的 32768 端口。

也可以使用 docker port 查看端口的情況

[#20#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker port d4d9024c688d

80/tcp -> 0.0.0.0:32768

這樣的端口映射方式為隨機的,我們也可以指定特定的端口映射

將容器的 80 端口綁定到本地宿主機的 80 端口

sudo docker run -d -p 80:80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

將容器的 80 端口綁定到本地宿主機的 8080 端口

sudo docker run -d -p 8080:80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

將容器的 80 端口綁定到本地宿主機的 127.0.0.1 這個 IP 的 80 端口

sudo docker run -d -p 127.0.0.1:80:80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

將容器的 80 端口綁定到本地宿主機的 127.0.0.1 這個 IP 的隨機端口

sudo docker run -d -p 127.0.0.1::80 --name static_web zhiyewang/static_web nginx -g "daemon off;"

對外公開端口,此命令可以將容器內(nèi)的 80 端口對本地宿主機公開,并且綁定要宿主機的一個

隨機端口。此命令同時也會將 Dockerfile 文件中 EXPOSE 指令指定的其他端口一并公開。

sudo docker run -d -p --name static_web zhiyewang/static_web nginx -g "daemon off;"

這樣我們就可以使用本地宿主機的 IP 地址或者 127.0.0.1 的 localhost 來連接到運行的容器,

查看 Web 服務(wù)器的內(nèi)容了。

[#33#cloudsoar@cloudsoar-virtual-machine ~]$curl localhost:32768

Hi, I am in your container

4.5.10 Dockerfile 指令

1 CMD 指令

CMD 指令用于指定一個容器啟動時候需要運行的指令。有點類似于 RUN 指令,區(qū)別是 RUN 

指令是指定鏡像被構(gòu)建時候運行的指令,而 CMD 是容器被啟動時運行的指令。

命令行啟動容器的 /bin/true

[#34#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t zhiyewang/static_web /bin/true

可以使用 CMD 寫在 Dockerfile 中:

CMD ["/bin/true"]

也可以為要運行的命令指定參數(shù)

CMD ["/bin/bash", "-l"]

需要注意的是 docker run 命令可以覆蓋 CMD 指令。如果 dockerrun 中指定了命令,而CM

 D 中也指定了相同的命令,命令行中的指令會覆蓋 Dockerfile 中的 CMD 指令。

假設(shè)我們的 Dockerfile 中有如下命令

CMD [ "/bin/bash" ]

使用 docker build 命令構(gòu)建一個新鏡像,假設(shè)為 zhiyewang/test,并基于此鏡像啟動一個新

容器。

[#35#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -t -i zhiyewang/test

root@7ec0a03d41fc:/# 

可以看到 docker run 命令的末尾并沒有指定 /bin/bash 指令,卻進(jìn)入了容器的 bash。實際上

Docker 使用了 CMD 中指定的命令。

但是 Dockerfile 中只能指定一條 CMD 指令。如果制定多個,只有最后一個會被調(diào)用。

2 ENTRYPOINT

ENTRYPONIT 指令提供的命令不會再容器啟動時被命令行覆蓋。

ENTRYPONIT ["/usr/sbin/nginx"]

為 ENTRYPOINT 指定參數(shù)

ENTRYPONIT ["/usr/sbin/nginx", "-g", "daemon off;"]

如果需要 也可以在運行時通過 docker run 的 --entrypoint 標(biāo)志覆蓋 ENTRYPOINT 指令。

3 WORKDIR

WORKDIR /opt/webapp/db

RUN bundle install

WORKDIR /opt/webapp

ENTRYPOINT [ "rackup" ]

把目錄切換到 /opt/webapp/db 指定了 bundle install 命令,然后又將工作目錄切換為 /opt

 /webapp 最后這只了 ENTRYPOINT 指令來啟動 rackup 命令。

4 ENV

ENV 可以用來在鏡像構(gòu)建過程中設(shè)置環(huán)境變量

ENV RMV_PATH /home/rvm/

這個環(huán)境變量設(shè)置后在后續(xù)的任何 RUN 中都可以使用

也可以在其他指令中直接使用這些環(huán)境變量 

RVM_PATH=/home/rvm/ gem install unicorn

ENV 創(chuàng)建的環(huán)境變量也會被持久保存到從我們的鏡像創(chuàng)建的任何容器中。比如在容器中運行

env 查看:

root@7ec0a03d41fc:/# env

... 

RVM_PATH=/home/rvm/

運行時環(huán)境變量

sudo docker run -ti -e  "WEB_PORT=8080" ubuntu env

可以講容器的 WEB_PORT 環(huán)境變量設(shè)置為 8080

5 USER

user 指令用來指定該鏡像會以什么樣的用戶去執(zhí)行

USER nginx

我們可以指定用戶名或者 UID 以及組或者 GID,甚至是兩者的組合。也可以在 docker run 命

令中通過 -u 選項來覆蓋該指令的值。如果不通過 USER 指定特定用戶,默認(rèn)是 root 。

6 VOLUME

VOLUME ["/opt/project"]

這條指令將會為基于此鏡像創(chuàng)建的任何容器創(chuàng)建一個名為 /opt/projiect 的掛載點。也可以通過

數(shù)組的方式指定多個卷。

VOLUME ["/opt/project", "/data"]

7 ADD

ADD 命令用來將構(gòu)建環(huán)境下的文件和目錄復(fù)制到鏡像中。也可以指定URL。Docker 通過目的地

址的參數(shù)末尾的字符來判斷文件源是目錄還是文件。如果目的地址以 / 結(jié)尾,Docker 認(rèn)為是一個

目錄,如果不是的話,認(rèn)為是文件。

ADD http://wordpress.org/latest.zip /root/wordpress.zip

ADD 在處理本地的歸檔文件(包括 gzip,bzip2,xv)指定為源文件時候,會自動將歸檔解壓。

ADD latest.tar.gz /var/www/wordpress/

8 COPY

COPY 和 ADD 的本質(zhì)區(qū)別是 COPY 只關(guān)心在構(gòu)建上下文中復(fù)制本地文件,而不會去做文件提

取和解壓的工作。COPY 的文件源路徑必須是一個與當(dāng)前構(gòu)建環(huán)境相對的文件或目錄,本地文

件都放到和 Dockerfile 同一個目錄下。不能復(fù)制該目錄之外的任何文件。目的為止必須是容器

內(nèi)部的一個絕對路徑。該指令創(chuàng)建的文件或者目錄的 UID 和 GID 都會被設(shè)置為 0 。

COPY conf.d/ /etc/apache2/

9 ONBUILD

 

4.6 將鏡像退送到 Docker Hub

[#37#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker push zhiyewang/static_web

The push refers to a repository [docker.io/zhiyewang/static_web] (len: 1)

e97eb7ef0136: Pushed 

6a7a53f6e78a: Pushed 

ddc8935b098a: Pushed 

40fa5cd1c3d2: Pushed 

c5aed3a8ff95: Pushed 

0b427fcc4cbb: Pushed 

9d89fd8f8a3e: Pushed 

073de23ee32b: Pushed 

latest: digest: sha256:152eb2d70e0f795fbe1b8f8c9eea09e7832a8b01e953cc051cd07832732da0ed size: 14731

現(xiàn)在可以在 Docker Hub 上看到我們的鏡像了。

 

自動構(gòu)建

 

4.7 刪除鏡像

如果不需要一個鏡像了 可以使用 docker rmi 來刪除

[#41#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker rmi zhiyewang/static_web

Error response from daemon: conflict: unable to remove repository reference "zhiyewang/static_web" (must force) - container 7ec0a03d41fc is using its referenced image e97eb7ef0136

Error: failed to remove images: [zhiyewang/static_web]

可以看到這個鏡像被一個容器 7ec0a03d41fc 使用著,首先刪除掉容器即可。 

[#53#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker rm 7ec0a03d41fc

7ec0a03d41fc

[#62#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker rmi e97eb7ef0136

Deleted: e97eb7ef013619e503bd729596a06e46ee85786619d95950e54f5a74c6fc2694

Deleted: 6a7a53f6e78a802ea932a5914e63d217acf4a47ddbedb80dab042d55297573a5

Deleted: ddc8935b098a0b449a3335286b2b0e555b3d44bd5d92dea305c57f6f7c846fae

Deleted: 40fa5cd1c3d2ae9c80763e9b787c5c9b4848a34164fc2138d2c160830505466d

Deleted: c5aed3a8ff9508b42644cef59c2b44c249628c54130fa1a030f3f2b299124ecc

這里刪除的是本地的鏡像。每一個 Deleted: 行都代表一個鏡像層被刪除。

4.8 運行自己的 Docker Registry

這個可以自己試試了。

 

到此為止,第四章學(xué)習(xí)完畢。

下一篇學(xué)習(xí)在測試中使用 Docker,用Docker 測試一個靜態(tài)網(wǎng)站,用 Docker 創(chuàng)建并測試一個

WEB 應(yīng)用,用 Docker 用于持續(xù)集成

posted @ 2016-03-17 11:01 zhiye_wang 閱讀(709) | 評論 (0)編輯 收藏

第4章 使用Docker鏡像和倉庫

回顧:

回顧如何使用 docker run 創(chuàng)建最基本的容器

$sudo docker run -i -t --name another_container_mum ubuntu /bin/bash

root@3d49f5830c81:/# 

這條命令會啟動一個新的名為 another_container_mum 的容器,這個容器基于ubuntu鏡

像并且會啟動Bash Shell

---------------------------------------------------------------------------------------------

4.1 什么是 Docker 鏡像

4.2 列出鏡像


可以看出我這里有三個鏡像。

其中 ubuntu 是我上午下載的 ubuntu 基礎(chǔ)鏡像,paulcos11/docker-tutorial 是下載的另外

一個用戶上傳的鏡像。但是不知道 CREATED 這一欄的時間怎么不準(zhǔn)。

鏡像從倉庫下載下來。鏡像保存在倉庫中。而倉庫存在于Registry中。默認(rèn)的Registry是由Do

cker公司運營的公共 Registry 服務(wù),即是 Dcoker Hub。

每個鏡像庫都可以存放很多鏡像,例如我們查看一下ubuntu倉庫中的其他鏡像,

可是使用 docker images 查看所有的 ubuntu docker 鏡像

sudo docker images

可以使用docker pull下載某個基礎(chǔ)鏡像

[#12#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull ubuntu

 

Docker Hun 中有兩種類型倉庫:用戶倉庫和頂層倉庫。用戶倉庫的鏡像都是有Docker用戶

創(chuàng)建的,而頂層倉庫則是由Docker內(nèi)部的人來管理的。用戶倉庫的命名由用戶名和倉庫名兩

部分組成,如:paulcos11/docker-tutorial,用戶名:paulcos11,倉庫名:docker-tutor

ial,與其相對的頂層倉庫只包含倉庫名部分,例如 ubuntu,fedora。頂層倉庫由Docker公

司和由選定的能提供優(yōu)質(zhì)基礎(chǔ)鏡像的廠商管理。

4.3 拉取鏡像

使用docker images可以查看本地Docker宿主機上面的鏡像。如果希望能在鏡像列表中只看

到某個鏡像的內(nèi)容,例如 fedora,可以通過在 docker images 命令后面跟指定的鏡像名來實

現(xiàn),例如: 

使用 docker pull 拉取鏡像

[#15#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker pull fedora

Using default tag: latest

latest: Pulling from library/fedora

6888fc827a3f: Pull complete 

9bdb5101e5fc: Downloading [===================>                               ] 28.63 MB/74.33 MB

4.4 查找鏡像

我本地的鏡鏡像有:

[#1#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker images

[sudo] password for cloudsoar: 

REPOSITORY                         TAG                 IMAGE ID               CREATED             VIRTUAL SIZE

paulcos11/docker-tutorial   latest              e37931352714        8 days ago          587.8 MB

ubuntu                                  latest              8ed581e3fa7a        11 days ago         188 MB

此時 fedora 鏡像還是沒有下載完畢的。不著急。我們先練習(xí)其他的操作,在 paulcos11/do

cker-tutorial 鏡像中使用 docker run 命令來從 docker-tutorial 創(chuàng)建一個容器。

[#2#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t paulcos11/docker-tutorial /bin/bash

root@869a3b2049ad:/#

可以看到,已經(jīng)從 paulcos11/docker-tutorial 鏡像啟動了一個新的容器。

4.5 構(gòu)建鏡像

構(gòu)建 Docker 鏡像有以下兩種方法:

使用 docker commit 命令。

使用 docker build 命令和 Dockerfile 文件。

4.5.1 創(chuàng)建 Docker Hub 賬號

在 hub.docker.com 創(chuàng)建一個自己的賬號,注冊之后通過收到的確認(rèn)郵件激活,下面就可以測

試剛才注冊的賬號是否可以工作了。要登錄到 docker hub,可以使用 docker login 命令。如

這里看到我是注冊成功了,用戶名只能是字母或者數(shù)組的組合。下面使用 docker login 來驗證

我的賬號:

[#4#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker login

Username: zhiyewang

Password: 

Email: zhiye_wang@yeah.net           

WARNING: login credentials saved in /home/cloudsoar/.docker/config.json

Login Succeeded

可以看到我的賬號登錄成功了。

4.5.2 使用 Docker 的 commit 命令創(chuàng)建鏡像

這里我基于前面下載的 ubuntu 鏡像來創(chuàng)建一個新鏡像。

首先我在這個基礎(chǔ)鏡像中啟動一個容器

[#5#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t ubuntu /bin/bash

root@460f5a1ac42a:/# 

在容器中安裝個 Apache 作為一個 web 服務(wù)器來運行。這樣每次使用 Apache 的時候不用再

重新安裝 Apache 了。

root@460f5a1ac42a:/# apt-get -y install apache2

Reading package lists... Done

Building dependency tree       

root@460f5a1ac42a:/# apt-get -y install vim

我喜歡用vim,同時又安裝了一個 vim,哇咔咔。

為了完成此項工作,需要先退出 exit ,然后執(zhí)行 docker commit 命令。

 

這里需要注意的是, docker commit 提交的是創(chuàng)建容器的鏡像與容器的當(dāng)前狀態(tài)之間有差異

的部分,這使得該更新非常輕量。這里可以看到我創(chuàng)建的結(jié)果。


如果像從剛才創(chuàng)建的鏡像運行一個容器,可以使用 docker run 命令

[#16#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -t -i zhiyewang/apache2 /bin/bash

root@bb634a313bf2:/# 

4.5.3 使用 Dockerfile 構(gòu)建鏡像

事實上所有資料都不推介使用 docker commit 的方法構(gòu)建鏡像,而是使用 Dockerfile 的定義

文件和 docker build 命令來構(gòu)建鏡像。

我們的第一個 Dockerfile

現(xiàn)在我們創(chuàng)建一個目錄,并在里面創(chuàng)建初始的 Dockerfile,我們將創(chuàng)建一個包含簡單 Web 服

服務(wù)器的 Docker 鏡像。


這里我們創(chuàng)建了一個名為 static_web 的目錄用來保存 Dockerfile,這個目錄就是我們的構(gòu)建環(huán)

境(build environment),Docker 則稱此環(huán)境為上下文(context)或者構(gòu)建上下文(build

 context)。Docker 會在構(gòu)建鏡像時候,將構(gòu)建上下文和該上下文中的文件和目錄上傳到 doc

 ker 守護(hù)進(jìn)程。這樣 Docker 守護(hù)進(jìn)程就能直接訪問你想在鏡像中存儲的任何代碼。

下面是一個 Dockerfile 的例子,用 Dockerfile 構(gòu)建一個能作為 Web 服務(wù)器的 Docker 鏡像。

  1 # version: 0.0.1

  2 FROM ubuntu:14.04

  3 MAINTAINER zhiyewang "zhiye_wang@yeah.net"

  4 RUN apt-get update

  5 RUN apt-get install -y nginx

  6 RUN echo 'Hi, I am in your container' \

  7     >/usr/share/nginx/html/index.html

  8 EXPOSE 80                             

命令解釋:

Dockerfile 由一系列指令和參數(shù)組成。每條指令都是大寫,而且后面需要跟一個參數(shù)。Docker

 file 會按照順序從上往下執(zhí)行。

Dockerfile 支持注釋,所有以井號開頭的都是注釋。

FROM ubuntu:14.04 指定了 ubuntu 14.04 作為基礎(chǔ)鏡像,每

執(zhí)行一條指令,對容器做出修改。自動會再指定類似 docker commit 的操作,提交一個新鏡像

層,繼續(xù)執(zhí)行下一條指令。

MAINTAINER 指令會告訴 Docker 該鏡像的作者是誰,以及作者的電子郵件地址。

接下來我們執(zhí)行了三條 RUN 指令,RUN 指令會在當(dāng)前鏡像中運行指定的命令。我們通過RUN明

令更新了 APT 倉庫,安裝了 nginx 包,之后創(chuàng)建了  /usr/share/nginx/html/index.html 文件,

默認(rèn)情況,RUN執(zhí)行會在 shell 里使用 /bin/sh -c 來執(zhí)行。如果再不支持 shell 或者不想再 shell

中運行,可以使用 exec 格式的 RUN

RUN [ "apt-get", "install", "-y", "nginx" ]

接下來的 EXPOSE 指令,告訴 Docker 該容器內(nèi)的應(yīng)用程序?qū)褂?Docker 的指定端口。但是

Docker 并不會自動打開此端口,而是需要再使用 docker run 運行容器時候指定需要打開那些端

口。

4.5.4 基于 Dockerfile 構(gòu)建新鏡像

運行 Dockerfile 

[#34#cloudsoar@cloudsoar-virtual-machine ~]$cd static_web/

[#35#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker build -t="zhiyewang/static_web" .

Sending build context to Docker daemon 2.048 kB

Step 1 : FROM ubuntu:14.04

14.04: Pulling from library/ubuntu

Digest: sha256:45b23dee08af5e43a7fea6c4cf9c25ccf269ee113168c19722f87876677c5cb2

Status: Downloaded newer image for ubuntu:14.04

 ---> 8ed581e3fa7a

Step 2 : MAINTAINER zhiyewang "zhiye_wang@yeah.net"

 ---> Running in 7806118624b7

 ---> c5aed3a8ff95

Removing intermediate container 7806118624b7

...

Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...

 ---> ddc8935b098a

Removing intermediate container c81405d28e41

Step 5 : RUN echo 'Hi, I am in your container'  >/usr/share/nginx/html/index.html

 ---> Running in f0049e284208

 ---> 6a7a53f6e78a

Removing intermediate container f0049e284208

Step 6 : EXPOSE 80

 ---> Running in 2a0714253002

 ---> e97eb7ef0136

Removing intermediate container 2a0714253002

Successfully built e97eb7ef0136

 

這里使用 -t 參數(shù)為新鏡像設(shè)置了倉庫和名稱。倉庫為 zhiyewang,名稱為 static_web,也可

以構(gòu)建過程中為鏡像添加一個標(biāo)簽,方法為“鏡像名:標(biāo)簽”
sudo docker build -t="zhiyewang/static_web:v1" .

如果沒有定制任何標(biāo)簽,Docker 會自動為鏡像設(shè)置一個 latest 標(biāo)簽。

上面命令最后的 . 告訴我們?nèi)ギ?dāng)前路徑去找 Dockerfile 文件。也可以指定一個 Git 倉庫的源地

址來指定 Dockerfile 的位置。例如

sudo docker build -t="zhiyewang/static_web:v1" \

 git@github.com:zhiyewang/docker-static_web

這里假設(shè)的在 Git 倉庫的目錄下存在 Dockerfile 文件。我也沒有注冊 Git 賬號去執(zhí)行過。

查看 docker build 過程發(fā)現(xiàn),構(gòu)建上下文已經(jīng)上傳到了 Docker 守護(hù)進(jìn)程:

Sending build context to Docker daemon 2.048 kB

之后,可以看到 Dockerfile 中的每條明令都被順序執(zhí)行,而且構(gòu)建過程的最終結(jié)果返回了新的

鏡像的 ID,即 e97eb7ef0136 ,并且 Docker 會提交每一步的執(zhí)行結(jié)果。

4.5.4 指令失敗時候會怎樣

例如我們將上面的第 4 步的包名 nginx 寫成 ngin

[#41#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker build -t="zhiyewang/static_web" .

[sudo] password for cloudsoar: 

Sending build context to Docker daemon 2.048 kB

Step 1 : FROM ubuntu:14.04

 ---> 8ed581e3fa7a

Step 2 : MAINTAINER zhiyewang "zhiye_wang@yeah.net"

 ---> Using cache

 ---> c5aed3a8ff95

Step 3 : RUN apt-get update

 ---> Using cache

 ---> 40fa5cd1c3d2

Step 4 : RUN apt-get install -y ngin

 ---> Running in 86e3dbaadf20

Reading package lists...

Building dependency tree...

Reading state information...

E: Unable to locate package ngin

The command '/bin/sh -c apt-get install -y ngin' returned a non-zero code: 100

發(fā)現(xiàn)會出錯。我們來調(diào)試一下失敗原因。用 docker run 明令來基于這次構(gòu)建到目前為止已經(jīng)

成功的最后一步創(chuàng)建一個容器,它的 ID 是 40fa5cd1c3d2 ,如下代碼:

[#42#cloudsoar@cloudsoar-virtual-machine ~/static_web]$sudo docker run -t -i 40fa5cd1c3d2 /bin/bash

root@b978996f25f3:/#

這時我們在此容器中運行第 4 步:

root@b978996f25f3:/# apt-get install -y ngin

Reading package lists... Done

Building dependency tree       

Reading state information... Done

E: Unable to locate package ngin

發(fā)現(xiàn)包名錯誤。

我們可以在這個容器中再次運行 apt-get install -y nginx,這次輸入正確的包名,來定位問題

,如果一旦解決了這個問題,就可以退出容器,用正確的包名修改 Dockerfile 文件,之后再次

構(gòu)建即可。

這一篇到這里。下一篇繼續(xù)學(xué)習(xí)Dockerfile 和構(gòu)建緩存。

posted @ 2016-03-17 11:00 zhiye_wang 閱讀(456) | 評論 (0)編輯 收藏

2016年3月15日 #

第三章 docker 入門

3.1 確保docker已經(jīng)就緒

首先查看docker程序是否存在,功能是否正常

[#3#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker info

[sudo] password for cloudsoar:

Containers: 11

Images: 16

Server Version: 1.9.1

Storage Driver: aufs

 Root Dir: /var/lib/docker/aufs

 Backing Filesystem: extfs

 Dirs: 38


3.2 運行我們的第一個容器

docker run 命令提供了Docker容器的創(chuàng)建到啟動的功能

書上使用此命令創(chuàng)建第一個容器

[#4#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run -i -t ubuntu /bin/bash 

 Unable to find image 'ubuntu:latest' locally

latest: Pulling from library/ubuntu

073de23ee32b: Downloading 48.09 MB/65.69 MB

...

可以看到有大概66MB,等待慢慢下載完成。其實Ubuntu鏡像也是一個基礎(chǔ)鏡像。

sudo docker run -i -t ubuntu /bin/bash 

這句命令我的理解就是,sudo 臨時切換管理員權(quán)限,使用 docker run 命令,啟動鏡像

ubuntu 中的 bash。docker run 會檢查本地是否有ubuntu這個基礎(chǔ)鏡像,如果沒有,

則去docker hub registry 去檢測并下載此鏡像,下載完畢再執(zhí)行。

由于容器有自己的ip,自己的shell,是獨立的。因此加上 -i 參數(shù)來打開容器的標(biāo)準(zhǔn)輸入

STDIN,使用 -t 給容器配一個交互式終端。當(dāng)新容器下載完畢后,會自動以root用戶登

錄到新的容器中。界面顯示的是:root@容器ID 。容器的主機名就是容器的ID。

假設(shè)說我們想要給這個容器安裝一個curl,或者是 ping,可以通過如下命令

sudo docker run ubuntu apt-get install -y curl

docker run 容器名 命令 


等了半個小時,還沒下載完畢,由于這個基礎(chǔ)鏡像下載實在太慢,我換了一個鏡像

我之前pull了一個名為paulcos11/docker-tutorial的鏡像,容器有11個

如果你想下載其他的鏡像,可以使用 docker search tutorial 首先查看可用鏡像。然后使用

docker pull 把它拉下來。

root@cloudsoar-virtual-machine:/home/cloudsoar# docker search tutorial

NAME                                 DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

georgeyord/reactjs-tutorial          This is the backend of the React comment b...   2                    [OK]

mhausenblas/kairosdb-tutorial        GitHub fetcher for KairosDB tutorial            1                    [OK]

odk211/spree-tutorial                                                                1                    [OK]

paulcos11/docker-tutorial            docker tutorial       


root@cloudsoar-virtual-machine:/home/cloudsoar# docker pull paulcos11/docker-tutorial

Using default tag: latest

latest: Pulling from paulcos11/docker-tutorial

044ffdf80f70: Pull complete 

...

Digest: sha256:8effcf1f4eac7096ba4eaf4a90261580657605d159946372c12ae28b7e5e74f1

Status: Downloaded newer image for paulcos11/docker-tutorial:latest

到這里,我成功下載了容器鏡像paulcos11/docker-tutorial


繼續(xù)流程,進(jìn)入我們的容器

root@cloudsoar-virtual-machine:~# docker run -i -t paulcos11/docker-tutorial /bin/bash

root@537739299f24:/# 

執(zhí)行完畢可以看到進(jìn)入了容器的bash,用戶是root,容器ID是537739299f24,


3.3 使用容器

可以使用 hostname 查看容器的主機名

root@537739299f24:/# hostname

537739299f24

可以看到容器的ID就是容器的主機名。
下一步看看 /etc/hosts 文件

root@537739299f24:/# cat /etc/hosts

172.17.0.2 537739299f24

127.0.0.1 localhost

::1 localhost ip6-localhost ip6-loopback

fe00::0 ip6-localnet

ff00::0 ip6-mcastprefix

ff02::1 ip6-allnodes

ff02::2 ip6-allrouters

可以看到docker 已經(jīng)在host文件中為該容器的ijp增加了一條主機配置項

再看看IP

root@537739299f24:/# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host 

       valid_lft forever preferred_lft forever

30: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 

    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

    inet 172.17.0.2/16 scope global eth0

       valid_lft forever preferred_lft forever

    inet6 fe80::42:acff:fe11:2/64 scope link 

       valid_lft forever preferred_lft forever

可以看到這里有l(wèi)o的回環(huán)接口。還有ip是172.17.0.2的標(biāo)準(zhǔn)eth0接口,和宿主機完全一樣。

查看容器 中的進(jìn)程

root@537739299f24:/# ps -aux

USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root          1  0.2  0.1  21944  3528 ?        Ss   03:03   0:01 /bin/bash

root         12  0.0  0.0  19188  2336 ?        R+   03:14   0:00 ps -aux

接下來,我想給容器安裝一個vim

這里我先更新下容器的源再安裝。

root@537739299f24:/# apt-get update && apt-get install vim

安裝完畢使用 exit,即可退出到宿主機系統(tǒng)。這時容器也會停止,因為一旦退出容器,

容器也隨之停止了運行。但是容器仍然存在,可以用 docker ps -a 查看容器列表。

root@537739299f24:/# exit

exit

docker ps 可以查看運行中的容器,加上 -a 參數(shù)可以查看所有的容器

3.4 容器命名

可以使用如下命令為容器指定一個合法有意義的名字。

root@cloudsoar-virtual-machine:~# docker run --name wzy_the_container -i -t paulcos11/docker-tutorial /bin/bash

root@0a09dfd688ea:/# exit

exit


3.5 重新啟動已經(jīng)停止的容器

此時,wzy_the_container 已經(jīng)停止了??梢允褂萌缦旅钪貑⒁粋€已經(jīng)停止的容器。

root@cloudsoar-virtual-machine:~# docker start wzy_the_container

wzy_the_container

也可以使用容器ID替換容器名。


3.6 附著到容器上
容器啟動的時候會按照docker run指定的參數(shù)來運行。因此這個容器啟動后會啟動一個交互

的shell。我可以使用 docker attach 直接附著到此容器。

root@cloudsoar-virtual-machine:~# docker attach wzy_the_container

root@0a09dfd688ea:/# 

可以看到重新會到了容器的Bash提示符界面。

如果退出容器的shell,容器也會隨之停止運行。


3.7 創(chuàng)建守護(hù)式容器

除了交互式運行的容器,我們也可以創(chuàng)建守護(hù)容器??梢蚤L期的運行應(yīng)用程序或者服務(wù)。

大多時候需要創(chuàng)建守護(hù)式容器。

[#10#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

cf5636f0499fa0105b845b5dfa61913ff7d5fccfb1b19c16b09ed2752233794d

由于此時第 3.2 步我下載的 Ubuntu 基礎(chǔ)鏡像Downloading 48.09 MB/65.69 MB 剛好下載

完畢,所以此時我開始使用ubuntu容器鏡像操作了。

docker run 的參數(shù) -d 是放到后臺執(zhí)行。此時我們并沒有像上一個容器直接附著到新容器的

shell會話上,而是返回了一個容器ID而已。此時使用 docker ps 可以看到正在運行的容器。


ubuntu就是我剛剛下載完畢的基礎(chǔ)鏡像。 paulcos11/docker-tutorial 是我自己下載的其他的鏡像。

3.8 容器內(nèi)部再搞什么

使用 docker logs 獲取容器日志

[#16#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker logs daemon_dave

hello world

hello world

hello world

hello world

hello world

hello world

或者可以加上-f 實時監(jiān)控容器日志。

sudo docker logs -f daemon_dave

也可以追蹤日志某一片段,只需要tail命令加入 -f --lines標(biāo)志即可。

例如: docker logs --tail 10 daemon_dave 獲取最后10行日志即可。

 docker logs --tail 0 -f daemon_dave 獲取最新日志。

如果要查看日志的時間,可以加上時間戳。

[#18#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker logs -ft daemon_dave

2016-03-15T03:45:28.457991514Z hello world

2016-03-15T03:45:29.472422582Z hello world

2016-03-15T03:45:30.475130491Z hello world


3.9 查看容器進(jìn)程

查看容器內(nèi)的進(jìn)程可以使用 docker top 命令。

[#20#cloudsoar@cloudsoar-virtual-machine ~]$sudo docker top daemon_dave

UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD

root                25381               22325               0                   11:45               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done


3.10 在容器內(nèi)部運行進(jìn)程

我們可以使用docker exec 命令在容器內(nèi)部額外啟動新進(jìn)程,可以運行的進(jìn)程有兩種類型,

交互式任務(wù)和后臺任務(wù)。首先我們使用 touch 命令創(chuàng)建一個空文件。

$sudo docker exec -d daemon_dave touch /etc/new_config_file

-d 表示是后臺進(jìn)程。

或者打開一個shell

$sudo docker exec -t -i daemon_dave /bin/bash

root@cf5636f0499f:/#


3.11 停止守護(hù)式容器

$sudo docker stop daemon_dave

daemon_dave


3.12 自動重啟容器

如果由于某種錯誤導(dǎo)致容器停止,可以通過 --restart 標(biāo)志讓docker自動重新啟動容器。

$sudo docker run --restart=on-failure:5 --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"

Error response from daemon: Conflict. The name "daemon_dave" is already in use by container cf5636f0499f. You have to remove (or rename) that container to be able to reuse that name.

這里我的運行不起來,因為 -- restart 標(biāo)示是docker 2.0 引入的。我的是docker 1.9版本。


3.13 深入容器

除了使用docker ps 查看容器信息,還可以使用 docker inspect 查看更多信息


$sudo docker inspect daemon_dave

[sudo] password for cloudsoar:

[

{

    "Id": "cf5636f0499fa0105b845b5dfa61913ff7d5fccfb1b19c16b09ed2752233794d",

    "Created": "2016-03-15T03:45:28.124542139Z",

    "Path": "/bin/sh",

    "Args": [

        "-c",

        "while true; do echo hello world; sleep 1; done"

    ],

    "State": {

        "Status": "exited",

        "Running": false,

        "Paused": false,

        "Restarting": false,

        "OOMKilled": false,

        "Dead": false,

        "Pid": 0,

        "ExitCode": 137,

        "Error": "",

        "StartedAt": "2016-03-15T03:45:28.455126857Z",

        "FinishedAt": "2016-03-15T04:05:11.945521026Z"

    },

   ...

也可使用 -f 或者 --format 標(biāo)志來選定查看結(jié)果。

$sudo docker inspect --format='{{ .State.Running}}' daemon_dave

false

以及查看其他信息

$sudo docker start daemon_dave

daemon_dave

$sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' daemon_dave

172.17.0.3


3.14 刪除容器

如果容器不在使用,可以使用 docker rm 命令刪除。

這里假設(shè)我要刪除 daemon_dave 這個容器,他的容器ID是 cf5636f0499f

$sudo docker rm cf5636f0499f

Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f

Error: failed to remove containers: [cf5636f0499f]

$sudo docker stop cf5636f0499f

cf5636f0499f

$sudo docker rm cf5636f0499f

cf5636f0499f

由于不能刪除正在運行的容器,所以需要先停止。


3.15 小結(jié)

下一章學(xué)習(xí)如何構(gòu)建自己的Docker鏡像,以及如何使用Docker 倉庫和 Docker Registry.

posted @ 2016-03-15 13:43 zhiye_wang 閱讀(730) | 評論 (0)編輯 收藏

僅列出標(biāo)題  下一頁
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品青草久久久久福利99| 欧美激情亚洲激情| 欧美国产日韩亚洲一区| 亚洲欧美日韩国产精品| 亚洲国产欧美日韩精品| 亚洲欧美精品| 亚洲欧美一级二级三级| 久久在线精品| 欧美激情国产日韩| 在线午夜精品自拍| 亚洲午夜女主播在线直播| 亚洲一区亚洲| 欧美v亚洲v综合ⅴ国产v| 欧美精品一区二区三区在线看午夜| 蜜桃久久精品乱码一区二区| 欧美午夜精品久久久| 国产午夜久久久久| 99天天综合性| 欧美在线免费观看视频| 欧美激情国产日韩| 欧美一级片久久久久久久| 久久精品成人| 国产精品久久国产精麻豆99网站| 国产精品青草综合久久久久99| 在线观看91精品国产麻豆| 亚洲国产精品va在线看黑人 | 亚洲国产日韩一区| 亚洲美女尤物影院| 久久麻豆一区二区| 国产精品久久久久久久久果冻传媒| 激情综合网址| 久久天天躁狠狠躁夜夜爽蜜月| 日韩视频三区| 欧美日韩久久久久久| 亚洲韩国日本中文字幕| 欧美黄色aa电影| 欧美高清在线一区| 国产一区二区久久久| 久久国产精品高清| 久久精品盗摄| 亚洲激情精品| 日韩午夜av| 国产精品99一区| 午夜视频一区在线观看| 亚洲一区二区黄| 国产日韩欧美三区| 免费看av成人| 国产精品久久久久77777| 午夜一区二区三视频在线观看| 欧美一级大片在线免费观看| 国产欧美精品日韩| 欧美激情第10页| 国产农村妇女精品一二区| 欧美一区二区日韩一区二区| 久久视频这里只有精品| 99v久久综合狠狠综合久久| 一区二区av| 亚洲区在线播放| 久久高清福利视频| 欧美另类69精品久久久久9999| 日韩一级大片在线| 巨乳诱惑日韩免费av| 欧美在线视频二区| 欧美视频精品一区| 欧美激情中文字幕乱码免费| 欧美三级第一页| 欧美成人午夜激情视频| 国产精品久久久久久av下载红粉| 久久国产日本精品| 欧美日韩免费观看中文| 亚洲第一毛片| 亚洲高清av在线| 久久久免费精品视频| 久久久人人人| 国产亚洲美州欧州综合国| 亚洲视频日本| 夜夜嗨av一区二区三区网站四季av| 欧美一区日韩一区| 老司机aⅴ在线精品导航| 国产一区二区剧情av在线| 亚洲美女视频在线观看| 欧美日韩免费网站| 亚洲午夜在线观看| 久久久久久91香蕉国产| 国内外成人免费激情在线视频| 欧美在线观看www| 你懂的国产精品永久在线| 日韩亚洲成人av在线| 欧美精品精品一区| 一区二区三区四区五区精品视频| 午夜在线不卡| 中文无字幕一区二区三区| 国产精品午夜春色av| 久久国产精品99国产精| 亚洲国产高清在线| 欧美一级午夜免费电影| 久久久久久国产精品mv| 亚洲国产精品免费| 久久国产精品久久久| 亚洲免费福利视频| 很黄很黄激情成人| 欧美香蕉视频| 欧美亚日韩国产aⅴ精品中极品| 亚洲精品欧美日韩专区| 欧美激情按摩| 久久亚洲不卡| 久久国产高清| 久久久亚洲高清| 亚洲综合色视频| 久久福利视频导航| 亚洲欧美在线aaa| 精品999日本| 在线精品国精品国产尤物884a| 国产日韩一区二区三区| 欧美精品色网| 国产欧美精品xxxx另类| 国产精品免费小视频| 国产精品免费看久久久香蕉| 国产精品豆花视频| 国产精品久久久久aaaa樱花| 欧美婷婷在线| 国内一区二区在线视频观看 | 久久精品国产69国产精品亚洲| 在线一区观看| 久久久久久精| 欧美精品日韩| 一区国产精品| 亚洲女ⅴideoshd黑人| 欧美99在线视频观看| 日韩视频在线一区二区| 99视频在线观看一区三区| 亚洲欧美一区二区三区久久| 欧美一区影院| 欧美久久电影| 国产亚洲va综合人人澡精品| 久久阴道视频| 欧美黑人在线观看| 欧美激情亚洲| 黄色精品在线看| 亚洲一级黄色片| 免费日韩av电影| 一区二区毛片| 欧美视频在线观看一区二区| 狠狠色狠狠色综合人人| 亚洲天堂成人在线观看| 久久久激情视频| 99国产精品视频免费观看| 蜜桃av噜噜一区| 亚洲第一视频| 欧美成人免费在线视频| 久久久久国色av免费看影院 | 在线综合亚洲欧美在线视频| 久久先锋资源| 亚洲人成在线免费观看| 欧美国产日韩亚洲一区| 久久精品亚洲一区| 国产精品―色哟哟| 噜噜噜久久亚洲精品国产品小说| 亚洲图片在线| 黄色一区二区三区| 欧美国产日本高清在线| 亚洲欧美综合精品久久成人| 欧美精选在线| 亚洲一区二区在线免费观看视频| 99精品99| 欧美成人四级电影| 欧美激情日韩| 久久久久在线观看| 老司机精品视频网站| 妖精视频成人观看www| 午夜精品免费| 一本久道久久综合中文字幕| 亚洲欧美一级二级三级| 亚洲国产第一| 久久精品水蜜桃av综合天堂| 亚洲欧洲日韩综合二区| 亚洲免费在线电影| 在线电影一区| 宅男在线国产精品| 亚洲一二区在线| 激情成人在线视频| 国产美女扒开尿口久久久| 91久久线看在观草草青青| 国产精品欧美精品| 91久久久久久国产精品| 亚洲福利在线观看| 久久九九精品| 久久深夜福利| 国产一区二区三区日韩| 亚洲图片欧美一区| 亚洲午夜三级在线| 欧美性一二三区| 日韩亚洲综合在线| 夜色激情一区二区| 国产精品v片在线观看不卡 | 亚洲破处大片| 国产精品国产三级国产专区53| 亚洲精品国产精品久久清纯直播| 亚洲国产视频一区| 欧美精品七区|