成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊 Python 應(yīng)用容器化部署流程

開(kāi)發(fā) 前端
Docker 是目前主流IT公司廣泛接受和使用的,用于構(gòu)建、管理和保護(hù)它們應(yīng)用程序的工具。容器,例如 Docker 允許開(kāi)發(fā)人員在單個(gè)操作系統(tǒng)上隔離和運(yùn)行多個(gè)應(yīng)用程序,而不是為服務(wù)器上的每個(gè)應(yīng)用程序?qū)S靡粋€(gè)虛擬機(jī)。使用容器更輕量級(jí),可以降低成本、更好地使用資源和發(fā)揮更高的性能。

 1. 簡(jiǎn)介

Docker 是目前主流IT公司廣泛接受和使用的,用于構(gòu)建、管理和保護(hù)它們應(yīng)用程序的工具。

[[329558]]

容器,例如 Docker 允許開(kāi)發(fā)人員在單個(gè)操作系統(tǒng)上隔離和運(yùn)行多個(gè)應(yīng)用程序,而不是為服務(wù)器上的每個(gè)應(yīng)用程序?qū)S靡粋€(gè)虛擬機(jī)。使用容器更輕量級(jí),可以降低成本、更好地使用資源和發(fā)揮更高的性能。

本文將使用 Flask 開(kāi)發(fā)一個(gè)簡(jiǎn)單的 Python web 應(yīng)用程序,并為 “容器化” 做好準(zhǔn)備。然后創(chuàng)建一個(gè) Docker 映像,并將其部署到測(cè)試和生產(chǎn)環(huán)境中。

注意: 請(qǐng)確保機(jī)器上已安裝 Docker,如果沒(méi)有請(qǐng)參考 Docker 官方安裝教程。

2. Docker介紹

Docker 是一種工具,它使開(kāi)發(fā)人員能夠交付他們的應(yīng)用程序(以及庫(kù)或其他依賴(lài)項(xiàng)),確保他們可以使用正確的配置運(yùn)行,而不受部署環(huán)境影響。

這是通過(guò)將應(yīng)用程序隔離在單獨(dú)的容器中來(lái)實(shí)現(xiàn)的,這些應(yīng)用程序雖然被容器分隔開(kāi),但是卻可以共享操作系統(tǒng)和其他資源。

Docker 包含兩部分:

  • Docker Engine — 應(yīng)用打包工具,用于封裝應(yīng)用程序。
  • Docker Hub — 用于管理云上容器應(yīng)用程序的工具。

3.為何選擇容器

了解容器的重要性和實(shí)用性非常重要,雖然它和直接將應(yīng)用部署到服務(wù)器沒(méi)有多大區(qū)別,但是當(dāng)涉及到比較復(fù)雜的且相當(dāng)吃資源的應(yīng)用,尤其是多個(gè)應(yīng)用部署在同一臺(tái)服務(wù)器,或是同一應(yīng)用要部署到多臺(tái)服務(wù)器時(shí)。容器就變得非常有用。

在容器之前,這是通過(guò) VMWare 和 Hypervisor 等虛擬機(jī)解決的,但是它們?cè)谛省⑺俣群涂梢浦残苑矫嬉驯蛔C明并不是最佳選擇。

Docker 容器是虛擬機(jī)的輕量級(jí)的替代品-與 VM 不同,我們不需要為它預(yù)先分配 RAM、CPU 或其他資源,也不需要為每個(gè)應(yīng)用程序啟動(dòng)一個(gè) VM,僅僅只需要一個(gè)操作系統(tǒng)即可。

使用容器開(kāi)發(fā)人員就不需要為不同環(huán)境制定特殊版本,這樣可以專(zhuān)注于應(yīng)用程序的核心業(yè)務(wù)邏輯。

4.創(chuàng)建 Python 應(yīng)用

Flask 是 Python 的一個(gè)輕量級(jí) Web 應(yīng)用框架,簡(jiǎn)單易用,可以很快速地創(chuàng)建 web 應(yīng)用。我們用它來(lái)創(chuàng)建此 demo 應(yīng)用。

如果還沒(méi)有安裝 Flask 模塊,可以使用下面命令安裝:

  1. $ pip install flask 

安裝成功后,新建一個(gè)應(yīng)用目錄,命名為 FlaskDemo。并在該目錄下創(chuàng)建應(yīng)用代碼文件app.py。

在 app.py 中,首先引入 Flask 模塊,然后創(chuàng)建一個(gè) web 應(yīng)用:

  1. from flask import Flask 
  2.  
  3. app = Flask(__name__) 

然后定義路由/和其對(duì)應(yīng)的請(qǐng)求處理程序:

  1. @app.route("/"
  2. def index():   
  3.   return ""
  4.   <h1>Python Flask in Docker!</h1> 
  5.   <p>A sample web-app for running Flask inside Docker.</p> 
  6.   ""

最后,添加運(yùn)行主程序并啟動(dòng)該腳本:

  1. if __name__ == "__main__"
  2.     app.run(debug=True, host='0.0.0.0'
  1. $ python app.py 

然后在瀏覽器中訪(fǎng)問(wèn) http://localhost:5000/,可以看到 Dockerzing Python app using Flask這樣的頁(yè)面。

5.Dokcer打包應(yīng)用

要在 Docker 上運(yùn)行應(yīng)用程序,首先必須構(gòu)建一個(gè)容器,而且必須包含使用的所有依賴(lài)項(xiàng)——在我們的例子中只有Flask。因此,新建一個(gè)包含所有依賴(lài)包的 requirements.txt 文件,然后創(chuàng)建一個(gè) Dockerfile,該文件用來(lái)描述構(gòu)建映像過(guò)程。

此外,當(dāng)啟動(dòng)容器時(shí)還需要放開(kāi)應(yīng)用程序的HTTP端口。

準(zhǔn)備工作

requirements.txt 文件非常簡(jiǎn)單,只需要填入項(xiàng)目的依賴(lài)包和其對(duì)應(yīng)版本即可:

  1. Flask==1.0.2  

接下來(lái),需要將應(yīng)用程序運(yùn)行所需的所有Python文件都放在頂層文件夾中,例如,名為app的目錄。

同時(shí)建議將主入口程序命名為 app.py ,將腳本中創(chuàng)建的Flask對(duì)象命名為 app 是一種通常的做法,這樣也可以簡(jiǎn)化部署。

  1. FlaskApp 
  2.     ├── requirements.txt 
  3.     ├── Dockerfile 
  4.     └── app 
  5.         └── app.py 
  6.         └── <other .py files> 

創(chuàng)建Dockerfile

Dockerfile 本質(zhì)上是一個(gè)文本文件,其中明確定義了如何為我們的項(xiàng)目構(gòu)建 Docker 鏡像。

接下來(lái)創(chuàng)建一個(gè)基于 Ubuntu 16.04 和 Python 3.X 的 Dokcer 鏡像:

  1. FROM ubuntu:16.04 
  2.  
  3. MAINTAINER jhao104 "j_hao104@163.com" 
  4.  
  5. RUN apt-get update -y && \ 
  6.     apt-get install -y python3-pip python3-dev 
  7.  
  8. COPY ./requirements.txt /requirements.txt 
  9.  
  10. WORKDIR / 
  11.  
  12. RUN pip3 install -r requirements.txt 
  13.  
  14. COPY . / 
  15.  
  16. ENTRYPOINT [ "python3" ] 
  17.  
  18. CMD [ "app/app.py" ] 

Dockerfile 的基本指令有十三個(gè),上面用到了部分;

  • FROM - 所有Dockerfile的第一個(gè)指令都必須是 FROM ,用于指定一個(gè)構(gòu)建鏡像的基礎(chǔ)源鏡像,如果本地沒(méi)有就會(huì)從公共庫(kù)中拉取,沒(méi)有指定鏡像的標(biāo)簽會(huì)使用默認(rèn)的latest標(biāo)簽,如果需要在一個(gè)Dockerfile中構(gòu)建多個(gè)鏡像,可以使用多次。
  • MAINTAINER - 描述鏡像的創(chuàng)建者,名稱(chēng)和郵箱。
  • RUN - RUN命令是一個(gè)常用的命令,執(zhí)行完成之后會(huì)成為一個(gè)新的鏡像,通常用于運(yùn)行安裝任務(wù)從而向映像中添加額外的內(nèi)容。在這里,我們需更新包,安裝 python3 和 pip 。在第二個(gè) RUN 命令中使用 pip 來(lái)安裝 requirements.txt 文件中的所有包。
  • COPY - 復(fù)制本機(jī)文件或目錄,添加到指定的容器目錄, 本例中將 requirements.txt 復(fù)制到鏡像中。
  • WORKDIR - 為RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個(gè)WORKDIR指令,后續(xù)參數(shù)如果是相對(duì)路徑,則會(huì)基于之前命令指定的路徑。
  • ENTRYPOINT - 在啟動(dòng)容器的時(shí)候提供一個(gè)默認(rèn)的命令項(xiàng)。
  • RUN - 運(yùn)行 app 目錄中的 app.py 。

Docker鏡像構(gòu)建原理

Docker鏡像是使用 Docker build 命令構(gòu)建的。在構(gòu)建鏡像時(shí),Docker創(chuàng)建了所謂的“層(layers)”。每一層都記錄了Dockerfile中的命令所導(dǎo)致的更改,以及運(yùn)行命令后鏡像的狀態(tài)。

Docker在內(nèi)部緩存這些層,這樣在重新構(gòu)建鏡像時(shí)只需要重新創(chuàng)建已更改的層。例如,這里使用了 ubuntu:16.04 的基礎(chǔ)鏡像,相同容器的所有后續(xù)構(gòu)建都可以重用它,因?yàn)樗粫?huì)改變。但是,因?yàn)轫?xiàng)目修改,在下次重新構(gòu)建過(guò)程中 app 目錄的內(nèi)容可能會(huì)有所不同,因此只會(huì)重新構(gòu)建這一層。

需要注意的是,每當(dāng)重新構(gòu)建某一層時(shí),Dockerfile 中緊隨其后的所有層也都需要重新構(gòu)建。例如,我們首先復(fù)制 requirements.txt 文件,然后再?gòu)?fù)制應(yīng)用程序的其余部分。這樣之前安裝的依賴(lài)項(xiàng)只要沒(méi)有新的依賴(lài)關(guān)系,即使應(yīng)用程序中的其他文件發(fā)生了更改,也不需要重新構(gòu)建這一層。這一點(diǎn)在創(chuàng)建 Dockerfiles 時(shí)一定要注意。

因此,通過(guò)將 pip 安裝與應(yīng)用程序其余部分的部署分離,可以?xún)?yōu)化容器的構(gòu)建過(guò)程。

構(gòu)建Docker鏡像

現(xiàn)在 Dockerfile 已經(jīng)準(zhǔn)備好了,而且也了解了Docker的構(gòu)建過(guò)程,接下來(lái)為我們的應(yīng)用程序創(chuàng)建Docker映像:

  1. docker build -t docker-flask:0.1 . 

調(diào)試模式運(yùn)行

根據(jù)前面講到的容器化的優(yōu)點(diǎn),開(kāi)發(fā)的應(yīng)用程序通過(guò)容器部署,這從一開(kāi)始就確保了應(yīng)用程序構(gòu)建的環(huán)境是干凈的,從而消除了交付過(guò)程中的意外情況。

但是呢,在開(kāi)發(fā)應(yīng)用程序的過(guò)程中,更重要的是要快速重新構(gòu)建和測(cè)試,以檢查驗(yàn)證過(guò)程中的每個(gè)中間步驟。為此,web應(yīng)用程序的開(kāi)發(fā)人員需要依賴(lài)于Flask等框架提供的自動(dòng)重啟功能(Debug模式下,修改代碼自動(dòng)重啟)。而這一功能也可以在容器中使用。

為了啟用自動(dòng)重啟,在啟動(dòng)Docker容器時(shí)將主機(jī)中的開(kāi)發(fā)目錄映射到容器中的app目錄。這樣Flask就可以監(jiān)聽(tīng)主機(jī)中的文件變化(通過(guò)映射)來(lái)發(fā)現(xiàn)代碼更改,并在檢測(cè)到更改時(shí)自動(dòng)重啟應(yīng)用程序。

此外,還需要將應(yīng)用程序的端口從容器轉(zhuǎn)發(fā)到主機(jī)。這是為了能夠讓主機(jī)上的瀏覽器訪(fǎng)問(wèn)應(yīng)用程序。

因此,啟動(dòng)Dokcer容器時(shí)需要使用 volume-mapping 和 port-forwarding 選項(xiàng):

  1. docker run --name flask_app -v $PWD/app:/app -p 5000:5000 docker-flask:0.1 

改命令將會(huì)執(zhí)行以下操作:

  • 基于之前構(gòu)建的 docker-flask 鏡像啟動(dòng)一個(gè)容器;
  • 這個(gè)容器的名稱(chēng)被設(shè)置為 flask_app 。如果沒(méi)有 ——name 選項(xiàng),Docker將為容器生成一個(gè)名稱(chēng)。顯式指定名稱(chēng)可以幫助我們定位容器(用來(lái)停止等操作);
  • -v 選項(xiàng)將主機(jī)的app目錄掛載到容器;
  • -p 選項(xiàng)將容器的端口映射到主機(jī)。

現(xiàn)在可以通過(guò)http://localhost:5000 或者 http://0.0.0.0:5000/ 訪(fǎng)問(wèn)到應(yīng)用:

如果我們?cè)谌萜鬟\(yùn)行的時(shí)候,修改應(yīng)用程序代碼,F(xiàn)lask會(huì)檢測(cè)到更改并重新啟動(dòng)應(yīng)用程序。


要停止容器的話(huà),可以使用 Ctrl + C, 并運(yùn)行 docker rm flask_app 移除容器。

生產(chǎn)模式運(yùn)行

雖然直接使用Flask裸跑運(yùn)行應(yīng)用程序?qū)τ陂_(kāi)發(fā)來(lái)說(shuō)已經(jīng)足夠好了,但是我們需要在生產(chǎn)中使用更健壯的部署方法。

目前主流的部署方案是 nginx + uwsgi,下面我們將介紹如何為生產(chǎn)環(huán)境部署web應(yīng)用程序。Nginx是一個(gè)開(kāi)源web服務(wù)器,uWSGI是一個(gè)快速、自我修復(fù)、開(kāi)發(fā)人員和系統(tǒng)管理員友好的服務(wù)器。

首先,我們創(chuàng)建一個(gè)入口腳本,用來(lái)控制以開(kāi)發(fā)模式還是生產(chǎn)模式啟動(dòng)我們的應(yīng)用程序,這兩者區(qū)別是選擇直接運(yùn)行python還是nginx模式。

然后再寫(xiě)一個(gè)簡(jiǎn)單shell啟動(dòng)腳本 entry-point.sh:

  1. #!/bin/bash 
  2.  
  3. if [ ! -f /debug0 ]; then 
  4.   touch /debug0 
  5.  
  6.   while getopts 'hd:' flag; do 
  7.     case "${flag}" in 
  8.       h) 
  9.         echo "options:" 
  10.         echo "-h        show brief help" 
  11.         echo "-d        debug mode, no nginx or uwsgi, direct start with 'python3 app/app.py'" 
  12.         exit 0 
  13.         ;; 
  14.       d) 
  15.         touch /debug1 
  16.         ;; 
  17.       *) 
  18.         break 
  19.         ;; 
  20.     esac 
  21.   done 
  22. fi 
  23.  
  24. if [ -e /debug1 ]; then 
  25.   echo "Running app in debug mode!" 
  26.   python3 app/app.py 
  27. else 
  28.   echo "Running app in production mode!" 
  29.   nginx && uwsgi --ini /app.ini 
  30. fi 

然后創(chuàng)建uWSGI配置文件 app.ini:

  1. [uwsgi] 
  2. plugins = /usr/lib/uwsgi/plugins/python3 
  3. chdir = /app 
  4. module = app:app 
  5. uid = nginx 
  6. gid = nginx 
  7. socket = /run/uwsgiApp.sock 
  8. pidfile = /run/.pid 
  9. processes = 4   
  10. threads = 2 

和nginx配置文件 nginx.conf:

  1. user nginx; 
  2. worker_processes  4; 
  3. pid /run/nginx.pid; 
  4.  
  5. events { 
  6.     worker_connections  20000; 
  7.  
  8. http { 
  9.     include    mime.types; 
  10.     sendfile on
  11.     keepalive_timeout  65; 
  12.     gzip off
  13.  
  14.     server { 
  15.         listen 80; 
  16.         access_log off
  17.         error_log off
  18.  
  19.         location / { try_files $uri @flaskApp; } 
  20.         location @flaskApp { 
  21.             include uwsgi_params; 
  22.             uwsgi_pass unix:/run/uwsgiApp.sock; 
  23.         } 
  24.     } 

最后,修改Dockerfile 將nginx和uWSGI安裝到鏡像,將配置文件復(fù)制到鏡像中,并設(shè)置運(yùn)行nginx所需的用戶(hù)權(quán)限:

  1. FROM ubuntu:16.04 
  2.  
  3. MAINTAINER jhao104 "j_hao104@163.com" 
  4.  
  5. RUN apt-get update -y && \ 
  6.     apt-get install -y python3-pip python3-dev && \ 
  7.     apt-get install -y nginx uwsgi uwsgi-plugin-python3 
  8.  
  9. COPY ./requirements.txt /requirements.txt 
  10. COPY ./nginx.conf /etc/nginx/nginx.conf 
  11.  
  12. WORKDIR / 
  13.  
  14. RUN pip3 install -r requirements.txt 
  15.  
  16. COPY . / 
  17.  
  18. RUN adduser --disabled-password --gecos '' nginx\ 
  19.   && chown -R nginx:nginx /app \ 
  20.   && chmod 777 /run/ -R \ 
  21.   && chmod 777 /root/ -R 
  22.  
  23. ENTRYPOINT [ "/bin/bash""/entry-point.sh"

然后重新打包鏡像:

  1. docker build -t docker-flask:0.1 . 

然后使用nginx啟動(dòng)應(yīng)用程序:

  1. docker run -d --name flaskapp --restart=always -p 8091:80 docker-flask:0.1 

該鏡像包含python、ngix、uwsgi完整環(huán)境,只需要在部署時(shí)指定端口映射便可以自動(dòng)部署應(yīng)用。要停止并刪除此容器,請(qǐng)運(yùn)行下面命令:

  1. docker stop flaskapp && docker rm flaskapp 

此外,如果我們?nèi)匀恍枰厦嬲{(diào)試功能或修改部分代碼,也可以像上面一樣以調(diào)試模式運(yùn)行容器:

  1. docker run -it --name flaskapp -p 5000:5000 -v $PWD/app:/app docker-flask:0.1 -d debug 

6.管理外部依賴(lài)

如果將應(yīng)用程序作為容器交付時(shí),需要記住的一個(gè)關(guān)鍵事項(xiàng)是,開(kāi)發(fā)人員管理依賴(lài)項(xiàng)的責(zé)任增加了。除了識(shí)別和指定正確的依賴(lài)項(xiàng)和版本之外,還需要負(fù)責(zé)在容器環(huán)境中安裝和設(shè)置這些依賴(lài)項(xiàng)。

在Python項(xiàng)目中管理安裝依賴(lài)比較容易,可以使用requirements.txt指定依賴(lài)項(xiàng)和對(duì)應(yīng)版本,然后通過(guò) pip 安裝。

需要重申的是是,無(wú)論何時(shí)修改 requirements.txt 文件,都需要重新構(gòu)建Docker鏡像。

啟動(dòng)時(shí)安裝依賴(lài)項(xiàng)

可能在某次版本更新時(shí)需要安裝額外的依賴(lài)項(xiàng)。比如,在開(kāi)發(fā)過(guò)程中使用了一個(gè)新的包。如果不希望每次都重新構(gòu)建Docker鏡像,或者希望在啟動(dòng)時(shí)使用最新的可用版本。可以通過(guò)修改啟動(dòng)程序在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行安裝程序來(lái)實(shí)現(xiàn)這一點(diǎn)。

同樣,我們也可以安裝額外的系統(tǒng)級(jí)包依賴(lài)項(xiàng)。修改 entry-point.sh:

  1. #!/bin/bash 
  2.  
  3. if [ ! -f debug0 ]; then 
  4.   touch debug0 
  5.    
  6.   if [ -e requirements_os.txt ]; then 
  7.     apt-get install -y $(cat requirements_os.txt) 
  8.      
  9.    fi 
  10.    if [-e requirements.txt ]; then 
  11.     pip3 install -r requirements.txt 
  12.    fi 
  13.  
  14.   while getopts 'hd:' flag; do 
  15.     case "${flag}" in 
  16.       h) 
  17.         echo "options:" 
  18.         echo "-h        show brief help" 
  19.         echo "-d        debug mode, no nginx or uwsgi, direct start with 'python3 app/app.py'" 
  20.         exit 0 
  21.         ;; 
  22.       d) 
  23.         touch debug1 
  24.         ;; 
  25.       *) 
  26.         break 
  27.         ;; 
  28.     esac 
  29.   done 
  30. fi 
  31.  
  32. if [ -e debug1 ]; then 
  33.   echo "Running app in debug mode!" 
  34.   python3 app/app.py 
  35. else 
  36.   echo "Running app in production mode!" 
  37.   nginx && uwsgi --ini /app.ini 
  38. fi 

這樣我們可以在 requirements_os.txt 中指定將要安裝的系統(tǒng)軟件包名稱(chēng),這些包名以空格分隔放在同一行。他們將和 requirements.txt 中的Python依賴(lài)庫(kù)一樣在應(yīng)用程序啟動(dòng)之前安裝。

盡管這樣對(duì)應(yīng)用的迭代開(kāi)發(fā)期間提供了便利,但是出于幾個(gè)原因,在啟動(dòng)時(shí)安裝依賴(lài)項(xiàng)不是一個(gè)好的實(shí)踐:

  • 它破壞了容器化的目標(biāo)之一,即修復(fù)和測(cè)試由于部署環(huán)境的變化而不會(huì)改變的依賴(lài)關(guān)系;
  • 增加了應(yīng)用程序啟動(dòng)的額外開(kāi)銷(xiāo),這將增加容器的啟動(dòng)時(shí)間;
  • 每次啟動(dòng)應(yīng)用程序時(shí)需要安裝依賴(lài)項(xiàng),這樣對(duì)網(wǎng)絡(luò)資源有要求。

 

責(zé)任編輯:華軒 來(lái)源: AirPython
相關(guān)推薦

2023-04-28 08:43:46

2021-03-16 12:08:32

Python 服務(wù)器腳本

2024-05-09 09:55:08

2022-01-05 00:03:32

場(chǎng)景容器Airflow

2023-08-25 15:41:50

容器微服務(wù)

2019-01-09 13:20:28

GPU虛擬化應(yīng)用

2023-08-23 15:18:06

云計(jì)算容器

2022-01-26 08:47:17

部署應(yīng)用分布式

2023-04-06 07:09:25

自動(dòng)化部署Actions

2021-06-26 07:40:45

Greenplum集群部署

2023-08-29 15:17:40

Docker容器架構(gòu)

2023-08-21 15:28:36

云原生Kubernetes

2023-05-03 23:48:24

Spring容器初始化

2024-08-05 11:14:45

2020-07-14 07:27:48

容器IoCSpring

2023-03-27 08:49:51

2022-03-04 08:45:11

Docker開(kāi)源Linux

2023-07-03 09:59:00

并發(fā)編程并發(fā)容器

2023-11-28 07:55:05

Calico容器網(wǎng)絡(luò)

2023-08-22 11:00:16

云計(jì)算容器微服務(wù)
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 伊人伊成久久人综合网站 | 国产99久久久国产精品 | 五月天天丁香婷婷在线中 | 国产精品久久久久久52avav | 精品国产一二三区 | 欧美二区三区 | 久久国产免费看 | 精品国产乱码久久久久久88av | 日本免费视频在线观看 | 欧美日韩高清免费 | 亚洲天堂一区 | 中文字字幕一区二区三区四区五区 | 黄色国产 | 欧美日韩网站 | 欧美精品久久久久久久久老牛影院 | 91亚洲国产成人精品一区二三 | 欧美日韩精品一区二区天天拍 | 欧美性生活免费 | 欧美日韩国产中文字幕 | 8x国产精品视频一区二区 | 国产精品免费一区二区三区四区 | 国产大片黄色 | 中文字幕亚洲视频 | 91在线一区二区三区 | 狠狠草视频 | 久久精品网 | 欧美日韩免费视频 | 亚洲国产精品va在线看黑人 | 久久99精品久久久久久国产越南 | 超碰在线播 | 亚洲成人黄色 | 亚洲午夜网 | 欧美在线视频观看 | 日韩欧美三级在线 | 999热精品 | 国产一区二区精 | 日韩av免费在线观看 | 亚洲v区 | 一级片免费网站 | 欧美a∨ | 成人免费网站 |