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

新手指南:通過Docker在Linux上托管.NET Core

系統 Linux 系統運維
這篇文章基于我之前的文章 .NET Core 入門。首先,我把 RESTful API 從 .NET Core RC1 升級到了 .NET Core 1.0,然后,我增加了對 Docker 的支持并描述了如何在 Linux 生產環境里托管它。

這篇文章基于我之前的文章 .NET Core 入門。首先,我把 RESTful API 從 .NET Core RC1 升級到了 .NET Core 1.0,然后,我增加了對 Docker 的支持并描述了如何在 Linux 生產環境里托管它。

我是首次接觸 Docker 并且距離成為一名 Linux 高手還有很遠的一段路程。因此,這里的很多想法是來自一個新手。

安裝

按照 https://www.microsoft.com/net/core 上的介紹在你的電腦上安裝 .NET Core 。這將會同時在 Windows 上安裝 dotnet 命令行工具以及最新的 Visual Studio 工具。

源代碼

你可以直接到 GitHub 上找最到最新完整的源代碼。

轉換到 .NET CORE 1.0

自然地,當我考慮如何把 API 從 .NET Core RC1 升級到 .NET Core 1.0 時想到的第一個求助的地方就是谷歌搜索。我是按照下面這兩條非常全面的指導來進行升級的:

當你遷移代碼的時候,我建議仔細閱讀這兩篇指導,因為我在沒有閱讀第一篇指導的情況下又嘗試瀏覽第二篇,結果感到非常迷惑和沮喪。

我不想描述細節上的改變因為你可以看 GitHub 上的提交。這兒是我所作改變的總結:

  • 更新 global.json 和 project.json 上的版本號
  • 刪除 project.json 上的廢棄章節
  • 使用輕型 ControllerBase 而不是 Controller, 因為我不需要與 MVC 視圖相關的方法(這是一個可選的改變)。
  • 從輔助方法中去掉 Http 前綴,比如:HttpNotFound -> NotFound
  • LogVerbose -> LogTrace
  • 名字空間改變: Microsoft.AspNetCore.*
  • 在 Startup 中使用 SetBasePath(沒有它 appsettings.json 將不會被發現)
  • 通過 WebHostBuilder 來運行而不是通過 WebApplication.Run 來運行
  • 刪除 Serilog(在寫文章的時候,它不支持 .NET Core 1.0)

唯一令我真正頭疼的事是需要移動 Serilog。我本可以實現自己的文件記錄器,但是我刪除了文件記錄功能,因為我不想為了這次操作在這件事情上花費精力。

不幸的是,將有大量的第三方開發者扮演追趕 .NET Core 1.0 的角色,我非常同情他們,因為他們通常在休息時間還堅持工作但卻依舊根本無法接近靠攏微軟的可用資源。我建議閱讀 Travis Illig 的文章 .NET Core 1.0 發布了,但 Autofac 在哪兒?這是一篇關于第三方開發者觀點的文章。

做了這些改變以后,我可以從 project.json 目錄恢復、構建并運行 dotnet,可以看到 API 又像以前一樣工作了。

通過 Docker 運行

在我寫這篇文章的時候, Docker 只能夠在 Linux 系統上工作。在 Windows 系統和 OS X 上有 beta 支持 Docker,但是它們都必須依賴于虛擬化技術,因此,我選擇把 Ubuntu 14.04 當作虛擬機來運行。如果你還沒有安裝過 Docker,請按照指導來安裝。

我最近閱讀了一些關于 Docker 的東西,但我直到現在還沒有真正用它來干任何事。我假設讀者還沒有關于 Docker 的知識,因此我會解釋我所使用的所有命令。

HELLO DOCKER

在 Ubuntu 上安裝好 Docker 之后,我所進行的下一步就是按照 https://www.microsoft.com/net/core#docker 上的介紹來開始運行 .NET Core 和 Docker。

首先啟動一個已安裝有 .NET Core 的容器。 

  1. docker run -it microsoft/dotnet:latest 

-it 選項表示交互,所以你執行這條命令之后,你就處于容器之內了,可以如你所希望的那樣執行任何 bash 命令。

然后我們可以執行下面這五條命令來在 Docker 內部運行起來微軟 .NET Core 控制臺應用程序示例。

  1. mkdir hwapp
  2. cd hwapp
  3. dotnet new
  4. dotnet restore
  5. dotnet run 

你可以通過運行 exit 來離開容器,然后運行 Docker ps -a 命令,這會顯示你創建的那個已經退出的容器。你可以通過上運行命令 Docker rm <container_name> 來清除容器。

掛載源代碼

我的下一步驟是使用和上面相同的 microsoft/dotnet 鏡像,但是將為我們的應用程序以數據卷的方式掛載上源代碼。

首先簽出有相關提交的倉庫:

  1. git clone https://github.com/niksoper/aspnet5-books.git 
  2. cd aspnet5-books/src/MvcLibrary 
  3. git checkout dotnet-core-1.0 

現在啟動一個容器來運行 .NET Core 1.0,并將源代碼放在 /book 下。注意更改 /path/to/repo 這部分文件來匹配你的電腦:

  1. docker run -it \ 
  2. -v /path/to/repo/aspnet5-books/src/MvcLibrary:/books \ 
  3. microsoft/dotnet:latest 

現在你可以在容器中運行應用程序了!

  1. cd /books 
  2. dotnet restore 
  3. dotnet run 

作為一個概念性展示這的確很棒,但是我們可不想每次運行一個程序都要考慮如何把源代碼安裝到容器里。

增加一個 DOCKERFILE

我的下一步驟是引入一個 Dockerfile,這可以讓應用程序很容易在自己的容器內啟動。

我的 Dockerfile 和 project.json 一樣位于 src/MvcLibrary 目錄下,看起來像下面這樣:

  1. FROM microsoft/dotnet:latest 
  2. # 為應用程序源代碼創建目錄 
  3. RUN mkdir -p /usr/src/books 
  4. WORKDIR /usr/src/books 
  5. # 復制源代碼并恢復依賴關系 
  6. COPY . /usr/src/books 
  7. RUN dotnet restore 
  8. # 暴露端口并運行應用程序 
  9. EXPOSE 5000 
  10. CMD [ "dotnet""run" ] 

嚴格來說,RUN mkdir -p /usr/src/books 命令是不需要的,因為 COPY 會自動創建丟失的目錄。

Docker 鏡像是按層建立的,我們從包含 .NET Core 的鏡像開始,添加另一個從源代碼生成應用程序,然后運行這個應用程序的層。

添加了 Dockerfile 以后,我通過運行下面的命令來生成一個鏡像,并使用生成的鏡像啟動一個容器(確保在和 Dockerfile 相同的目錄下進行操作,并且你應該使用自己的用戶名)。

  1. docker build -t niksoper/netcore-books . 
  2. docker run -it niksoper/netcore-books 

你應該看到程序能夠和之前一樣的運行,不過這一次我們不需要像之前那樣安裝源代碼,因為源代碼已經包含在 docker 鏡像里面了。

暴露并發布端口

這個 API 并不是特別有用,除非我們需要從容器外面和它進行通信。 Docker 已經有了暴露和發布端口的概念,但這是兩件完全不同的事。

據 Docker 官方文檔:

EXPOSE 指令通知 Docker 容器在運行時監聽特定的網絡端口。EXPOSE 指令不能夠讓容器的端口可被主機訪問。要使可被訪問,你必須通過 -p 標志來發布一個端口范圍或者使用 -P 標志來發布所有暴露的端口

EXPOSE 指令只是將元數據添加到鏡像上,所以你可以如文檔中說的認為它是鏡像消費者。從技術上講,我本應該忽略 EXPOSE 5000 這行指令,因為我知道 API 正在監聽的端口,但把它們留下很有用的,并且值得推薦。

在這個階段,我想直接從主機訪問這個 API ,因此我需要通過 -p 指令來發布這個端口,這將允許請求從主機上的端口 5000 轉發到容器上的端口 5000,無論這個端口是不是之前通過 Dockerfile 暴露的。

  1. docker run -d -p 5000:5000 niksoper/netcore-books 

通過 -d 指令告訴 docker 在分離模式下運行容器,因此我們不能看到它的輸出,但是它依舊會運行并監聽端口 5000。你可以通過 docker ps 來證實這件事。

因此,接下來我準備從主機向容器發起一個請求來慶祝一下:

  1. curl http://localhost:5000/api/books 

它不工作。

重復進行相同 curl 請求,我看到了兩個錯誤:要么是 curl: (56) Recv failure: Connection reset by peer,要么是 curl: (52) Empty reply from server。

我返回去看 docker run 的文檔,然后再次檢查我所使用的 -p 選項以及 Dockerfile 中的 EXPOSE 指令是否正確。我沒有發現任何問題,這讓我開始有些沮喪。

重新振作起來以后,我決定去咨詢當地的一個 Scott Logic DevOps 大師 - Dave Wybourn(也在這篇 Docker Swarm 的文章里提到過),他的團隊也曾遇到這個實際問題。這個問題是我沒有配置過 Kestral,這是一個全新的輕量級、跨平臺 web 服務器,用于 .NET Core 。

默認情況下, Kestrel 會監聽 http://localhost:5000。但問題是,這兒的 localhost 是一個回路接口。

據維基百科:

在計算機網絡中,localhost 是一個代表本機的主機名。本地主機可以通過網絡回路接口訪問在主機上運行的網絡服務。通過使用回路接口可以繞過任何硬件網絡接口。

當運行在容器內時這是一個問題,因為 localhost 只能夠在容器內訪問。解決方法是更新 Startup.cs 里的 Main 方法來配置 Kestral 監聽的 URL:

  1. public static void Main(string[] args) 
  2.   var host = new WebHostBuilder() 
  3.     .UseKestrel() 
  4.     .UseContentRoot(Directory.GetCurrentDirectory()) 
  5.     .UseUrls("http://*:5000") // 在所有網絡接口上監聽端口 5000 
  6.     .UseIISIntegration() 
  7.     .UseStartup<Startup>() 
  8.     .Build(); 
  9.   host.Run(); 

通過這些額外的配置,我可以重建鏡像,并在容器中運行應用程序,它將能夠接收來自主機的請求:

  1. docker build -t niksoper/netcore-books . 
  2. docker run -d -p 5000:5000 niksoper/netcore-books 
  3. curl -i http://localhost:5000/api/books 

我現在得到下面這些相應:

  1. HTTP/1.1 200 OK 
  2. Date: Tue, 30 Aug 2016 15:25:43 GMT 
  3. Transfer-Encoding: chunked 
  4. Content-Type: application/json; charset=utf-8 
  5. Server: Kestrel 
  6. [{"id":"1","title":"RESTful API with ASP.NET Core MVC 1.0","author":"Nick Soper"}] 

在產品環境中運行 KESTREL

微軟的介紹:

Kestrel 可以很好的處理來自 ASP.NET 的動態內容,然而,網絡服務部分的特性沒有如 IIS,Apache 或者 Nginx 那樣的全特性服務器那么好。反向代理服務器可以讓你不用去做像處理靜態內容、緩存請求、壓縮請求、SSL 端點這樣的來自 HTTP 服務器的工作。

因此我需要在我的 Linux 機器上把 Nginx 設置成一個反向代理服務器。微軟介紹了如何發布到 Linux 生產環境下的指導教程。我把說明總結在這兒:

  1. 通過 dotnet publish 來給應用程序產生一個自包含包。
  2. 把已發布的應用程序復制到服務器上
  3. 安裝并配置 Nginx(作為反向代理服務器)
  4. 安裝并配置 supervisor(用于確保 Nginx 服務器處于運行狀態中)
  5. 安裝并配置 AppArmor(用于限制應用的資源使用)
  6. 配置服務器防火墻
  7. 安全加固 Nginx(從源代碼構建和配置 SSL)

這些內容已經超出了本文的范圍,因此我將側重于如何把 Nginx 配置成一個反向代理服務器。自然地,我通過 Docker 來完成這件事。

在另一個容器中運行 NGINX

我的目標是在第二個 Docker 容器中運行 Nginx 并把它配置成我們的應用程序容器的反向代理服務器。

我使用的是來自 Docker Hub 的官方 Nginx 鏡像。首先我嘗試這樣做:

  1. docker run -d -p 8080:80 --name web nginx 

這啟動了一個運行 Nginx 的容器并把主機上的 8080 端口映射到了容器的 80 端口上。現在在瀏覽器中打開網址 http://localhost:8080 會顯示出 Nginx 的默認登錄頁面。

現在我們證實了運行 Nginx 是多么的簡單,我們可以關閉這個容器。

  1. docker rm -f web 

把 NGINX 配置成一個反向代理服務器

可以通過像下面這樣編輯位于 /etc/nginx/conf.d/default.conf 的配置文件,把 Nginx 配置成一個反向代理服務器:

  1. server { 
  2.   listen 80; 
  3.   location / { 
  4.     proxy_pass http://localhost:6666; 
  5.   } 

通過上面的配置可以讓 Nginx 將所有對根目錄的訪問請求代理到 http://localhost:6666。記住這里的 localhost 指的是運行 Nginx 的容器。我們可以在 Nginx容器內部利用卷來使用我們自己的配置文件:

  1. docker run -d -p 8080:80 \ 
  2. -v /path/to/my.conf:/etc/nginx/conf.d/default.conf \ 
  3. nginx 

注意:這把一個單一文件從主機映射到容器中,而不是一個完整目錄。

在容器間進行通信

Docker 允許內部容器通過共享虛擬網絡進行通信。默認情況下,所有通過 Docker 守護進程啟動的容器都可以訪問一種叫做“橋”的虛擬網絡。這使得一個容器可以被另一個容器在相同的網絡上通過 IP 地址和端口來引用。

你可以通過監測(inspect)容器來找到它的 IP 地址。我將從之前創建的 niksoper/netcore-books 鏡像中啟動一個容器并監測(inspect)它:

  1. docker run -d -p 5000:5000 --name books niksoper/netcore-books 
  2. docker inspect books  

 

 

我們可以看到這個容器的 IP 地址是 "IPAddress": "172.17.0.3"。

所以現在如果我創建下面的 Nginx 配置文件,并使用這個文件啟動一個 Nginx 容器, 它將代理請求到我的 API :

  1. server { 
  2.   listen 80; 
  3.   location / { 
  4.     proxy_pass http://172.17.0.3:5000; 
  5.   } 

現在我可以使用這個配置文件啟動一個 Nginx 容器(注意我把主機上的 8080 端口映射到了 Nginx 容器上的 80 端口):

  1. docker run -d -p 8080:80 \ 
  2. -v ~/dev/nginx/my.nginx.conf:/etc/nginx/conf.d/default.conf \ 
  3. nginx 

一個到 http://localhost:8080 的請求將被代理到應用上。注意下面 curl 響應的 Server 響應頭: 

 

 

DOCKER COMPOSE

在這個地方,我為自己的進步而感到高興,但我認為一定還有更好的方法來配置 Nginx,可以不需要知道應用程序容器的確切 IP 地址。另一個當地的 Scott Logic DevOps 大師 Jason Ebbin 在這個地方進行了改進,并建議使用 Docker Compose。

概況描述一下,Docker Compose 使得一組通過聲明式語法互相連接的容器很容易啟動。我不想再細說 Docker Compose 是如何工作的,因為你可以在之前的文章中找到。

我將通過一個我所使用的 docker-compose.yml 文件來啟動:

  1. version: '2' 
  2. services: 
  3.     books-service: 
  4.         container_name: books-api 
  5.         build: . 
  6.     reverse-proxy: 
  7.         container_name: reverse-proxy 
  8.         image: nginx 
  9.         ports: 
  10.          - "9090:8080" 
  11.         volumes: 
  12.          - ./proxy.conf:/etc/nginx/conf.d/default.conf 

這是版本 2 語法,所以為了能夠正常工作,你至少需要 1.6 版本的 Docker Compose。

這個文件告訴 Docker 創建兩個服務:一個是給應用的,另一個是給 Nginx 反向代理服務器的。

BOOKS-SERVICE

這個與 docker-compose.yml 相同目錄下的 Dockerfile 構建的容器叫做 books-api。注意這個容器不需要發布任何端口,因為只要能夠從反向代理服務器訪問它就可以,而不需要從主機操作系統訪問它。

REVERSE-PROXY

這將基于 nginx 鏡像啟動一個叫做 reverse-proxy 的容器,并將位于當前目錄下的 proxy.conf 文件掛載為配置。它把主機上的 9090 端口映射到容器中的 8080 端口,這將允許我們在 http://localhost:9090 上通過主機訪問容器。

proxy.conf 文件看起來像下面這樣:

  1. server { 
  2.     listen 8080; 
  3.     location / { 
  4.       proxy_pass http://books-service:5000; 
  5.     } 

這兒的關鍵點是我們現在可以通過名字引用 books-service,因此我們不需要知道 books-api 這個容器的 IP 地址!

現在我們可以通過一個運行著的反向代理啟動兩個容器(-d 意味著這是獨立的,因此我們不能看到來自容器的輸出):

  1. docker compose up -d 

驗證我們所創建的容器:

  1. docker ps 

最后來驗證我們可以通過反向代理來控制該 API :

  1. curl -i http://localhost:9090/api/books 

怎么做到的?

Docker Compose 通過創建一個新的叫做 mvclibrary_default 的虛擬網絡來實現這件事,這個虛擬網絡同時用于 books-api 和 reverse-proxy 容器(名字是基于 docker-compose.yml 文件的父目錄)。

通過 docker network ls 來驗證網絡已經存在: 

 

 

 你可以使用 docker network inspect mvclibrary_default 來看到新的網絡的細節: 

 

 

注意 Docker 已經給網絡分配了子網:"Subnet": "172.18.0.0/16"。/16 部分是無類域內路由選擇(CIDR),完整的解釋已經超出了本文的范圍,但 CIDR 只是表示 IP 地址范圍。運行 docker network inspect bridge 顯示子網:"Subnet": "172.17.0.0/16",因此這兩個網絡是不重疊的。

現在用 docker inspect books-api 來確認應用程序的容器正在使用該網絡: 

 

 

 注意容器的兩個別名("Aliases")是容器標識符(3c42db680459)和由 docker-compose.yml 給出的服務名(books-service)。我們通過 books-service 別名在自定義 Nginx 配置文件中來引用應用程序的容器。這本可以通過 docker network create 手動創建,但是我喜歡用 Docker Compose,因為它可以干凈簡潔地將容器創建和依存捆綁在一起。

結論

所以現在我可以通過幾個簡單的步驟在 Linux 系統上用 Nginx 運行應用程序,不需要對主機操作系統做任何長期的改變:

  1. git clone https://github.com/niksoper/aspnet5-books.git 
  2. cd aspnet5-books/src/MvcLibrary 
  3. git checkout blog-docker 
  4. docker-compose up -d 
  5. curl -i http://localhost:9090/api/books 

我知道我在這篇文章中所寫的內容不是一個真正的生產環境就緒的設備,因為我沒有寫任何有關下面這些的內容,絕大多數下面的這些主題都需要用單獨一篇完整的文章來敘述。

  • 安全考慮比如防火墻和 SSL 配置
  • 如何確保應用程序保持運行狀態
  • 如何選擇需要包含的 Docker 鏡像(我把所有的都放入了 Dockerfile 中)
  • 數據庫 - 如何在容器中管理它們

對我來說這是一個非常有趣的學習經歷,因為有一段時間我對探索 ASP.NET Core 的跨平臺支持非常好奇,使用 “Configuratin as Code” 的 Docker Compose 方法來探索一下 DevOps 的世界也是非常愉快并且很有教育意義的。

如果你對 Docker 很好奇,那么我鼓勵你來嘗試學習它 或許這會讓你離開舒適區,不過,有可能你會喜歡它?

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2016-11-21 15:13:19

LinuxDocker.NET Core

2022-04-08 12:56:52

Linux終端命令

2022-05-16 15:37:32

開源軟件

2011-08-23 10:11:10

LinuxTop命令

2025-01-13 07:15:00

Monorepo代碼倉庫中項目代碼管理

2021-08-28 17:30:51

LinuxSSH

2010-06-07 16:10:53

HadoopOnDem

2009-06-15 09:50:56

自定義datagridVB Express

2010-05-27 10:42:38

SVN配置文檔

2009-11-16 08:58:43

PHP語言

2023-03-01 08:00:00

機器學習數據集

2010-06-21 12:39:56

OSPF路由協議

2009-05-11 15:58:32

Linux軟件卸載

2022-12-01 15:34:26

Arch LinuxOpenOffice

2022-01-20 16:43:38

Bash 腳本ShellLinux

2022-02-28 11:02:53

函數Bash Shell語句

2021-12-30 10:26:37

Bash Shell腳本文件命令

2023-03-15 09:46:07

R Markdown代碼語法

2010-08-04 09:06:21

Flex安裝

2010-07-01 12:35:46

UML用例圖
點贊
收藏

51CTO技術棧公眾號

久操成人av| 国内外激情在线| 爽好多水快深点欧美视频| 中文字幕精品av| 福利视频999| 香蕉伊大人中文在线观看| 国产精品欧美一区二区三区| 91精品啪aⅴ在线观看国产| 国产一级片播放| 免费成人av| 欧美一二三区精品| 中文字幕欧美人妻精品一区| 成人福利网站| 久久久91精品国产一区二区三区| 亚洲xxx大片| 国产女主播喷水视频在线观看| 亚洲激情久久| 亚洲视频国产视频| 日本性生活一级片| 亚洲免费看片| 欧日韩精品视频| 精品视频免费在线播放| 久草资源在线| 久久久久久黄色| 精品久久中出| 亚洲产国偷v产偷v自拍涩爱| 免费人成精品欧美精品| 欧美一级在线亚洲天堂| 国产十六处破外女视频| 成人一级毛片| 亚洲日本成人网| 99精品一区二区三区无码吞精| 亚洲成人高清| 欧美天天综合网| 国模吧无码一区二区三区| 欧美aaa免费| 亚洲女爱视频在线| 中文字幕一区二区三区最新 | 久视频在线观看| 久久精品免费一区二区三区| 尤物yw午夜国产精品视频明星| 中文字幕人妻一区| 99精品在免费线中文字幕网站一区 | 午夜久久久久久久久久影院| 日韩天堂av| 久久理论片午夜琪琪电影网| 欧洲猛交xxxx乱大交3| 婷婷亚洲综合| 日韩小视频在线观看| 国产黄色大片免费看| 婷婷成人综合| 亚洲美女在线观看| 日韩精品无码一区二区三区久久久| 欧美1区二区| 亚洲欧美国产精品va在线观看| 国产十八熟妇av成人一区| 欧美a大片欧美片| 欧美一级专区免费大片| www激情五月| 另类视频一区二区三区| 日韩精品一区二区三区中文精品| 99国产精品免费视频| 亚洲开心激情| 日韩av一区二区在线| 国产偷人妻精品一区| 亚洲黄页网站| 色妞在线综合亚洲欧美| 亚洲天堂网av在线| 欧美视频二区| 欧美在线免费视频| 国产偷人爽久久久久久老妇app| 日韩不卡在线观看日韩不卡视频| 国产精品久久久久一区二区| 国产一区二区三区成人| 国产激情一区二区三区| 风间由美一区二区三区| 亚洲av成人精品一区二区三区在线播放 | av影院在线免费观看| 欧美性xxxx极品高清hd直播| 男人搞女人网站| 在线视频成人| 亚洲国产成人精品一区二区| 西西444www无码大胆| 99久久www免费| 欧美激情国产日韩精品一区18| 91午夜视频在线观看| 日本强好片久久久久久aaa| 91免费看片网站| 日韩一级片免费| 国产欧美精品一区| 国产精品视频一二三四区| 牛牛精品一区二区| 欧美久久久久久久久久| 美女黄色一级视频| 精品免费在线| 97香蕉久久夜色精品国产| 中文字幕第2页| 国产高清一区日本| 亚洲巨乳在线观看| 第一中文字幕在线| 欧美网站大全在线观看| 国产精品一区二区人妻喷水| 成人免费看片39| 久久久久国产精品免费| 一区两区小视频| 91麻豆免费视频| wwwjizzjizzcom| 日韩制服一区| 亚洲精品乱码久久久久久按摩观| 午夜激情福利电影| 裸体一区二区| 国产福利不卡| 在线观看三级视频| 欧美高清dvd| 欧美日韩高清丝袜| 一区二区日韩免费看| 91入口在线观看| av网站在线免费观看| 精品国产成人av| 麻豆av免费看| 最新精品国产| 国产日韩在线一区| 91大神在线网站| 欧美视频免费在线| 99精品一区二区三区无码吞精| 91国语精品自产拍| 国产在线视频2019最新视频| 美丽的姑娘在线观看免费动漫| 亚洲国产日韩综合久久精品| 一级做a免费视频| 日韩大片在线| 国产精品国产三级国产aⅴ浪潮| 秋霞网一区二区| 亚洲一区视频在线| 在线观看一区二区三区视频| 亚洲成人一区| 成人欧美在线观看| 米奇777四色精品人人爽| 欧美无乱码久久久免费午夜一区| 欧美 日韩 成人| 日韩电影一区二区三区四区| 欧美另类高清视频在线| 综合久久2023| 国产性猛交xxxx免费看久久| 中文字幕精品视频在线观看| 国产亚洲精品超碰| 国产又猛又黄的视频| 视频国产一区| 国产精品网站大全| 男人天堂手机在线| 欧美一区二区三区影视| 深夜福利影院在线观看| 国产成人精品免费看| 国内精品国产三级国产99| 日韩成人视屏| 欧美激情一二区| 神马午夜一区二区| 日韩欧美成人区| 亚洲最大成人综合网| 免费成人在线影院| 一级黄色录像免费看| 日韩精品视频一区二区三区| 欧美激情极品视频| 日韩中文字幕免费观看| 欧美性猛交丰臀xxxxx网站| 屁屁影院国产第一页| 老**午夜毛片一区二区三区| 一本一本a久久| 在线播放一区二区精品视频| 97在线免费视频| 国产乱理伦片a级在线观看| 在线观看亚洲a| 成人在线观看小视频| 粉嫩av一区二区三区| 欧美国产日韩激情| 国内精品伊人久久久| 成人性生交大片免费看视频直播| 色呦呦视频在线观看| 日韩精品在线看| 一区二区三区免费在线| 亚洲福利国产精品| 国产 欧美 在线| 国内一区二区视频| 一女被多男玩喷潮视频| 久久精品国产www456c0m| 国产富婆一区二区三区| 欧美成a人片在线观看久| 另类视频在线观看| 欧美日韩伦理片| 91精品国产一区二区三区| 日产精品久久久久| 国产精品久久毛片| 影音先锋人妻啪啪av资源网站| 日韩国产欧美在线播放| 天堂8在线天堂资源bt| 久久99高清| 成人激情直播| 欧美一区二区三区婷婷| 午夜精品久久久久久久99热| 日本不卡在线| 日韩av有码在线| 国产日韩欧美一区二区东京热| 色一情一乱一乱一91av| 精品99久久久久成人网站免费| 久久久久久久久久久久久女国产乱| 野花视频免费在线观看| 免费日本视频一区| 国产精品97在线| 亚洲精品在线二区| 成人性做爰片免费视频| 国产精品中文字幕亚洲欧美| 国产乱码精品一区二区三区卡 | 欧美丰满一区二区免费视频| 99久久精品国产亚洲| 亚洲一区在线电影| 91精品国产高清一区二区三蜜臀| 亚洲国产精品av| 香蕉视频黄色在线观看| 国产成人超碰人人澡人人澡| 色www免费视频| 视频一区在线视频| 国产aaa一级片| 亚洲日产国产精品| 青草视频在线观看视频| 一区二区三区四区电影| 亚洲欧美日韩精品综合在线观看| 欧美精品第一区| 久久久综合亚洲91久久98| 国产调教精品| 国产伦一区二区三区色一情| 亚洲码欧美码一区二区三区| 成人深夜直播免费观看| 狠狠久久伊人中文字幕| 国产精品扒开腿做爽爽爽的视频| 97成人资源| 欧美中文在线视频| 超级碰碰久久| 亲子乱一区二区三区电影| 国产一二三在线| 午夜精品久久久久久久99黑人| 99热99re6国产在线播放| 欧美激情视频在线观看| 伊人在我在线看导航| 草民午夜欧美限制a级福利片| 免费超碰在线| 久久av.com| 色呦呦视频在线观看| 隔壁老王国产在线精品| 超碰97免费在线| 91tv亚洲精品香蕉国产一区7ujn| 国产夫妻在线| 日本亚洲欧美成人| av成人在线播放| 国产专区欧美专区| 日韩欧美另类中文字幕| 成人av男人的天堂| 免费日韩一区二区三区| 欧美日韩国产三区| 日韩精品一区二区三区免费观影| 亚洲乱码一区二区三区三上悠亚| 欧美freesextv| 伊人久久在线观看| 日韩视频二区| 青青青国产在线视频| 精品亚洲成a人在线观看| 免费国偷自产拍精品视频| 成人涩涩免费视频| 亚洲人成人无码网www国产| 国产精品久久久久桃色tv| 欧洲猛交xxxx乱大交3| 精品福利视频导航| 在线观看毛片av| 日韩精品中文字幕一区二区三区| 日韩中文字幕免费在线观看| 亚洲欧美另类在线观看| 精品视频在线一区二区| 隔壁老王国产在线精品| 亚洲电影有码| 国产精品二区三区四区| 黑人操亚洲人| 国产av熟女一区二区三区| 久久精品盗摄| 少妇高潮一69aⅹ| 久久久综合精品| 黄色录像一级片| 欧美性猛交xxxx乱大交| 国产精品一级视频| 精品偷拍一区二区三区在线看| 日本福利专区在线观看| 国语自产精品视频在线看| xxxxx.日韩| 久久精品国产第一区二区三区最新章节| 久久性感美女视频| 内射国产内射夫妻免费频道| 久久av资源网| 国产精品成人一区二区三区电影毛片| 亚洲人成网站在线| 国产精品免费精品一区| 日韩色视频在线观看| 北岛玲一区二区三区| 国内自拍欧美激情| 国产亚洲久久| 先锋影音亚洲资源| 午夜在线a亚洲v天堂网2018| 野花视频免费在线观看| 国产精品污网站| 日本中文字幕第一页| 日韩免费成人网| 黄视频在线观看网站| 国产精品av网站| 欧美激情99| 欧美国产日韩激情| 国产成人综合自拍| 亚洲最大的黄色网址| 欧美网站一区二区| 你懂得在线网址| 91精品国产乱码久久久久久久久| 久久99成人| 看一级黄色录像| 麻豆91在线观看| 亚洲自拍偷拍图| 欧美视频中文字幕在线| 天堂在线视频免费| 欧美日韩电影在线观看| 国产精品日本一区二区不卡视频 | 国产在线超碰| 欧美在线免费看| 亚洲精品小区久久久久久| 日韩网站在线免费观看| 国产黄色成人av| 欧美高清视频一区二区三区| 91精品婷婷国产综合久久性色 | av一区二区在线播放| 97视频在线免费播放| 99精品欧美一区| 日韩网红少妇无码视频香港| 欧美精品一区在线观看| 日本在线观看高清完整版| 亚洲在线视频观看| 在线看片不卡| 日韩精品xxx| 亚洲国产成人av网| 秋霞av鲁丝片一区二区| 777精品视频| 亚洲精品白浆高清| 国产一区二区视频免费在线观看| 久久综合九色综合97_久久久| 欧美啪啪小视频| 亚洲天堂av综合网| 国产91在线播放精品| 亚洲天堂av免费在线观看| 国产在线一区二区综合免费视频| 久久人妻无码aⅴ毛片a片app| 91精品国产免费久久综合| 3d玉蒲团在线观看| 国产精品国产三级国产专区53| 精品成人在线| 日韩网站在线播放| 欧美在线综合视频| 精品51国产黑色丝袜高跟鞋| 91青青草免费在线看| 亚洲视频大全| 精品一区二区三孕妇视频| 777xxx欧美| 操喷在线视频| 日韩福利影院| 国产呦精品一区二区三区网站| 九九视频在线观看| 亚洲另类激情图| 欧美黄色成人| 日本中文字幕在线视频观看| 97久久精品人人澡人人爽| 奴色虐av一区二区三区| 久久精品成人动漫| 精品三级av在线导航| 污污的网站18| 亚洲福利视频三区| 97电影在线看视频| 成人免费视频网站入口| 日韩精品一二三| 成人免费看片98| 夜夜嗨av色一区二区不卡| 久久久久久爱| 国产成人精品无码播放| 亚洲免费观看高清完整版在线观看 | 久久久影院官网| 国产情侣一区二区| 奇米一区二区三区四区久久| 久久久久久免费视频| 国产国语性生话播放| 91精品国产91久久久久久一区二区| 乱馆动漫1~6集在线观看| 一级日韩一区在线观看| av一区二区三区在线| 一区二区三区精| 日韩av免费在线观看| 国产真实久久| 香蕉成人在线视频| 日韩精品一区二区视频| 国产精品欧美一区二区三区不卡|