精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

五步助你成為優(yōu)秀的Docker代碼貢獻(xiàn)者

云計(jì)算
開源漸成主流,越來越多的開發(fā)者想?yún)⑴c開源社區(qū)。而時(shí)下最火熱的Docker也許就是開發(fā)者入手開源項(xiàng)目的最好選擇,它不僅是目前最流行的開源項(xiàng)目之一,而且在提交Issue方面的文檔和流程都是目前我見過的開源項(xiàng)目里最好的。本文主要介紹了如何入手開源項(xiàng)目,一些小經(jīng)驗(yàn)和小工具,一起來學(xué)習(xí)。

開源漸成主流,越來越多的開發(fā)者想?yún)⑴c開源社區(qū)。而時(shí)下最火熱的Docker也許就是開發(fā)者入手開源項(xiàng)目的***選擇,它不僅是目前***的開源項(xiàng)目之一,而且在提交Issue方面的文檔和流程都是目前我見過的開源項(xiàng)目里***的。本文主要介紹了如何入手開源項(xiàng)目,一些小經(jīng)驗(yàn)和小工具,一起來學(xué)習(xí)。

成為一個(gè)流行開源項(xiàng)目(如Docker)的貢獻(xiàn)者有如下好處:

你可以參與改進(jìn)很多人都在使用的項(xiàng)目,以此來獲得認(rèn)同感;

你可以與開源社區(qū)中的那些聰明絕頂?shù)娜送献?

你可以通過參與理解和改進(jìn)這個(gè)項(xiàng)目來使自己成為一名更加出色的程序員。

但是,從一個(gè)新的基準(zhǔn)代碼(codebase)入手絕對是一件恐怖的事情。目前,Docker已經(jīng)有相當(dāng)多的代碼了,哪怕是修復(fù)一個(gè)小問題,都需要閱讀大量的代碼,并理解這些部分是如何組合在一起的。

不過,它們也并不如你想象的那么困難。你可以根據(jù)Docker的貢獻(xiàn)者指南來完成環(huán)境的配置。然后按照如下5個(gè)簡單的步驟,配合相關(guān)的代碼片段來深入代碼基。你所歷練的這些技能,都將會(huì)在你的編程生涯的每個(gè)新項(xiàng)目中派上用場。那么還等什么,我們這就開始。

步驟1:從'func main()'開始

正如一句古話所述,從你知道的開始。如果你和大部分Docker用戶一樣,你可能主要使用Docker CLI。因此,讓我們從程序的入口開始:‘main’函數(shù)。

此處為本文的提示,我們將會(huì)使用一個(gè)名為Sourcegraph的站點(diǎn),Docker團(tuán)隊(duì)就使用它完成在線檢索和代碼瀏覽,和你使用智能IDE所做的差不多。建議在閱讀本文時(shí),打開Sourcegraph放在一邊,以更好地跟上文章的進(jìn)度。

在Sourcegraph站點(diǎn),讓我們搜索Docker倉庫中的‘func main()’。

 

[[137576]]

我們正在尋找對應(yīng)‘docker’命令的‘main’函數(shù),它是‘docker/docker/docker.go’中的一個(gè)文件。點(diǎn)擊搜索結(jié)果,我們會(huì)跳到其定義(如下所示)。花一點(diǎn)時(shí)間瀏覽一下這個(gè)函數(shù):

 

  1. func main() { 
  2. if reexec.Init() { 
  3.     return 
  4.  
  5. // Set terminal emulation based on platform as required. 
  6. stdin, stdout, stderr := term.StdStreams() 
  7.  
  8. initLogging(stderr) 
  9.  
  10. flag.Parse() 
  11. // FIXME: validate daemon flags here 
  12.  
  13. if *flVersion { 
  14.     showVersion() 
  15.     return 
  16.  
  17. if *flLogLevel != "" { 
  18.     lvl, err := logrus.ParseLevel(*flLogLevel) 
  19.     if err != nil { 
  20.         logrus.Fatalf("Unable to parse logging level: %s", *flLogLevel) 
  21.     } 
  22.     setLogLevel(lvl) 
  23. else { 
  24.     setLogLevel(logrus.InfoLevel) 
  25.  
  26. // -D, --debug, -l/--log-level=debug processing 
  27. // When/if -D is removed this block can be deleted 
  28. if *flDebug { 
  29.     os.Setenv("DEBUG""1"
  30.     setLogLevel(logrus.DebugLevel) 
  31.  
  32. if len(flHosts) == 0 { 
  33.     defaultHost := os.Getenv("DOCKER_HOST"
  34.     if defaultHost == "" || *flDaemon { 
  35.         // If we do not have a host, default to unix socket 
  36.         defaultHost = fmt.Sprintf("unix://%s", api.DEFAULTUNIXSOCKET) 
  37.     } 
  38.     defaultHost, err := api.ValidateHost(defaultHost) 
  39.     if err != nil { 
  40.         logrus.Fatal(err) 
  41.     } 
  42.     flHosts = append(flHosts, defaultHost) 
  43.  
  44. setDefaultConfFlag(flTrustKey, defaultTrustKeyFile) 
  45.  
  46. if *flDaemon { 
  47.     if *flHelp { 
  48.         flag.Usage() 
  49.         return 
  50.     } 
  51.     mainDaemon() 
  52.     return 
  53.  
  54. if len(flHosts) > 1 { 
  55.     logrus.Fatal("Please specify only one -H"
  56. protoAddrParts := strings.SplitN(flHosts[0], "://"2
  57.  
  58. var ( 
  59.     cli       *client.DockerCli 
  60.     tlsConfig tls.Config 
  61. tlsConfig.InsecureSkipVerify = true 
  62.  
  63. // Regardless of whether the user sets it to true or false, if they 
  64. // specify --tlsverify at all then we need to turn on tls 
  65. if flag.IsSet("-tlsverify") { 
  66.     *flTls = true 
  67.  
  68. // If we should verify the server, we need to load a trusted ca 
  69. if *flTlsVerify { 
  70.     certPool := x509.NewCertPool() 
  71.     file, err := ioutil.ReadFile(*flCa) 
  72.     if err != nil { 
  73.         logrus.Fatalf("Couldn't read ca cert %s: %s", *flCa, err) 
  74.     } 
  75.     certPool.AppendCertsFromPEM(file) 
  76.     tlsConfig.RootCAs = certPool 
  77.     tlsConfig.InsecureSkipVerify = false 
  78.  
  79. // If tls is enabled, try to load and send client certificates 
  80. if *flTls || *flTlsVerify { 
  81.     _, errCert := os.Stat(*flCert) 
  82.     _, errKey := os.Stat(*flKey) 
  83.     if errCert == nil && errKey == nil { 
  84.         *flTls = true 
  85.         cert, err := tls.LoadX509KeyPair(*flCert, *flKey) 
  86.         if err != nil { 
  87.             logrus.Fatalf("Couldn't load X509 key pair: %q. Make sure the key is encrypted", err) 
  88.         } 
  89.         tlsConfig.Certificates = []tls.Certificate{cert} 
  90.     } 
  91.     // Avoid fallback to SSL protocols < TLS1.0 
  92.     tlsConfig.MinVersion = tls.VersionTLS10 
  93.  
  94. if *flTls || *flTlsVerify { 
  95.     cli = client.NewDockerCli(stdin, stdout, stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], &tlsConfig) 
  96. else { 
  97.     cli = client.NewDockerCli(stdin, stdout, stderr, *flTrustKey, protoAddrParts[0], protoAddrParts[1], nil) 
  98.  
  99. if err := cli.Cmd(flag.Args()...); err != nil { 
  100.     if sterr, ok := err.(*utils.StatusError); ok { 
  101.         if sterr.Status != "" { 
  102.             logrus.Println(sterr.Status) 
  103.         } 
  104.         os.Exit(sterr.StatusCode) 
  105.     } 
  106.     logrus.Fatal(err) 
  107. }  

 

在‘main’函數(shù)的頂部,我們看了許多與日志配置,命令標(biāo)志讀取以及默認(rèn)初始化相關(guān)的代碼。在底部,我們發(fā)現(xiàn)了對『client.NewDockerCli』的調(diào)用,它似乎是用來負(fù)責(zé)創(chuàng)建結(jié)構(gòu)體的,而這個(gè)結(jié)構(gòu)體的函數(shù)則會(huì)完成所有的實(shí)際工作。讓我們來搜索『NewDockerCli』。

步驟2:找到核心部分

在很多的應(yīng)用和程序庫中,都有1到2個(gè)關(guān)鍵接口,它表述了核心功能或者本質(zhì)。讓我們嘗試到達(dá)這個(gè)關(guān)鍵部分。

點(diǎn)擊‘NewDockerCli’的搜索結(jié)果,我們會(huì)到達(dá)函數(shù)的定義。由于我們感興趣的只是這個(gè)函數(shù)所返回的結(jié)構(gòu)體——「DockerCli」,因此讓我們點(diǎn)擊返回類型來跳轉(zhuǎn)到其定義。

 

  1. func NewDockerCli(in io.ReadCloser, out, err io.Writer, keyFile string, proto, addr string, tlsConfig *tls.Config) *DockerCli { 
  2. var ( 
  3.     inFd          uintptr 
  4.     outFd         uintptr 
  5.     isTerminalIn  = false 
  6.     isTerminalOut = false 
  7.     scheme        = "http" 
  8.  
  9. if tlsConfig != nil { 
  10.     scheme = "https" 
  11. if in != nil { 
  12.     inFd, isTerminalIn = term.GetFdInfo(in
  13.  
  14. if out != nil { 
  15.     outFd, isTerminalOut = term.GetFdInfo(out
  16.  
  17. if err == nil { 
  18.     err = out 
  19.  
  20. // The transport is created here for reuse during the client session 
  21. tr := &http.Transport{ 
  22.     TLSClientConfig: tlsConfig, 
  23.  
  24. // Why 32? See issue 8035 
  25. timeout := 32 * time.Second 
  26. if proto == "unix" { 
  27.     // no need in compressing for local communications 
  28.     tr.DisableCompression = true 
  29.     tr.Dial = func(_, _ string) (net.Conn, error) { 
  30.         return net.DialTimeout(proto, addr, timeout) 
  31.     } 
  32. else { 
  33.     tr.Proxy = http.ProxyFromEnvironment 
  34.     tr.Dial = (&net.Dialer{Timeout: timeout}).Dial 
  35.  
  36. return &DockerCli{ 
  37.     proto:         proto, 
  38.     addr:          addr, 
  39.     in:            in
  40.     out:           out
  41.     err:           err, 
  42.     keyFile:       keyFile, 
  43.     inFd:          inFd, 
  44.     outFd:         outFd, 
  45.     isTerminalIn:  isTerminalIn, 
  46.     isTerminalOut: isTerminalOut, 
  47.     tlsConfig:     tlsConfig, 
  48.     scheme:        scheme, 
  49.     transport:     tr, 
  50. }  

 

點(diǎn)擊『DockerCli』將我們帶到了它的定義。向下滾動(dòng)這個(gè)文件,我們可以看到它的方法,‘getMethod’,‘Cmd’,‘Subcmd’和‘LoadConfigFile’。其中,‘Cmd’ 值得留意。它是唯一一個(gè)包含docstring的方法,而docstring則表明它是執(zhí)行每條Docker命令的核心方法。

步驟3:更進(jìn)一步

既然我們已經(jīng)找到了‘DockerCli’,這個(gè)Docker客戶端的核心‘控制器’,接下來讓我們繼續(xù)深入,了解一條具體的Docker命令是如何工作的。讓我們放大‘docker build’部分的代碼。

 

  1. type DockerCli struct { 
  2. proto      string 
  3. addr       string 
  4. configFile *registry.ConfigFile 
  5. in         io.ReadCloser 
  6. out        io.Writer 
  7. err        io.Writer 
  8. keyFile    string 
  9. tlsConfig  *tls.Config 
  10. scheme     string 
  11. // inFd holds file descriptor of the client's STDIN, if it's a valid file 
  12. inFd uintptr 
  13. // outFd holds file descriptor of the client's STDOUT, if it's a valid file 
  14. outFd uintptr 
  15. // isTerminalIn describes if client's STDIN is a TTY 
  16. isTerminalIn bool 
  17. // isTerminalOut describes if client's STDOUT is a TTY 
  18. isTerminalOut bool 
  19. transport     *http.Transport 
  20. }  

 

閱讀‘DockerCli.Cmd’的實(shí)現(xiàn)可以發(fā)現(xiàn),它調(diào)用了‘DockerCli.getMethod’方法來執(zhí)行每條Docker命令所對應(yīng)的函數(shù)。

 

  1. func (cli *DockerCli) Cmd(args ...string) error { 
  2. if len(args) > 1 { 
  3.     method, exists := cli.getMethod(args[:2]...) 
  4.     if exists { 
  5.         return method(args[2:]...) 
  6.     } 
  7. if len(args) > 0 { 
  8.     method, exists := cli.getMethod(args[0]) 
  9.     if !exists { 
  10.         fmt.Fprintf(cli.err, "docker: '%s' is not a docker command. See 'docker --help'.\n", args[0]) 
  11.         os.Exit(1
  12.     } 
  13.     return method(args[1:]...) 
  14. return cli.CmdHelp() 
  15. }  

 

在‘DockerCli.getMethod’中,我們可以看到它是通過對一個(gè)函數(shù)的動(dòng)態(tài)調(diào)用實(shí)現(xiàn)的,其中這個(gè)函數(shù)名的形式為在Docker命令前預(yù)置 “Cmd”字符串。那么在‘docker build’這個(gè)情況下,我們尋找的是‘DockerCli.CmdBuild’。但在這個(gè)文件中并沒有對應(yīng)的方法,因此讓我們需要搜索‘CmdBuild’。

 

  1. func (cli *DockerCli) getMethod(args ...string) (func(...string) error, bool) { 
  2. camelArgs := make([]string, len(args)) 
  3. for i, s := range args { 
  4.     if len(s) == 0 { 
  5.         return nil, false 
  6.     } 
  7.     camelArgs[i] = strings.ToUpper(s[:1]) + strings.ToLower(s[1:]) 
  8. methodName := "Cmd" + strings.Join(camelArgs, ""
  9. method := reflect.ValueOf(cli).MethodByName(methodName) 
  10. if !method.IsValid() { 
  11.     return nil, false 
  12. return method.Interface().(func(...string) error), true 
  13. }  

 

搜索結(jié)果顯示‘DockerCli’中確實(shí)有一個(gè)‘CmdBuild’方法,因此跳到它的定義部分。由于‘DockerCli.CmdBuild’的方法體過長,因此就不在本文中嵌入了,但是這里有它的鏈接。

這里有很多內(nèi)容。在方法的頂部,我們可以看到代碼會(huì)為Dockerfile和配置處理各種輸入方法。通常,在閱讀一個(gè)很長的方法時(shí),倒過來讀是一種很不錯(cuò)的策略。從底部開始,觀察函數(shù)在***做了什么。很多情況中,它們都是函數(shù)的本質(zhì),而之前的內(nèi)容無非只是用來補(bǔ)全核心行為的。

在‘CmdBuild’的底部,我們可以看到通過‘cli.stream’構(gòu)造的‘POST’請求。通過一些額外定義的跳轉(zhuǎn),我們到達(dá)了‘DockerCli.clientRequest’,它構(gòu)造一個(gè)HTTP請求,這個(gè)請求包含你通過‘docker build’傳遞給Docker的信息。因此在這里,‘docker build所做的就是發(fā)出一個(gè)設(shè)想的’POST‘請求給Docker守護(hù)進(jìn)程。如果你愿意,你也可以使用’curl‘來完成這個(gè)行為。

至此,我們已經(jīng)徹底了解了一個(gè)單獨(dú)的Docker客戶端命令,或許你仍希望更進(jìn)一步,找到守護(hù)進(jìn)程接受請求的部分,并一路跟蹤到它和LXC以及內(nèi)核交互的部分。這當(dāng)然是一條合理的路徑,但是我們將其作為練習(xí)留給各位讀者。接下來,讓我們對客戶端的關(guān)鍵組件有一個(gè)更加全面的認(rèn)識。

#p#

步驟4:查看使用示例

更好地理解一段代碼的方式是查看展示代碼如何被應(yīng)用的使用示例。讓我們回到'DockerCli.clientRequest'方法。在右手邊的Sourcegraph面板中,我們可以瀏覽這個(gè)方法的使用例子。結(jié)果顯示,這個(gè)方法在多處被使用,因?yàn)榇蟛糠諨ocker客戶端命令都會(huì)產(chǎn)生傳到守護(hù)進(jìn)程的HTTP請求。

 

五步助你成為優(yōu)秀的Docker代碼貢獻(xiàn)者

為了完全理解一個(gè)代碼片段,你需要同時(shí)知曉它是如何工作的以及是如何來使用的。通過閱讀代碼的定義部分讓我們理解前者,而查看使用示例則是涵蓋了后者。

請?jiān)诟嗟暮瘮?shù)和方法上嘗試,理解它們的內(nèi)部聯(lián)系。如果這有幫助,那么請就應(yīng)用的不同模塊如何交互,畫一張圖。

步驟5:選擇一個(gè)問題并開始coding

既然你已經(jīng)對Docker的代碼基有了一個(gè)大概的認(rèn)識,那么可以查閱一下issue跟蹤系統(tǒng),看看哪些問題亟待解決,并在遇到你自己無法回答的問題時(shí),向Docker社區(qū)的成員申援。由于你已經(jīng)花了時(shí)間來摸索并理解代碼,那么你應(yīng)該已經(jīng)具備條件來提出“聰明”的問題,并知道問題大概出在哪里。

如果你覺得有必要,可以一路做好筆記,記錄你的經(jīng)歷,并像本文一樣作為博客發(fā)布。Docker團(tuán)隊(duì)會(huì)很樂意看到,你研究他們代碼的經(jīng)歷。

有效地貢獻(xiàn)

對一個(gè)巨大且陌生的基準(zhǔn)代碼的恐懼,儼然已經(jīng)成為了一個(gè)阻止人們參與到項(xiàng)目中的誤解。我們經(jīng)常假設(shè),對于程序員而言,工作的難點(diǎn)在于寫代碼,然而閱讀并理解他人的代碼卻往往是最關(guān)鍵的一步。認(rèn)識到這一切,并堅(jiān)定地迎接任務(wù),輔以優(yōu)秀的工具,會(huì)幫助你克服心理防線,以更好地投入到代碼中。

那么,開始動(dòng)手吧,檢查一下Docker今天的代碼。一個(gè)充滿活力的開源社區(qū)和基準(zhǔn)代碼正等著你!

原文鏈接:http://dockone.io/article/450

責(zé)任編輯:Ophira 來源: dockerone
相關(guān)推薦

2019-12-18 23:11:24

TF架構(gòu)網(wǎng)絡(luò)連接

2015-07-22 16:08:46

OpenStack開源貢獻(xiàn)代碼

2020-06-18 11:14:53

微軟谷歌開源

2015-05-19 09:11:32

OpenStackOpenStack貢獻(xiàn)

2020-04-17 13:01:38

ASFApache董事會(huì)

2022-03-26 10:18:26

GoogleRust獲獎(jiǎng)?wù)?/a>

2009-07-21 08:41:52

Linux內(nèi)核開源操作系統(tǒng)Intel

2016-02-01 09:24:24

Quora排行算法

2015-09-08 09:05:16

貢獻(xiàn)者維基Linux

2013-09-09 12:35:54

MongoDB

2011-07-01 09:26:12

2019-01-21 08:00:00

谷歌開源數(shù)據(jù)

2023-09-19 07:20:33

2020-03-05 13:40:49

Java開發(fā)工具

2016-10-27 16:03:28

Easystack開源

2022-06-08 08:55:15

JavaScript代碼前端

2021-07-07 09:41:16

CentOS CentOS StreCentOS Stre

2024-02-28 07:48:05

Rust項(xiàng)目框架

2024-02-04 13:33:57

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国产精品福利在线观看| 国产亚洲欧美日韩美女| 乱人伦xxxx国语对白| 九色在线免费| 国产精品一区在线| 国产ts人妖一区二区三区| 国产黄在线免费观看| 欧美wwwsss9999| 欧美精品一二三| 男人揉女人奶房视频60分| 精品黄色免费中文电影在线播放| 成人v精品蜜桃久久一区| 国产精品video| 国产精品成人av久久| 清纯唯美综合亚洲| 亚洲久久久久久久久久久| 丰满少妇中文字幕| 国内精品伊人| 色婷婷国产精品| www.夜夜爱| 日韩美女网站| 国产亚洲婷婷免费| 精品一区二区视频| 丰满熟妇人妻中文字幕| 麻豆精品在线视频| 国产97免费视| 五月天婷婷激情| 欧美日韩专区| 蜜臀久久99精品久久久无需会员| 性猛交ⅹxxx富婆video| 欧美调教在线| 欧美精品一区二区三区四区| 亚洲成人手机在线观看| 久久久久久久性潮| 欧美在线一区二区| 成人小视频在线看| 中文字幕不卡三区视频| 午夜国产精品一区| 人妻夜夜添夜夜无码av| 亚洲欧美成人影院| 亚洲精品水蜜桃| 警花观音坐莲激情销魂小说| av电影在线网| 国产精品色呦呦| 午夜欧美性电影| 成年人视频在线免费观看| 91丨porny丨中文| 九色91视频| 女人偷人在线视频| 久久久久久毛片| 欧美一级爱爱| 国产高清在线观看| 国产精品色婷婷| 在线看成人av电影| av在线免费网站| 亚洲精品成人精品456| 超碰10000| 激情影院在线| 婷婷成人综合网| 激情网站五月天| 欧美最新精品| 欧美日韩亚洲另类| 日本网站在线看| 视频成人永久免费视频| 亚洲国产欧美精品| 国精品无码人妻一区二区三区| 久久91麻豆精品一区| 一区二区三区黄色| 青青青视频在线播放| 性欧美欧美巨大69| 国色天香2019中文字幕在线观看| 日日夜夜综合网| 日韩va欧美va亚洲va久久| 国产精品普通话| 国产v片在线观看| 国产91露脸合集magnet| 久久久99国产精品免费| av基地在线| 亚洲综合丝袜美腿| 日本中文字幕片| 色成人综合网| 亚洲电影在线观看| 99久久99久久精品免费看小说.| 久久精品影视| 欧美一级免费看| 6—12呦国产精品| 成人黄色一级视频| 色噜噜一区二区| 欧美家庭影院| 欧美影视一区在线| av免费观看不卡| av永久不卡| 欧美极品少妇xxxxx| 日本久久综合网| 国产一区二区三区美女| 欧美午夜精品久久久久免费视| av黄色在线观看| 午夜精品免费在线| 九九热免费在线观看| 免费福利视频一区| 久久国产精品影视| 无码久久精品国产亚洲av影片| 国产麻豆成人传媒免费观看| 欧美激情国产日韩| 中文字幕在线播放网址| 91福利精品第一导航| 97中文字幕在线观看| 日韩欧美中文| 欧美专区福利在线| 乱色精品无码一区二区国产盗| 日本一区二区不卡视频| 91好吊色国产欧美日韩在线| 国产精久久一区二区| 国产一区二区三区视频在线观看 | 第一会所亚洲原创| 3344国产精品免费看| 性生交生活影碟片| 中文字幕色av一区二区三区| 午夜视频在线瓜伦| 伊人久久大香线蕉无限次| 韩国欧美亚洲国产| 国产极品999| 一区在线中文字幕| 自拍偷拍 国产| 天堂日韩电影| 午夜精品福利在线观看| www.成人在线观看| 亚洲三级久久久| 91亚洲精品久久久蜜桃借种| 欧美码中文字幕在线| 91产国在线观看动作片喷水| 性一交一乱一乱一视频| 亚洲精品一二三| 性生活一级大片| 亚洲一区二区日韩| 91久久国产婷婷一区二区| 91成人高清| 欧美日韩中字一区| 四季av中文字幕| 日本sm残虐另类| 午夜精品一区二区三区四区| 成人福利片在线| 深夜福利91大全| 亚洲无码精品在线播放| 国产精品久久久久久久久久免费看| 男女av免费观看| 亚洲图片久久| 国产精品美女www爽爽爽视频| 91精品大全| 欧美精品高清视频| 久久久精品少妇| 国产在线观看一区二区| 91国在线高清视频| 欧美jizz19性欧美| 国产福利成人在线| 色开心亚洲综合| 欧美一二区视频| 国产污片在线观看| 2024国产精品视频| 日韩av手机版| 欧美永久精品| 激情五月综合色婷婷一区二区 | 国产一区二区三区久久久久久久久 | 欧美午夜小视频| 日韩有码av| 国产精品9999| 成人区精品一区二区不卡| 欧美一区2区视频在线观看| 久久久一二三区| 91美女蜜桃在线| 亚洲成人天堂网| 这里只有精品在线| 九色综合日本| 亚洲成人精品综合在线| 久久久久久久999| 国产精品毛片一区二区三区四区| 欧美日韩中文国产| 精品少妇theporn| 国产亚洲欧美激情| 在线不卡一区二区三区| 影音先锋亚洲一区| 水蜜桃亚洲精品| 欧美影院精品| 国产盗摄xxxx视频xxx69| 一色桃子av在线| 亚洲人成网站999久久久综合| 亚洲自拍偷拍另类| 精品国产乱码久久久久久虫虫漫画 | www.亚洲天堂网| 91成人影院| 免费一区二区三区| 日韩高清在线观看一区二区| 欧美孕妇与黑人孕交| 日本www在线观看视频| 精品国产精品一区二区夜夜嗨| 亚洲无码精品一区二区三区| 悠悠色在线精品| 鲁丝一区二区三区| 99麻豆久久久国产精品免费优播| av中文字幕网址| 久久久精品午夜少妇| 欧美日韩一区二区三区电影| 中国av一区| 成人永久免费| 电影中文字幕一区二区| 国产97在线亚洲| 欧美aaaxxxx做受视频| 这里只有精品在线播放| 手机在线精品视频| 日韩欧美一区二区久久婷婷| 正在播放木下凛凛xv99| 欧美日韩裸体免费视频| 久久久久亚洲AV| 亚洲欧美视频在线观看| 日本在线观看网址| 久久久久久99精品| 国产成人av无码精品| 国产精品影视在线观看| 欧美三级午夜理伦三级富婆| 欧美在线综合| 女人天堂av手机在线| 激情久久一区| 国产乱子伦精品无码专区| 91九色精品| 亚洲欧洲中文| 欧美综合视频| 日韩精品国内| 国产一区二区三区探花| 欧美凹凸一区二区三区视频| 久久亚洲黄色| 精品91免费| 美女av一区| 久久久福利视频| 欧美绝顶高潮抽搐喷水合集| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 国产高清自拍视频| 97精品久久久久中文字幕| 稀缺小u女呦精品呦| 成人国产一区二区三区精品| 亚洲成人精品在线播放| 国产高清不卡二三区| 中文在线字幕观看| 懂色av中文一区二区三区| 亚洲精品乱码久久久久久9色| 激情文学综合丁香| 少妇性l交大片7724com| 国产91精品久久久久久久网曝门| www.色.com| 成人免费视频播放| 三级视频网站在线观看| 99久久99久久精品国产片果冻| 日韩av无码一区二区三区不卡| 99精品欧美一区| 成人免费看aa片| 日本一区二区三区在线不卡| 久久久久人妻一区精品色| 亚洲欧美综合色| 久久久久久久9999| 欧美日韩国产精品| 国产成人a v| 欧美顶级少妇做爰| 黄色av小说在线观看| 亚洲精品自拍视频| 午夜视频成人| 欧美激情国产精品| 午夜裸体女人视频网站在线观看| 青青草一区二区| 色婷婷成人网| 国产精品免费看一区二区三区| 亚洲婷婷伊人| 欧美日韩视频免费在线观看| 国产在线欧美| 国产真实乱子伦| 国内一区二区在线| 亚洲精品国产成人av在线| 久久日韩精品一区二区五区| 国产破处视频在线观看| 亚洲一线二线三线久久久| www.中文字幕在线观看| 欧美区一区二区三区| 国产成人手机在线| 亚洲人午夜精品| 污视频免费在线观看| 欧美在线不卡区| 麻豆国产一区二区三区四区| 久久精品国产一区二区三区不卡| 日韩国产一区| 自拍日韩亚洲一区在线| 日韩黄色片在线观看| 亚洲欧美激情一区二区三区| 国产肉丝袜一区二区| 久艹视频在线观看| 在线中文字幕一区| 人妻一区二区三区| 色av中文字幕一区| 性欧美18~19sex高清播放| 亚洲一区二区中文| 欧美日韩国产一区二区三区不卡| 久久香蕉视频网站| 日本美女一区二区三区视频| 白嫩情侣偷拍呻吟刺激| √…a在线天堂一区| 中文人妻av久久人妻18| 亚洲第一网站男人都懂| 欧美三级理伦电影| 国产精品va在线播放| 免费成人蒂法| 日本一本中文字幕| 国产精品亚洲一区二区三区妖精| 国产毛片久久久久久久| 亚洲电影在线播放| 国产黄色美女视频| 日韩最新在线视频| 另类中文字幕国产精品| 久久精品中文字幕一区二区三区 | 99久久久久久中文字幕一区| 欧美精品一区免费| 国产成a人无v码亚洲福利| 永久av免费网站| 欧美日韩中文另类| 国产高清免费av在线| 2020久久国产精品| 久久精品国产亚洲blacked| 超碰人人爱人人| 国产精品888| 少妇aaaaa| 91精品在线免费观看| 午夜精品一区| 国产精品欧美激情| 欧美一区二区三区激情视频| 亚洲熟女乱色一区二区三区 | 综合 欧美 亚洲日本| 一本到一区二区三区| 日本福利午夜视频在线| 97福利一区二区| julia中文字幕一区二区99在线| 国产精品一二三在线观看| 国产呦萝稀缺另类资源| 国产精品国产精品88| 欧美一区二区三区的| av在线网址观看| 99在线视频首页| 亚洲午夜久久久久久尤物 | 久久久久久久综合色一本| 色av性av丰满av| 一个色综合导航| 国产精品原创视频| 一区二区免费在线观看| 久久国产精品区| 欧美爱爱小视频| 亚洲成人xxx| 久久uomeier| 亚洲午夜精品久久久中文影院av| 久色婷婷小香蕉久久| 加勒比婷婷色综合久久| 日韩欧美成人一区二区| 55av亚洲| 欧美亚洲精品日韩| 美女一区二区久久| 国产稀缺精品盗摄盗拍| 精品国产一区久久| 丝袜诱惑一区二区| 亚洲三区在线观看| 国产高清久久久久| 国内精品福利视频| 中文字幕亚洲欧美一区二区三区 | 性高潮久久久久久久久| 久久99国产精品久久99果冻传媒| 性欧美疯狂猛交69hd| 亚洲成人999| 久久亚洲精品爱爱| 青青草视频国产| 久久久噜噜噜久久人人看| 国产精品福利电影| 国内外成人免费激情在线视频网站 | 91嫩草国产丨精品入口麻豆| 成人av第一页| 中日精品一色哟哟| 国产做受高潮69| 欧美丝袜激情| 免费黄色在线播放| 在线欧美一区二区| xxx在线免费观看| 日韩欧美精品一区二区三区经典| 国产精品自拍在线| 99精品人妻国产毛片| 久久成人精品视频| 九九亚洲视频| 少妇极品熟妇人妻无码| 色8久久精品久久久久久蜜| 超碰在线免费公开| 青青成人在线| 成人免费高清在线观看| 中文字幕一区二区三区人妻四季| 久久久久久国产精品| 久久美女精品| 亚洲av无码国产精品久久| 欧美一区日韩一区| 99欧美精品| 男人靠女人免费视频网站|