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

寫給前端的Docker實戰教程

開發 前端
本篇文章詳細而又簡短的介紹了:一名完全不了解 Docker 前端程序員,將全站 Docker 化的過程。

 [[278102]]

本篇文章詳細而又簡短的介紹了:一名完全不了解 Docker 前端程序員,將全站 Docker 化的過程。內容主要包含:

  • Docker 基本概念
  • 真實站點遷移過程:
  1. 靜態站點
  2. Nodejs 站點(Express)
  3. WordPress(PHP)
  • 一些必備技巧:開機啟動、常用Shell

文章會講解使用 Docker 過程中用到的全部技術棧(Github CI、Nginx 反向代理、docker-compose),絕不會出現“詳見:http://xxx”甩鏈接的情況。

無需再查閱其他文檔,看著一篇就夠了!

當前有哪些問題

手動部署成本太高

筆者維護了諸多網站,其中包含:

  • 我的簡歷:pea3nut.info,使用 Vuejs 構建的SPA單頁應用,純靜態。
  • 我的博客:pea3nut.blog,使用著名的 WordPress 搭建(PHP+Apache+MySQL)。
  • 一個開源項目——Pxer:pxer.pea3nut.org,官網使用 Nodejs + Express SSR 搭建。

而每次我想修改某個網站內容是十分麻煩的。拿大家熟悉的純靜態站點來說,修改過程如下:

  • 下載:從Github下載代碼,然后本地npm install
  • 開發:npm run dev本地修改代碼,測試
  • 編譯:npm run build使用 Webpack 進行編譯,產出靜態資源
  • 上傳:打開FTP軟件,上傳替換文件
  • 測試:看看網站是否在線上工作正常
  • 提交:將代碼提交到 Github

哪怕我只是修改個錯別字,都要十幾分鐘。

網站太多,改動太頻繁,而每次不管多小的改動都很麻煩。簡直讓我感覺自己在維護一個萬級QPS的大型項目。

某個服務掛了,我不懂 Linux 無法排查

最近我發現我的 MySQL 進程總是掛掉,導致所有依賴于 MySQL 的站點都掛了。

我也不知道為什么,之前還是好好的。

我嘗試了重啟進程、重啟服務器、撈報錯日志百度,均未奏效。

好吧,其實我不太懂 Linux,也不太懂 MySQL,我只是想用下他們搭建 WordPress 站點。而最近總出問題,讓我意識到:

我不僅要維護站點,我還要維護環境

這個對于一名前端來說太難了,裝個 nvm 就已經是我的極限了。MySQL無緣無故掛掉,我根本沒有能力查出個一二三四,然后解決它。

我不僅要保證站點本地能跑通,還必須要部署在遠程VPS穩定運行。。。

重啟不行。。。那就只能重裝系統了

可是,由于搭建了許多站點,VPS服務器環境相當復雜(或許這就是 MySQL 掛掉的原因),光 Apache 配置文件都幾百行了。重做系統的遷移成本,光是想一想就耗光了我所有的勇氣。

新的技術方案——Docker

總結一下有如下問題:

  • 手動部署成本太高,改錯別字都很麻煩
  • 一臺服務器由于時間累積導致環境變得“臟亂差”
  • 重裝系統成本太高,難以遷移

而 Docker,正是我解決所有問題SCP-500萬能藥!

那么 Docker 是如何做的呢?

鏡像與容器

Docker 中有兩個重要概念。

一個是容器(Container):容器特別像一個虛擬機,容器中運行著一個完整的操作系統。可以在容器中裝 Nodejs,可以執行npm install,可以做一切你當前操作系統能做的事情。

另一個是鏡像(Image):鏡像是一個文件,它是用來創建容器的。如果你有裝過 Windows 操作系統,那么 Docker 鏡像特別像“Win7純凈版.rar”文件。

上邊就是你所需要了解的 Docker 全部基礎知識。就這么簡單。

順便一提,在 Docker 中,我們通常稱你當前使用的真實操作系統為“宿主機”(Host)。

安裝 Docker

安裝 Docker 在你的電腦上就像安裝 VS Code 一樣簡單。

如果你使用的是Windows電腦,需要購買支持虛擬化的版本。如Win10專業版,Win10家庭版是不行的。

  • Mac:https://download.docker.com/mac/stable/Docker.dmg
  • Windows:https://download.docker.com/win/stable/Docker%20for%20Windows%20Installer.exe
  • Linux:https://get.docker.com/

安裝完Docker后,你可能會發現自己可以打開一個漂亮的 Docker 窗口。其實這個窗口沒什么用處,通常我們都是通過CLI命令行的方式操作 Docker的,就像 Git 一樣。

運行 Docker

接下來我們搭建一個能夠托管靜態文件的 Nginx 服務器

容器運行程序,而容器哪來的呢?容器是鏡像創建出來的。那鏡像又是哪來的呢?

鏡像是通過一個 Dockerfile 打包來的,它非常像我們前端的package.json文件

所以創建關系為:

  1. Dockerfile: 類似于“package.json” 
  2.  | 
  3.  V 
  4. Image: 類似于“Win7純凈版.rar” 
  5.  | 
  6.  V 
  7. Container: 一個完整操作系統 

創建文件

我們創建一個目錄hello-docker,在目錄中創建一個index.html文件,內容為:

  1. <h1>Hello docker</h1> 

然后再在目錄中創建一個Dockerfile文件,內容為:

  1. FROM nginx 
  2.  
  3. COPY ./index.html /usr/share/nginx/html/index.html 
  4.  
  5. EXPOSE 80 

此時,你的文件結構應該是:

  1. hello-docker 
  2.   |____index.html 
  3.   |____Dockerfile 

打包鏡像

文件創建好了,現在我們就可以根據Dockerfile創建鏡像了!

在命令行中(Windows優先使用PowerShell)鍵入:

  1. cd hello-docker/ # 進入剛剛的目錄 
  2. docker image build ./ -t hello-docker:1.0.0 # 打包鏡像 
  1. 注意!Docker 中的選項(Options)放的位置非常有講究,docker —help image和docker image —help是完全不同的命令 

docker image build ./ -t hello-docker:1.0.0的意思是:基于路徑./(當前路徑)打包一個鏡像,鏡像的名字是hello-docker,版本號是1.0.0。該命令會自動尋找Dockerfile來打包出一個鏡像

  1. Tips: 你可以使用docker images來查看本機已有的鏡像 

不出意外,你應該能得到如下輸出:

  1. Sending build context to Docker daemon  3.072kB 
  2. Step 1/3 : FROM nginx 
  3.  ---> 5a3221f0137b 
  4. Step 2/3 : COPY ./index.html /usr/share/nginx/html/index.html 
  5.  ---> 1c433edd5891 
  6. Step 3/3 : EXPOSE 80 
  7.  ---> Running in c2ff9ec2e945 
  8. Removing intermediate container c2ff9ec2e945 
  9.  ---> f6a472c1b0a0 
  10. Successfully built f6a472c1b0a0 
  11. Successfully tagged hello-docker:1.0.0 

可以看到其運行了 Dockerfile 中的內容,現在我們簡單拆解下:

  • FROM nginx:基于哪個鏡像
  • COPY ./index.html /usr/share/nginx/html/index.html:將宿主機中的./index.html文件復制進容器里的/usr/share/nginx/html/index.html
  • EXPOSE 80:容器對外暴露80端口

運行容器

我們剛剛使用 Dockerfile 創建了一個鏡像。現在有鏡像了,接下來要根據鏡像創建容器:

  1. docker container create -p 2333:80 hello-docker:1.0.0 
  2. docker container start xxx # xxx 為上一條命令運行得到的結果 

然后在瀏覽器打開127.0.0.1:2333,你應該能看到剛剛自己寫的index.html內容

在上邊第一個命令中,我們使用docker container create來創建基于hello-docker:1.0.0鏡像的一個容器,使用-p來指定端口綁定——將容器中的80端口綁定在宿主機的2333端口。執行完該命令,會返回一個容器ID

而第二個命令,則是啟動這個容器

啟動后,就能通過訪問本機的2333端口來達到訪問容器內80端口的效果了

  1. Tips: 你可以使用docker containers ls來查看當前運行的容器 

當容器運行后,可以通過如下命令進入容器內部:

  1. docker container exec -it xxx /bin/bash # xxx 為容器ID 

原理實際上是啟動了容器內的/bin/bash,此時你就可以通過bash shell與容器內交互了。就像遠程連接了SSH一樣

發生了什么

我們總結下都發生了什么:

  1. 寫一個 Dockerfile
  2. 使用docker image build來將Dockerfile打包成鏡像
  3. 使用docker container create來根據鏡像創建一個容器
  4. 使用docker container start來啟動一個創建好的容器

雖然很簡單,但是也沒有感覺到“廣闊天地,大有可為,為所欲為”呢?

遷移靜態站點

接下來我們實戰遷移一個由 Vuejs 寫的純靜態 SPA 單頁站點:

  • 網址:pea3nut.info
  • 源碼:github/pea3nut-info

我打算怎么做

在沒遷移 Docker 之前,若我想更新線上網站中內容時,需要:

  1. 本地npm run build打包產出靜態文件
  2. 手動通過 FTP 上傳到服務器
  3. git push更新 Github 源碼

稍微有點麻煩,因此我打算這樣改:

  1. 執行git push
  2. 自動檢測到 github 有代碼更新,自動打包出一個 Docker 鏡像
  3. CI 編譯完成后,SSH 登錄 VPS,刪掉現有容器,用新鏡像創建一個新容器

而這樣做的好處是:

  1. 不必再手動 FTP 上傳文件
  2. 當我進行修改錯別字這樣的簡單操作時,可以免測。改完直接git push,而不必本地npm run build

Github中的CI

首先是讓 Github 在我每次更新代碼時打包出一個鏡像

在 Github,可以有免費的 CI 資源用,它就是 Travis CI

在項目中根目錄中添加.travis.yml文件,內容如下:

  1. language: node_js 
  2. node_js: 
  3.   - "12" 
  4. services: 
  5.   - docker 
  6.  
  7. before_install: 
  8.   - npm install 
  9.  
  10. script: 
  11.   - npm run build 
  12.   - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin 
  13.   - docker build -t pea3nut/pea3nut-info:latest . 
  14.   - docker push pea3nut/pea3nut-info:latest 

文件內容非常簡單,就是使用npm run build編譯靜態產出后,打包一個鏡像并且 push 到遠程。有幾點需要詳細說一下:

  • 為了能夠讓鏡像上傳到服務器,你需要在hub.docker.com中注冊一個賬號,然后替換代碼中的pea3nut/pea3nut-info:latest為用戶名/包名:latest即可
  • 使用 Github 登錄 Travis CI 后,在左邊點擊+加號添加自己的 Github 倉庫后,需要移步到 Setting 為項目添加DOCKER_USERNAME和DOCKER_PASSWORD環境變量。這樣保證我們可以秘密的登錄 Docker Hub 而不被其他人看到自己的密碼。如下圖:

然后需要添加 Dockerfile 文件來描述如何打包 Docker 鏡像。

按照.travis.yml的命令次序,在打包鏡像時,npm run build已經執行過了,項目產出已經有了。不必在 Docker 容器中運行npm install和npm run build之類的,直接復制文件即可:

  1. FROM nginx 
  2.  
  3. COPY ./dist/ /usr/share/nginx/html/ 
  4.  
  5. EXPOSE 80 
  1. Note: 過程雖然簡單但是線條很長,建議本地多測試測試再進行git push 

若你編譯出的靜態站點也是一個 SPA 單頁應用,需要增加額外的 Nginx 配置來保證請求都能打到index.html。下邊是我寫的vhost.nginx.conf Nginx 配置文件,將不訪問文件的請求全部重定向到/index.html:

  1. server { 
  2.     listen 80; 
  3.     server_name localhost; 
  4.     location / { 
  5.         root /usr/share/nginx/html; 
  6.         index index.html index.htm; 
  7.         proxy_set_header Host $host; 
  8.  
  9.         if (!-f $request_filename) { 
  10.           rewrite ^.*$ /index.html break; 
  11.         } 
  12.  
  13.     } 
  14.  
  15.     error_page 500 502 503 504 /50x.html; 
  16.     location = /50x.html { 
  17.         root /usr/share/nginx/html; 
  18.     } 
  19.  

然后在 Dockerfile 中新加一行,將本機的vhost.nginx.conf文件復制到容器的/etc/nginx/conf.d/pea3nut-info.conf,讓 Nginx 能夠讀取該配置文件:

  1.   FROM nginx 
  2.  
  3.   COPY ./dist/ /usr/share/nginx/html/ 
  4. + COPY ./vhost.nginx.conf /etc/nginx/conf.d/pea3nut-info.conf 
  5.  
  6.   EXPOSE 80 

然后執行git push后,你可以在 Travis CI 看到 CI 的編譯結果。如果編譯沒問題,遠程實際上就有了pea3nut/pea3nut-info:latest這個鏡像。本地可以試試看該鏡像工作是否正常:

  1. docker image pull pea3nut/pea3nut-info:latest 
  2. docker container create -p 8082:80 pea3nut/pea3nut-info:latest 
  3. docker container start xxx # xxx 為上一條命令執行的返回值 

運行完成后,瀏覽器訪問127.0.0.1:8082應該就能看到效果了!

然后你可以登錄遠程 VPS 服務器,安裝 Docker,執行同樣的命令。然后訪問遠程 VPS 服務器的公網 IP + 8082 端口號,應該能看到和本地相同的效果。

Tips: 忘了如何在 VPS 上安裝 Docker?在上文“安裝 Docker”一節,你可能需要的是 Linux 的安裝方式。

  1. curl https://get.docker.com/ > install-docker.sh # 下載安裝腳本
  2. sh install-docker.sh # 執行安裝腳本 

Nginx 反向代理

Note: 接下來的操作都是在你的遠程 VPS 服務器上操作,并非本地電腦,或者容器中。

目前我們將容器掛到了 8082 端口,但是線上不可能讓用戶手動輸入 8082 端口進行訪問。而如果將容器直接掛到 80 端口,雖然這樣用戶可以直接不加端口直接訪問,但是如果有第二個容器,或者更多容器呢?

這時候就需要在宿主機跑一個 Nginx,由它來獨占 80 端口,然后根據域名來講請求分發給響應的容器。如下圖: 

這種方案叫做“反向代理”

登錄VPS服務器,安裝 Nginx。因為我是 Ubuntu,所以可以用apt安裝。其他 Linux 發行版可以百度下安裝方法,通常2行內可以搞定:

  1. apt update # 更新軟件包 
  2. apt-get install nginx # 安裝 Nginx 
  3. systemctl status nginx # 查看 Nginx 狀態 

此時本地通過瀏覽器訪問 VPS 的公網 IP 可用看到 Nginx 的歡迎頁面。

然后在 VPS 服務器的/etc/nginx/conf.d/中建立一個vhost.conf文件,配置如下內容:

  1. server { 
  2.     listen 80; 
  3.     server_name pea3nut.info; 
  4.  
  5.     location / { 
  6.         proxy_pass http://127.0.0.1:8082; 
  7.     } 

配置的意思是,監聽來自 80 端口的流量,若訪問域名是pea3nut.info(替換為你自己的域名),則全部轉發到http://127.0.0.1:8082中。

配置完成后,重啟 Nginx 服務器。若是 Ubuntu 可以使用systemctl restart nginx命令,不同 Linux 發行版稍有不同。

配置成功后,訪問pea3nut.info會看到和VPS公網IP:8082相同的效果。

更新站點

而遷移完成 Docker 后,我想改一個錯別字的流程變為:

  • 本地修改完成,執行git push
  • 等待 CI 編譯完成
  • 登錄 VPS 服務器,執行:
  1. docker image pull pea3nut/pea3nut-info:latest 
  2. docker container create -p 8082:80 pea3nut/pea3nut-info:latest # 得到 yyy 
  3. docker container stop xxx # xxx 為當前運行的容器ID,可用 docker container ls 查看 
  4. docker container start yyy # yyy 第二條命令返回值 

命令還是有些長?我們在下面會進一步優化它

遷移 Nodejs 站點(Express)

接下來我們實戰遷移一個由 Nodejs 寫的 Express SSR 站點

  • 網址:pxer.pea3nut.org
  • 源碼:github/pxer-homepage

我打算怎么做

網站使用 Ejs 模板渲染頁面。在沒遷移 Docker 之前,若我想更新線上網站中內容時,需要:

  1. 本地修改好 Ejs 或者其他文件
  2. 手動通過 FTP 上傳到服務器
  3. 在服務器端重啟 Nodejs 進程。若有 npm 包依賴改動,需要在VPS服務器上手動執行npm install
  4. git push更新 Github 源碼

稍微有點麻煩,因此我打算這樣改:

  1. 執行git push
  2. 自動檢測到 github 有代碼更新,自動打包出一個 Docker 鏡像
  3. CI 編譯完成后,SSH 登錄 VPS,刪掉現有容器,用新鏡像創建一個新容器

而這樣做的好處是:

  1. 不必再手動 FTP 上傳文件
  2. 不必手動維護服務器的 Nodejs 運行環境

實施

具體的過程和處理靜態站點沒有什么特別的區別,無非是:

  1. 編寫 Dockerfile 文件
  2. 在 CI 時自動打包鏡像
  3. 在VPS增加一個 Nginx 反向代理

這次就不重復講了,具體的配置可以參考項目中的相關文件

Tips: 你可能發現了 Dockerfile 中的ENTRYPOINT命令必須指定一個前臺進程。若你的 Nodejs 應用是使用 PM2 進行保活的,你需要替換pm2 start app.js為pm2-docker app.js

docker-compose

當將 Nodejs 站點遷移完成,我們的 VPS 服務器上已經運行了2個容器。每次鏡像更新都要手動的docker container create帶一堆參數是比較麻煩的,尤其是當日后容器日益增多的時候。而這時,就輪到docker-compose登場了~

docker-compose 是 Docker 官方提供的一個 Docker 管理工具。若你是通過桌面端的 Docker 安裝包安裝的 Docker,它是會默認為你安裝 docker-compose 的。可以試試如下命令:

  1. docker-compose --help 

如果是在 Linux,可以通過如下命令安裝 docker-compose:

  1. curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose 
  2. chmode +x /usr/local/bin/docker-compose 

docker-compose 和 Docker 差不多,也是只要一份文件就能跑起來。docker-compose 主要的作用就是能夠讓你不必手敲那么多 Docker 命令

建立一個目錄,然后在目錄中建立docker-compose.yml,內容如下:

  1. version: "3.7" # 這個是配置文件的版本,不同的版本號聲明方式會有細微的不同 
  2. services: 
  3.     info: 
  4.         container_name: pea3nut-info 
  5.         image: pea3nut/pea3nut-info:latest 
  6.         ports: 
  7.             - "8082:80" 
  8.         restart: on-failure 

然后在目錄中鍵入如下命令就能將服務跑起來:

  1. docker-compose up info 

docker-compose 會幫我們自動去拉鏡像,創建容器,將容器中的80端口映射為宿主機的8082端口。restart字段還要求 docker-compose 當發現容器意外掛掉時重新啟動容器,類似于 pm2,所以你不必再在容器內使用 pm2。

如果想要更新一個鏡像創建新容器,只需要:

  1. docker-compose pull info 
  2. docker-compose stop info 
  3. docker-compose rm info 
  4. docker-compose up -d info # -d 代表后臺運行 

筆者已將自己網站部署方式開源,可參考github/pea3nut-hub

遷移 WordPress 站點(Apache + PHP + MySQL)

接下來我們實戰遷移一個 WordPress 站點

  • 網址:pea3nut.blog
  • 源碼:非公開

可能你也發現了這個站點和其他站點的一個非常大的不同——他的源碼和數據是不能公開的。

之前我們打包鏡像時,都是直接將代碼打進鏡像內的。這條方案用在這里顯然是不行的,有兩個問題:

  1. 我不想公開 MySQL 數據文件和網站內容(如圖片)。若將這些打包進鏡像,任何人都能docker image pull下載到鏡像,然后取得鏡像內的文件。
  2. 當容器被刪掉,存儲的 MySQL 數據都將丟失。

Volume

Docker 提供了一個叫做 Volume 的東西,可以將容器內和宿主機的某個文件夾進行”綁定“,任何文件改動都會得到同步。所以,我可以將整個站點目錄和 MySQL 目錄都掛載為 Volume。這樣,當容器刪除時,所有數據文件和源碼都會保留。

在本地建立./blog/mysql-data目錄存儲 MySQL 數據,建立./blog/wordpress目錄存儲 WordPress 源碼。然后修改docker-compose.yml如下:

  1. version: "3.7" 
  2. services: 
  3.     info: 
  4.         container_name: pea3nut-info 
  5.         image: pea3nut/pea3nut-info:latest 
  6.         ports: 
  7.             - "8082:80" 
  8.         restart: on-failure 
  9. +   blog: 
  10. +       container_name: pea3nut-blog 
  11. +       image: tutum/lamp:latest 
  12. +       ports: 
  13. +           - "8081:80" 
  14. +       volumes: 
  15. +           - ./blog/mysql-data:/var/lib/mysql 
  16. +           - ./blog/wordpress:/app 
  17. +       restart: on-failure 

可以看到這次根本沒有打包鏡像,而是直接使用tutum/lamp鏡像提供的 LAMP 環境(Linux + Apache + MySQL + PHP),然后將 MySQL 數據目錄/var/lib/mysql和源碼目錄/app都掛載出來就可以了。

Tips: 通過 Volume 我們只是解決了部署問題,而如何本地開發然后將源碼同步到服務器呢?用 FTP 當然是可以的,但是稍微有點麻煩。其實你可以自建一個 Git 服務器!詳見:pea3nut.blog/e127

坑和其他技巧

  • 設置開機啟動:Ubuntu 18.04 啟用 rc.local 設置開機啟動 - digdeep - 博客園
  • 遷移后中文文件亂碼:解決linux下中文文件名顯示亂碼問題

 

責任編輯:華軒 來源: segmentfault
相關推薦

2019-07-29 16:05:48

前端DockerNode.js

2019-12-18 10:30:24

前端開發技術

2022-08-08 15:45:44

JavaPromise前端

2022-08-12 15:58:34

Docker

2022-08-08 10:45:49

PromiseJava腳手架

2020-06-22 07:56:15

前端開發技術

2017-02-23 20:30:29

后端前端webpack

2022-10-10 07:18:30

DockerGitlabweb系統

2019-11-29 16:25:00

前端正則表達式字符串

2019-01-04 12:46:03

程序員技能溝通

2022-09-05 14:45:56

前端K8S

2012-05-01 21:27:20

iOS

2021-05-27 05:22:28

前端引擎平臺

2022-09-14 23:14:26

前端自動化測試工具

2015-09-06 09:17:31

2014-03-11 09:30:00

面試職場

2023-12-04 16:15:05

Docker容器

2022-05-17 09:02:30

前端性能優化

2013-12-18 09:59:03

R語言R語言教程數據打理

2015-05-07 14:08:26

初學前端工程師
點贊
收藏

51CTO技術棧公眾號

99视频一区二区| 亚洲人成免费| 欧美一二三区精品| 东北少妇不带套对白| 亚洲av毛片成人精品| 日韩福利电影在线| 久久久精品国产亚洲| 逼特逼视频在线观看| 激情亚洲影院在线观看| 亚洲人成网站在线| 久久99久久精品国产| 中文字幕av影视| 黄色一区二区三区四区| 亚洲天堂第一页| 波多野结衣网页| 免费电影日韩网站| 亚洲精品videosex极品| 麻豆av一区二区三区久久| 92久久精品一区二区| 亚洲人成久久| 欧美成人午夜免费视在线看片 | 理论片日本一区| 欧美精品videos| 亚洲精品国产精品国自| 久久电影在线| 日韩欧美成人一区二区| 欧美特级aaa| 自拍偷拍欧美视频| 亚洲一区二区三区四区五区黄 | 精品人伦一区二区三区蜜桃网站| 欧美日韩在线一二三| 亚洲国产精品成人久久蜜臀| 日本在线不卡一区| 日本亚洲欧美成人| 国产性一乱一性一伧一色| 欧美大人香蕉在线| 亚洲三级av在线| 亚洲欧美日本一区| 澳门精品久久国产| 日韩一区二区精品| aaa一级黄色片| 嫩草伊人久久精品少妇av杨幂| 亚洲成人动漫在线观看| av久久久久久| 国产黄色在线免费观看| 欧美韩国日本一区| 日本免费高清一区| 国内三级在线观看| 久久精品人人做人人爽97| 久草一区二区| 午夜18视频在线观看| 成人午夜视频福利| 国产精成人品localhost| 精品久久人妻av中文字幕| 国产在线精品一区二区夜色 | 亚洲综合成人av| 久久福利毛片| 国产大片精品免费永久看nba| 国产又爽又黄的视频| 日韩一区二区久久| 欧美亚洲国产另类| 一级片中文字幕| 欧美亚洲网站| 国产精品白丝jk喷水视频一区| www.国产com| 美女尤物久久精品| 国产精品狠色婷| 一区二区乱子伦在线播放| 日韩av中文在线观看| 国产精品精品一区二区三区午夜版 | 悠悠色在线精品| av片在线免费| 嗯啊主人调教在线播放视频| 欧美日韩在线视频观看| 亚洲国产精品毛片av不卡在线| 欧洲一级精品| 欧美日韩一区成人| 污污网站免费观看| 国产精品色婷婷在线观看| 欧美一二三四在线| av在线播放网址| 蜜臀av免费一区二区三区| 亚洲欧美另类国产| 国产精品久久久免费看| 国产精品99一区二区| 91国产一区在线| 国产精品露脸视频| 成人在线视频一区二区| 欧美亚洲免费在线| 黄色网址在线免费播放| 性做久久久久久免费观看| 欧美精品色婷婷五月综合| 欧美videos粗暴| 精品久久久网站| 大又大又粗又硬又爽少妇毛片| 日韩精品1区| 欧美精品久久久久| 午夜视频网站在线观看| 粉嫩aⅴ一区二区三区四区五区| 久久影院理伦片| 欧美精品电影| 狠狠色狠狠色综合日日小说 | 国产盗摄精品一区二区三区在线| 黄色一区三区| 欧美成年黄网站色视频| 五月婷婷激情综合| 国内外成人免费在线视频| a级日韩大片| 最近中文字幕2019免费| 欧美成人aaaaⅴ片在线看| 美国毛片一区二区三区| 久久精品ww人人做人人爽| 黄色网址在线免费| 欧美综合一区二区| 欧美熟妇精品一区二区蜜桃视频| 日韩精品诱惑一区?区三区| 欧美精品999| 国产喷水吹潮视频www| 久久久一区二区| 男女私大尺度视频| 91麻豆精品国产综合久久久 | 免费v片在线观看| 4438亚洲最大| 熟女高潮一区二区三区| 欧美日韩免费| 91精品久久久久久久久久久久久| 神马电影在线观看| 亚洲高清在线精品| 一级做a爱视频| 99成人在线视频| 国产精品久久999| 日本福利片在线| 午夜视频一区在线观看| 日本黄色大片在线观看| 99久久久久国产精品| 国产精品劲爆视频| 国产高清视频免费最新在线| 激情成人中文字幕| 精品1卡二卡三卡四卡老狼| 在线中文字幕第一区| 国产欧美一区二区三区久久人妖| 日本啊v在线| 天天综合天天综合色| 9191在线视频| 欧美久久一区| av一区二区三区在线观看| 国产成人午夜| 91精品国产色综合久久| 国产中文av在线| 久久99久久久欧美国产| 亚洲精品影院| 欧美天堂一区| 久久久精品网站| av中文字幕第一页| 亚洲欧美国产高清| 潘金莲一级淫片aaaaa| 综合国产精品| 91影院未满十八岁禁止入内| 性欧美1819sex性高清大胸| 欧美一级搡bbbb搡bbbb| 麻豆视频在线观看| 不卡一二三区首页| 男人的天堂99| 精品国内自产拍在线观看视频| 国产精品xxxxx| 免费观看在线午夜影视| 欧美一区二区三区系列电影| 精品97人妻无码中文永久在线| 国产成人福利片| 亚洲 欧美 日韩 国产综合 在线| 欧美综合精品| 国产精品情侣自拍| 91最新在线视频| 亚洲成成品网站| 探花视频在线观看| 国产精品乱码一区二区三区软件| 久久6免费视频| 好吊一区二区三区| 欧美一级二级三级| 99久久999| 午夜伦理精品一区| 第九色区av在线| 欧美一区二区三区免费观看视频| 日本三级午夜理伦三级三| 国产亚洲一区二区三区在线观看| 青青草久久伊人| 狠狠入ady亚洲精品| 欧美日韩在线精品| 国产精品99久久免费| 91国语精品自产拍在线观看性色| 麻豆导航在线观看| 日韩免费在线观看| 好吊色在线视频| 一区二区三区四区高清精品免费观看| 性囗交免费视频观看| 老汉av免费一区二区三区| youjizz.com在线观看| 久9久9色综合| 动漫3d精品一区二区三区| 六月婷婷综合| 欧美猛少妇色xxxxx| 欧美孕妇性xxxⅹ精品hd| 欧美精品自拍偷拍| 日产精品久久久| 亚洲精选视频免费看| 蜜桃av免费看| 国产成人精品免费在线| 熟女少妇精品一区二区| 综合一区二区三区| 日本一区美女| 久久成人福利| av在线不卡一区| 精品美女一区| 热草久综合在线| 欧美1234区| 久久精品99无色码中文字幕| 青青久草在线| 亚洲成人精品在线| 国产又黄又爽视频| 欧美在线一区二区三区| 欧美一级视频免费观看| 一区二区三区日韩| 糖心vlog免费在线观看| 国产日韩影视精品| aaaaa一级片| www.色精品| 国产伦理在线观看| 国模娜娜一区二区三区| 午夜宅男在线视频| 日韩影院精彩在线| 国产中文字幕免费观看| 激情另类综合| 国产片侵犯亲女视频播放| 天天久久综合| 一区二区三区我不卡| 成人免费电影网址| 色涩成人影视在线播放| 国产欧美一区| 日韩高清国产一区在线观看| 中日韩免视频上线全都免费| 免费精品视频一区二区三区| 日韩高清电影免费| 久久久水蜜桃| 日韩大尺度在线观看| 国产中文一区二区| 啪啪激情综合网| 激情小说综合网| 日韩欧美黄色| 欧美日韩国产高清视频| 亚洲宅男网av| 欧美一进一出视频| 日本一区二区免费高清| 亚洲一区二区四区| 欧美激情欧美| 日日噜噜夜夜狠狠久久丁香五月| 亚洲成人最新网站| 欧美黄网在线观看| 国产精品啊啊啊| 777精品久无码人妻蜜桃| 国产精品美女| 男人的天堂日韩| 蜜臀av性久久久久蜜臀aⅴ| 久久99爱视频| 国产精品一区二区无线| 中文在线字幕观看| 99国产精品久久久久| 国产精品高清无码在线观看| 中文字幕av在线一区二区三区| 午夜国产福利视频| 一区二区三区波多野结衣在线观看 | 日日摸日日碰夜夜爽无码| 亚洲色诱最新| 波多结衣在线观看| 国产在线精品一区二区不卡了 | 九色在线视频观看| 日韩成人免费电影| av在线免费看片| 国产91丝袜在线播放0| 国产在线观看无码免费视频| 欧美经典一区二区| 欧美成人黄色网| 欧美日韩日本国产| 一区二区三区在线免费观看视频| 欧美一区二区三区在线观看视频| 日韩一区免费视频| 伊人男人综合视频网| 国产原创在线观看| 51精品在线观看| 久久精品xxxxx| 91久色国产| 国产一区二区观看| 日韩一区二区高清视频| 99视频一区| 一区二区三区国产好的精华液| 久久综合色婷婷| 天堂网avav| 日韩欧美a级成人黄色| 国产精品嫩草影院桃色| 亚洲激情小视频| 麻豆视频在线观看免费网站| 久久露脸国产精品| 日韩电影免费观看高清完整版在线观看| av免费观看久久| 久久人体视频| 日韩中文字幕三区| 国产精品小仙女| 国产18无套直看片| 激情亚洲一区二区三区四区 | 精品无人国产偷自产在线| 免费网站看v片在线a| 日本午夜精品理论片a级appf发布| 日韩精品久久久久久久软件91 | 亚洲久久久久| www.日本xxxx| 99久久精品99国产精品| 欧美成人片在线观看| 欧美视频在线观看一区二区| 午夜小视频免费| 欧美大片在线看| 香蕉久久久久久| 日韩影视精品| 久久亚洲精选| 97人妻精品一区二区三区免| 亚洲一二三四久久| 国产精品毛片久久久久久久av| 亚洲图片在线综合| 性爽视频在线| 国产综合18久久久久久| 欧美日韩91| 永久av免费在线观看| 国产精品超碰97尤物18| 中文字幕欧美人妻精品| 亚洲天堂av综合网| 偷拍自拍在线看| 久久精彩视频| 一区二区久久| 女尊高h男高潮呻吟| 懂色av影视一区二区三区| 香蕉视频黄在线观看| 97人人模人人爽人人喊中文字 | 久久精品国产免费| 少妇视频在线播放| 欧美日韩一区在线| 最新97超碰在线| 国产精品无码专区在线观看| 日韩精品dvd| www.久久av.com| 亚洲日本中文字幕区| 国产精品欧美综合亚洲| 久久精品在线播放| 国产麻豆精品| 日韩精品久久一区二区| 国产99精品国产| www.天天色| 日韩精品一区二区三区第95| 在线精品亚洲欧美日韩国产| 欧美亚洲另类在线一区二区三区| 三级不卡在线观看| 九九九视频在线观看| 欧美日韩精品系列| 麻豆视频网站在线观看| 91原创国产| 亚洲看片免费| mm131丰满少妇人体欣赏图| 欧美无乱码久久久免费午夜一区 | 国产精品欧美经典| 一级片aaaa| 欧美第一黄网免费网站| 韩国精品福利一区二区三区| 六月丁香激情网| 国产视频911| 国产人妻精品一区二区三| 久久久久免费视频| 日韩mv欧美mv国产网站| www.99在线| 亚洲最大成人综合| 你懂的在线观看| 成人免费看吃奶视频网站| 欧美日本不卡高清| 人人妻人人藻人人爽欧美一区| 欧美日韩一区二区不卡| 岛国毛片av在线| 日本在线播放一区| 国产精品123区| 日本中文字幕在线| 久青草国产97香蕉在线视频| 麻豆成人入口| 福利片一区二区三区| 亚洲国产欧美在线| 成人影视在线播放| 电影午夜精品一区二区三区| 久久精品女人| 欧美成人精品欧美一| 亚洲一级黄色av| 538任你躁精品视频网免费| 老熟妇仑乱视频一区二区| 一区二区三区四区视频精品免费 | 亚洲天堂中文字幕在线| 欧美激情视频一区二区三区不卡| 蜜臀91精品国产高清在线观看|