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

使用Docker來編排Web應用

開發
考慮這樣一個場景,一個正在運行的web應用,它用到了vue、java8、java15、tomcat、nginx、php、mysql和redis。如果要將這個應用遷移到一臺新的服務器上運行,那么就需要在這臺機器上重新安裝所需的軟件以及環境變量,這是很痛苦的。

前言

使用docker可以輕松構建一個項目并運行,然而在真實的使用場景中,我們的項目并非是單一的,而是多個項目相互依賴組成一個web應用。

考慮這樣一個場景,一個正在運行的web應用,它用到了vue、java8、java15、tomcat、nginx、php、mysql和redis。如果要將這個應用遷移到一臺新的服務器上運行,那么就需要在這臺機器上重新安裝所需的軟件以及環境變量,這是很痛苦的。

那么,有沒有什么辦法來解決這個問題呢?當然有,那就是本文的主角docker-compose(docker編排)。本文就跟大家分享下我是如何使用它解決我的痛苦的,歡迎各位感興趣的開發者閱讀本文。

前置知識

閱讀本文前,你需要先提前安裝好Docker[1]和 docker-compose[2]。如果你已經安裝,我們先來了解幾個基礎概念。如果你僅僅只是想學習我是如何編排整個web應用的,請直接從編排容器[3]章節開始閱讀。

鏡像

操作系統分為內核和用戶空間,對于Linux而言,內核啟動后,會掛載root文件系統,為其提供用戶空間支持。而Docker鏡像就相當于一個root文件系統。比如官方的鏡像ubuntu:20.04就包含了完整的一套ubuntu最小系統的rooot文件系統。

Docker的鏡像是一個比較特殊的文件系統,它除了提供容器運行時所需的東西外,還包含了一些為運行時準備的一些配置參數(掛載卷、環境變量、用戶等)。鏡像不會包含任何的動態數據,因此在構建之后,它的內容不會被改變。

如果你還是一頭霧水的話,可以將它比作“備份”,在需要的時候把它拿出來即可原封不動的獲得備份時刻的內容。

可能有些開發者會有疑問,即使是最小的root文件系統,它的體積也是龐大的。Docker在設計時,就充分利用 Union FS[4] 的技術,將其設計為分層存儲的架構。這種架構使得鏡像的復用、定制變的更為容易,可以用之前構建好的鏡像作為基礎層,然后進一步添加新的層,以定制自己所需的內容,構建新的鏡像。

??注意:鏡像構建時,會一層層構建,前一層是后一層的基礎。每一層構建完就不會再發生改變,后一層上的任何改變只發生在自己這一層。因此,在編寫鏡像配置文件的時候,每一層盡量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉(比如你在某一層需要刪除前一層的文件,它只是將文件標記為了已刪除,最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像)。

容器

鏡像與容器之間的關系,類似于Java中的類與實例。鏡像是類,容器是實例化出來的實例。容器可以被創建、啟動、停止、刪除、暫停等。

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行于屬于自己的獨立的命名空間。因此容器可以擁有自己的root文件系統、網絡配置、進程空間。容器內的進程是運行在一個隔離的環境里,使用起來,就好像是在一個獨立于宿主的系統下操作一樣。

前面我們講過鏡像使用的是分層存儲,容器也是如此。每一個容器運行時,以鏡像為基礎層,在其上創建一個當前容器的存儲層,這個為容器運行時讀寫而準備的存儲層稱之為容器存儲層。

??注意:容器存儲層的生命周期和容器一樣,容器銷毀時,存儲層也隨之銷毀。因此,任何保存于存儲層的信息都會隨著容器的銷毀而丟失。

因此,當我們的容器需要進行數據寫入時,需要 使用volume數據卷 或者 掛載宿主機的目錄 來實現數據的持久化。

倉庫

當我們構建好鏡像之后,很容易在當前的宿主機上運行,但是,如果需要在其他服務器上使用這個鏡像,我們就需要一個倉庫來存儲和分發它們。Docker Registry[5] 就是這樣的服務。

一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標簽(Tag);每個標簽對應一個鏡像。

一個倉庫包含同一個軟件不同版本的鏡像,標簽就對應著軟件的各個版本。我們通過<倉庫名>:<標簽>的格式來指定具體是那個版本的鏡像。

我們以ubuntu鏡像為例,ubuntu是倉庫的名字,其內包含有不同的版本標簽,如:18.04,20.04。我們在編寫配置文件的時候,就可以通過ubuntu:18.04、ubuntu:20.04來指定具體所需版本的鏡像。如果忽略了標簽,將視為ubuntu:latest。

公開服務

Docker Registry 公開服務是開放給用戶使用,允許用戶管理鏡像的Registry服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像。

最常使用的公開服務是官方的 Docker Hub[6],這個也是默認的Registry。擁有大量的官方鏡像。除此之外,還有:

  • Red Hat 的 Quay.io[7]
  • Google 的 Google Container Registry[8]

私有部署

當用戶制作好一個鏡像后,不方便在公開服務上發布時,就需要在內部自己搭建Docker Registry。官方提供了 Docker Registry[9] 鏡像,可以直接使用做為私有 Registry 服務。

開源的 Docker Registry 鏡像只提供了 Docker Registry API[10] 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。

除了官方的 Docker Registry 外,還有第三方軟件實現了 Docker Registry API,提供了用戶界面以及一些高級功能。比如:Harbor[11]

創建鏡像

Docker鏡像的構建是通過讀取Dockerfile文件來完成的,它本質是一個文本文件,其內包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。

編寫配置文件

此處以我的開源項目chat-system的后端服務為例,在項目的根目錄創建名為chat-system-server-DockerFile的文件,在文件內添加下述代碼:

  • 通過FROM指令來指定基礎鏡像
  • 通過COPY指令來復制文件到鏡像內
  • 通過EXPOSE指令來聲明服務運行時的端口號
FROM tomcat:9.0.41-jdk8-openjdk

COPY ./chat-system-server.war /usr/local/tomcat/webapps/
COPY ./tomcat/conf/server.xml /usr/local/tomcat/conf/server.xml


EXPOSE 8080

圖片圖片

上面的指令:我們用了9.0.41版本的tomcat且jdk版本為1.8的鏡像作為基礎環境,隨后我們拷貝了項目的war包到tomact的webapps目錄下,拷貝了tomcat的配置文件到了鏡像內。聲明了8080為本服務的訪問端口號。

常用的指令

在DockerFile中,除了前面我們所講的,還有很多內置的指令可以用,此處我們挑幾個常用的來做下講解。

  • ADD 用于從URL獲取文件并將其放到目標路徑下
  • RUN 用于執行命令行命令,支持兩種格式:
  • shell格式,RUN <命令>相當于直接在命令行中輸入命令。
  • exec格式,RUN ["可執行文件","參數1","參數2"]
  • CMD 用于指定容器在啟動時所需要運行的程序以及參數,與RUN命令支持的格式相同
  • ENV 用于設置環境變量
  • WORKDIR 用于指定工作目錄,鏡像在構建過程中,每一行都代表一層,如果你在上一層做了操作,在當前層需要基于上層完成其他事情,就需要指定它的工作目錄

如果你想了解完整的的指令列表,請移步:Dockerfile 指令詳解[12]。

??注意:在編寫配置文件的時候,如果需要執行多個類似于RUN的指令時,請用&&來拼接。因為前面我們講過docker是分層存儲機制,每一個指令都會建立一層,如果運行了多個RUN指令,它就會創建多層鏡像,這是完全沒有意義的,而且很多運行時不需要的東西,都被裝進了鏡像里,比如編譯環境、更新的軟件包等等。結果就是產生非常臃腫、非常多層的鏡像,不僅僅增加了構建部署的時間,也很容易出錯。Dockerfile 支持 Shell 類的行尾添加 \ 的命令換行方式,以及行首 # 進行注釋的格式。

RUN set -x; buildDeps='gcc libc6-dev make wget' \    && apt-get update \    && apt-get install -y $buildDeps \    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" 

構建鏡像

打開終端,進入Dockerfile文件所在在的目錄,執行 docker build -t chat-system-server:1.0.0 -f chat-system-server-DockerFile .命令,即可開始構建流程。

  • -t 用于指定容器名
  • -f 用于指定配置文件
  • . 表示當前目錄,在終端執行build命令時,需要指定構建鏡像的上下文路徑。

圖片圖片

image-20231109215729884

??注意:如果你沒有指定配置文件,它默認會使用目錄下名為Dockerfile的文件。如果你的配置文件中包含了COPY操作,請務必指定上下文路徑。

啟動容器

啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另一種是啟動一個處于終止狀態的容器。

新建并啟動

使用docker run 鏡像名即可創建一個容器并啟動它,我們以上個章節創建的鏡像為例。

docker run chat-system-server:1.0.0

命令執行后,你將在控制臺看到相關的輸出。

圖片圖片

容器啟動之后,通過鏡像中聲明的8080端口訪問,你會發現訪問不了。這是因為容器啟動后沒有做端口映射,我們需要在啟動命令中添加-p參數來指定端口。

  • -p 后面跟主機訪問地址,:后跟的是容器的訪問端口。
  • 容器的訪問端口通常會使用Dockerfile中通過EXPOSE指令所定義的端口號。
docker run -p 127.0.0.1:8080:8080 chat-system-server:1.0.0

啟動已終止容器

使用docker container start 容器名即可啟動一個處于終止狀態的容器。因為我們是新建的容器,沒有給它命名,docker會默認一個容器名,我們可以通過docker ps -a命令來拿到容器名,或者通過Webstorm的Docker插件來獲取。

圖片圖片

image-20231113223349254

docker container start crazy_wu

常用的參數與命令

容器在啟動時,有豐富的參數可以配置,此處我列舉幾個最常用的參數。

在后臺運行容器

我們新建并啟動一個容器[13]時,默認會在當前終端中運行,終端窗口關閉后,容器也會跟著終止。通過-d參數即可讓它在后臺運行。

docker run -d -p 127.0.0.1:8080:8080 chat-system-server:1.0.0

為容器命名

我們在新建容器時,可以通過--name參數來給它命名。

docker run --name local_chat_system_server -d -p 127.0.0.1:8080:8080 chat-system-server:1.0.0

圖片圖片

終止與刪除容器

我們可以通過stop和rm指令來終止和刪除容器。

# 終止容器
docker container stop 容器名
# 刪除容器
docker container rm 容器名

進入容器

如果容器處于后臺運行時,我們需要進入容器,做一些操作。就需要使用docker exec -it 容器名 bash來實現。

docker exec -it local_chat_system_server bash

執行命令后,就能看到熟悉的終端了。

圖片圖片

數據掛載

前面我們說過,容器內存儲的數據會隨著容器的終止而丟失,需要掛載數據卷來實現數據的持久化存儲。通常有兩種做法:

  • 數據卷
  • 目錄映射

通過數據卷來做存儲需要先使用docker volume create 卷名 命令來創建,新建并啟動一個容器[14]的時候通過--mount指令或者-v 數據卷:容器目錄地址來掛載。

# 創建一個數據卷
docker volume create chat-system-data
# 啟動容器并掛載數據卷
docker run -d  \
    --name local_chat_system_server \
    --mount source=chat-system-data,target=/usr/local/data \
   chat-system-server:1.0.0

容器啟動后,會將日志寫到我掛載的數據卷中。當我想在主機上查看寫入的日志數據時,發現怎么找也找不到。查了很多資料,最后發現他的數據卷存儲很復雜,并沒有集中存儲,而是分布式的。

這種方式顯然不是我想要的,而目錄映射的方式正好滿足我的需求。我們只需要將數據卷改為主機的路徑即可,此處我們以-v參數為例。

docker run -d  \
    --name local_chat_system_server \
    -v /Users/likai/Documents/chat-system-server-data:/usr/local/data \
   chat-system-server:1.0.0

??注意:目錄映射的形式會把指定的主機路徑與容器內的目標路徑做關聯,本地主機做的操作會響應到容器內,反之亦然。

編排容器

現在,我們回到文章開頭所說的那個場景,一開始我打算使用ubuntu:20.04作為基礎鏡像,寫DockerFile安裝我需要的依賴包,設置環境變量,打包成鏡像來使用。我在做事情之前,喜歡先請教下這方面玩的比較好的朋友。

他們告訴我說,如果全部打包到一個鏡像里 ,后期維護與擴展將成為惡夢,后面你要添加新項目,想訪問一些之前項目里提供的服務,你就得做很大的改動。一般這種場景我們都會使用Docker Compose來實現的。

簡而言之,Docker Compose的作用就是將多個獨立的容器組合起來,讓容器之間可以輕易的互相訪問,最終實現我們的需求。

編寫配置文件

容器的編排是通過編寫docker-compose.yml配置文件來實現的,一般我們會將這個文件創建在項目的根目錄。它的配置文件中包含有很多配置項,此處我們只列舉本文需要用到的。

  • version,用于指定 Docker Compose 文件的格式版本,以確保正確解析和處理文件中的配置,截止目前(2023-11-15)比較主流的版本為3
  • networks,用于自定義網絡
  • services,用于定義各種服務(mysql、redis、nginx等)將它們組合到一起,形成一個web應用

定義網絡

在物理機上部署服務時,多個服務之間相互訪問,需要物理機必須處于同一個網關下(防火墻也要正確的配置),這樣就能實現多個容器之間的互聯互通。

在docker-compose中流程也是一樣的,因此我們就需要先定義一個網絡,設置好網關。如下所示,我們定義了一個名為kaisir-docker-network的自定義網絡。

  • external: true 表示該網絡為外部網絡,其他Docker容器可以連接到這個網絡
  • name 指定了網絡名稱
  • driver: bridge指定網絡的連接模式為橋接,他還有很多其他模式可供選擇(host、overlay等)具體請自行查閱相關資料
  • ipam用于IP地址的配置

driver: default,用于指定IP地址管理的驅動程序,此處選擇默認即可

config,用于配置IP地址池,在這里我們定義了一個子網為192.168.30.0/24,其中包含了192.168.30.1到192.168.30.254的所有IP地址。gateway指定了網關地址為 192.168.30.1

networks:
    kaisir-docker-network:
        external: true
        name: kaisir-docker-network
        driver: bridge
        ipam:
            driver: default
            config:
                - subnet: 192.168.30.0/24
                  gateway: 192.168.30.1

通過上述配置,我們就可以在服務中連接這個網絡了。有些開發者可能對192.168.30.0/24比較疑惑,這里就稍作下解釋 。這是一個 CIDR(Classless Inter-Domain Routing)表示法,用于表示 IP 地址范圍。CIDR 表示法包括兩部分:IP 地址的網絡部分和主機部分,通過斜杠后面的數字表示網絡的長度。

在 192.168.30.0/24 中:

  • 192.168.30.0 是網絡的基礎 IP 地址。
  • /24 表示網絡的前綴長度,即網絡中有多少個連續的 IP 地址。在這里,它表示有24位用于網絡,剩余的 32 - 24 = 8 位用于主機。

具體地,192.168.30.0/24 表示從 192.168.30.0 到 192.168.30.255 的IP地址范圍,其中包括了 192.168.30.1 到 192.168.30.254 的所有IP地址。192.168.30.0 是網絡地址,192.168.30.255 是廣播地址。

定義服務

我可以在services指令下定義我們需要的服務,為他們連接網絡、掛載數據卷、設置時區、定義訪問端口等,我們以mysql為例來做講解,如下所示:

  • mysql為服務名稱
  • image為鏡像名稱
  • container_name為容器名稱
  • volumes為我們需要掛載的數據卷
  • ports為端口映射
  • networks為服務需要接入的網絡,定義服務需要分配的ip地址
  • environment 設置容器的環境變量,此處我們設置了mysql的root用戶密碼以及時區
services:
    mysql:
        image: mysql:5.7.42
        container_name: local_mysql
        volumes:
             - /Users/likai/Documents/mysql_data:/var/lib/mysql
             - /Users/likai/Documents/mysql_conf/my.cnf:/etc/my.cnf
        ports:
            - 3306:3306
        networks:
            kaisir-docker-network:
                ipv4_address: 192.168.30.11
        environment:
            - MYSQL_ROOT_PASSWORD=xxxx
            - TZ=Asia/Shanghai

通過這幾行配置,我們就擁有了一個mysql服務。并且其他服務可以通過192.168.30.11:3306訪問到這個服務。

我們再來定義Java服務和nginx服務,以我的chat-system-server為例,在打包Java服務時,將數據庫的地址指向我們剛才的mysql服務即可。

圖片圖片

chat-system-server:
        image: tomcat:9.0.41-jdk8-openjdk
        container_name: chat_system_server
        ports:
            - 8080:8080
        volumes:
            - /Users/likai/Documents/docker_tomcat/webapps:/usr/local/tomcat/webapps
            - /Users/likai/Documents/chat-system-server-data:/usr/local/data
            - /Users/likai/Documents/docker_tomcat/conf/:/usr/local/tomcat/conf
        environment:
            - TZ=Asia/Shanghai
        networks:
            kaisir-docker-network:
                ipv4_address: 192.168.30.12
    nginx-server:
        image: nginx:1.18.0
        container_name: local_nginx
        ports:
            - 80:80
            - 443:443
        volumes:
            - /Users/likai/Documents/nginx_config:/etc/nginx
            - /Users/likai/Documents/nginx_data:/usr/share/nginx/data
        environment:
            - TZ=Asia/Shanghai
        networks:
            - kaisir-docker-network
        depends_on:
            - redis
            - mysql
            - chat-system-server
            - kodbox
            - halo

同樣的,其他的服務也通過這種格式進行定義即可。上面的配置中,我還定義了redis、kodbox、halo這三個服務。

  • kodbox 是我之前搭建的網盤服務[15],依賴php環境
  • halo 是我的個人網站[16],依賴Java15環境

因為有多個服務都需要用到數據庫,我需要確保數據庫先啟動,因此上面的配置中,我還用depends_on指令定義了服務的啟動順序。

??注意:上面的配置文件中,本地路徑是寫死在配置文件中的,實際在使用的時候一般會通過變量的形式注入一個路徑前綴進來,如下所示:

  • 如果 MY_VOLUME_PATH 環境變量存在并且非空,則使用它的值
  • 否則,使用默認值 /default/path

        volumes:            - ${MY_VOLUME_PATH:-/default/path}/docker_tomcat/webapps:/usr/local/tomcat/webapps

啟動服務

最后,我們在終端通過docker-compose up命令即可啟動我們定義好的所有服務。因為我們映射了本地的8080端口為chat_system_server的服務,我們在postman內通過127.0.0.1:8080即可訪問到這個容器所提供的服務了。

docker-compose up

圖片圖片

圖片圖片

在nginx的配置文件中我也暴露了80端口出來,指向了halo服務,在瀏覽器中直接訪問127.0.0.1就能看到服務所提供的內容了。

圖片圖片

image-20231115222119946

??注意:如果你的配置文件中定義了路徑變量則需要在啟動時傳入這個變量,如下所示:

MY_VOLUME_PATH=/path/to/your/volume docker-compose up

踩坑記錄

我在配置mysql服務時,走了很多彎路,不知道哪步搞錯了,啟動服務后會報錯find: '/var/lib/mysql/mysql.sock': No such file or directory,導致啟動失敗,我嘗試過刪除容器、刪除鏡像,清空主機映射的目錄文件,都解決不了。

最后,發現是權限原因,在 docker-compose.yml文件中,給mysql服務添加下述配置即可解決。問題解決后,再把這些去掉即可。

command:
      - /bin/bash
      - -c
      - |
        chmod +rw /var/lib/mysql
        mysqld

參考資料

[1]Docker: https://yeasy.gitbook.io/docker_practice/install

[2]docker-compose: https://yeasy.gitbook.io/docker_practice/compose/install

[3]編排容器: ##編排容器

[4]Union FS: https://en.wikipedia.org/wiki/Union_mount

[5]Docker Registry: https://docs.docker.com/registry/

[6]Docker Hub: https://hub.docker.com/

[7]Quay.io: https://quay.io/repository/

[8]Google Container Registry: https://cloud.google.com/container-registry/

[9]Docker Registry: https://hub.docker.com/_/registry/

[10]Docker Registry API: https://docs.docker.com/registry/spec/api/

[11]Harbor: https://github.com/goharbor/harbor

[12]Dockerfile 指令詳解: https://yeasy.gitbook.io/docker_practice/image/dockerfile

[13]新建并啟動一個容器: ###新建并啟動

[14]新建并啟動一個容器: ###新建并啟動

[15]搭建的網盤服務: https://www.kaisir.cn/post/112

[16]個人網站: https://www.kaisir.cn/post/140

[17]個人網站: https://www.kaisir.cn/

責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2024-01-01 08:46:32

2023-06-25 08:12:02

2023-11-02 08:45:07

2020-07-06 11:32:50

HTTPHTTP Header開發者

2015-01-05 14:16:16

DockerFig自動化容器編排

2011-05-25 17:10:39

ibmdw

2023-12-14 15:51:15

2012-03-20 10:28:43

2014-12-08 10:02:46

Docker開源跨容器服務

2012-09-13 11:13:26

IBMdw

2015-07-28 11:10:22

Docker容器容器編排

2013-11-19 15:35:01

2019-11-25 11:20:08

FlutterWeb應用軟件開發

2020-01-09 15:28:30

KubernetesDocker:容器

2011-03-25 11:06:46

2014-11-25 14:04:59

DockerDocker Nodeweb應用部署

2022-09-01 10:10:27

數據編排技術

2014-11-05 20:05:46

dockerJenkins

2015-01-21 15:40:44

GoRuby

2010-03-03 15:46:40

Android應用程序
點贊
收藏

51CTO技術棧公眾號

偷拍女澡堂一区二区三区| 熟女视频一区二区三区| 精品国产一区二区三区四| 精品国产乱码| 欧美日本国产视频| 黄色一级大片免费| 日本亚洲欧美| 美女脱光内衣内裤视频久久网站| 色综合久久中文字幕综合网小说| 国产黄色三级网站| 麻豆久久久久| 欧美日韩国产一区二区| 自拍偷拍99| 天天色综合av| 九色|91porny| 欧洲成人在线观看| 国产一二三区精品| 一区二区三区日本久久久| 欧美日韩情趣电影| 波多野结衣家庭教师在线| aaa在线观看| 成人免费毛片高清视频| 国产精品劲爆视频| 日本熟女一区二区| 亚洲成人一区| 国产亚洲一级高清| 国产精品亚洲一区二区无码| 日韩城人网站| 午夜久久久久久电影| 熟妇熟女乱妇乱女网站| 国产在线一在线二| 99久久er热在这里只有精品15| 91亚洲精品一区| 高潮无码精品色欲av午夜福利| 99精品视频网| 久久99视频免费| 青青操在线视频观看| 九九热爱视频精品视频| 亚洲电影第1页| 夜夜爽久久精品91| 欧美高清你懂的| 欧洲亚洲国产日韩| 欧美日韩二三区| 国模雨婷捆绑高清在线| 亚洲欧美福利一区二区| 在线成人性视频| 成人网视频在线观看| 久久久久久久久久久久久女国产乱| 都市激情久久久久久久久久久| 国产乱人乱偷精品视频| 久久国产欧美| 538国产精品一区二区在线| 日本三级视频在线| 91久久午夜| 久久久久久亚洲精品| 欧美精品久久久久性色| 综合视频在线| 欧美黑人一级爽快片淫片高清| 国产美女久久久久久| 一区二区三区毛片免费| 久久av在线播放| 国产美女福利视频| 综合天堂av久久久久久久| 九九久久久久99精品| 久久久久久久久久久97| 亚洲天堂激情| 久久理论片午夜琪琪电影网| 国产一级一片免费播放| 在线视频观看日韩| 国产91ⅴ在线精品免费观看| 国产毛片aaa| 久久久久91| 国产精品女人网站| 亚洲综合一区中| 国产一区二区免费视频| 动漫精品视频| 香蕉久久一区二区三区| 久久久99久久| 一区在线电影| 欧美videosex性极品hd| 精品日本高清在线播放 | 日本r级电影在线观看| 国产亚洲精aa在线看| 精品国精品国产尤物美女| 人妻互换一二三区激情视频| 你懂的在线观看一区二区| 亚洲女成人图区| 国产jizz18女人高潮| 亚洲先锋影音| 欧美一级bbbbb性bbbb喷潮片| 中文字幕日韩免费| 精品一区二区日韩| 狠狠色噜噜狠狠色综合久 | 国产精品主播在线观看| 亚洲女人天堂av| 国产福利视频网站| 一区二区毛片| 成人欧美一区二区三区在线 | caoporen国产精品视频| 三区精品视频| 免费不卡av| 欧美中文一区二区三区| 51自拍视频在线观看| 欧美午夜寂寞| 久热精品视频在线免费观看| 欧美三级韩国三级日本三斤在线观看| 日韩成人伦理电影在线观看| 91九色露脸| 国产免费av在线| 亚洲一区中文日韩| 黄色手机在线视频| 盗摄系列偷拍视频精品tp| 国产一区二区三区毛片| 中文在线观看免费网站| 久久国产人妖系列| 蜜桃麻豆91| 丝袜美腿av在线| 欧美日韩一区二区三区在线看| 偷偷色噜狠狠狠狠的777米奇| 色男人天堂综合再现| 91国自产精品中文字幕亚洲| 国产片高清在线观看| 91麻豆福利精品推荐| 性做爰过程免费播放| 亚洲1234区| 精品香蕉一区二区三区| 欧美人妻精品一区二区三区| 精品在线观看免费| 欧美在线激情| 老牛影视精品| 精品国产乱码久久久久久牛牛 | 狠狠色综合网| 成人在线小视频| 国产午夜在线观看| 狠狠躁夜夜躁人人躁婷婷91| 一级黄色免费视频| 欧美/亚洲一区| 亚洲va欧美va国产综合久久| 亚洲1卡2卡3卡4卡乱码精品| 色综合色综合色综合色综合色综合| 男男受被啪到高潮自述| 亚洲电影影音先锋| 国产欧美婷婷中文| 9色在线视频| 欧美在线观看18| 黄免费在线观看| 日韩一区欧美二区| 日本一区二区在线视频| 黑人巨大精品| 亚洲天堂av在线免费| 亚洲高清毛片一区二区| 99精品视频一区二区三区| av在线播放亚洲| 久久99国产精品久久99大师| 国产69精品久久久| 国产91免费在线观看| 亚洲国产精品久久不卡毛片| 亚洲国产精品第一页| 亚洲五月婷婷| 国产亚洲情侣一区二区无| 久久av色综合| 日韩精品免费在线视频观看| 五月天婷婷久久| 久久精品网站免费观看| 欧美婷婷精品激情| 日韩精品2区| 2014亚洲精品| 24小时免费看片在线观看| 亚洲激情自拍图| 国产精品免费精品一区| 国产欧美日韩三区| 久久久久xxxx| 欧美fxxxxxx另类| 国产伦精品一区二区三区四区视频| 51精品视频| 亚洲片在线资源| 97成人免费视频| 亚洲一区二区影院| 亚洲AV无码国产精品| 性伦欧美刺激片在线观看| 日本黄网免费一区二区精品| 色综合久久久| 欧美激情中文字幕乱码免费| 欧洲伦理片一区 二区 三区| 欧美视频一区二区三区| 国产成人无码aa精品一区| 99久久综合国产精品| 成人免费毛片播放| 伊人色**天天综合婷婷| 精品日韩美女| 成人激情久久| 91豆花精品一区| 黄色网在线免费看| 日韩大陆欧美高清视频区| 伊人精品在线视频| 亚洲成av人影院| 国产精品情侣呻吟对白视频| 成人在线视频一区| 黄色国产小视频| 亚洲最大黄网| 日本不卡二区高清三区| 中文在线综合| 国产伦精品免费视频| 91九色porn在线资源| 久久精品99久久久久久久久 | 成人v精品蜜桃久久一区| 欧美自拍小视频| 精品动漫一区| 国产又粗又爽又黄的视频| 国产精品片aa在线观看| 国产精品伊人日日| a一区二区三区亚洲| 日韩美女免费线视频| 美女扒开腿让男人桶爽久久动漫| 日韩视频一区二区| 午夜视频网站在线观看| 亚洲国产一二三| 婷婷伊人五月天| 久久久久久久久久久久久女国产乱 | 欧美三级电影一区| 天天操天天摸天天干| 一区二区三区在线视频免费| 国产破处视频在线观看| 91啦中文在线观看| 国产一级黄色录像| 国产成人精品一区二区三区四区| 亚洲综合av在线播放| 久久天天综合| 黄色a级片免费| 99精品国产福利在线观看免费 | 六月婷婷一区| 麻豆tv在线播放| 欧美日韩hd| 今天免费高清在线观看国语| 清纯唯美日韩| 欧美大香线蕉线伊人久久国产精品| 久久一级大片| 国产免费一区视频观看免费| 素人一区二区三区| 青青草精品毛片| 蜜桃视频动漫在线播放| 高清视频欧美一级| 男女免费观看在线爽爽爽视频| xxav国产精品美女主播| 巨大荫蒂视频欧美大片| 伊人久久综合97精品| 天堂在线免费av| 欧美日本国产视频| 国产精品毛片久久久久久久av| 色综合天天综合色综合av| 国产一级片免费看| 五月天精品一区二区三区| 波多野结衣亚洲色图| 亚洲美女屁股眼交3| 国产专区欧美专区| 成人av无码一区二区三区| 欧美色图第一页| 亚洲综合精品国产一区二区三区| 日本韩国视频一区二区| 青青国产在线观看| 亚洲国产另类av| 久久精品国产亚洲av高清色欲| 一区二区在线观看不卡| 老司机福利在线观看| 国产亚洲人成网站| 日韩精品无码一区二区三区久久久| 久久综合综合久久综合| 久久久久久久久久毛片| 国产一区视频在线看| 欧美日韩一区二区三区69堂| 国产老肥熟一区二区三区| 激情图片中文字幕| 国产一区不卡视频| jjzzjjzz欧美69巨大| 不卡av在线免费观看| 日本xxx在线播放| 国产欧美一区二区精品性色超碰| 中国女人特级毛片| 国产精品全国免费观看高清 | 日本免费a视频| 亚洲视频观看| 久久久久免费看黄a片app| 亚洲精品色图| 熟妇人妻va精品中文字幕| 久久精品男女| 天堂在线精品视频| 成人黄色a**站在线观看| 久久久久99人妻一区二区三区| av亚洲精华国产精华| 成人免费毛片糖心| 国产精品久久夜| 黄色片视频网站| 91九色最新地址| 国产精品一区二区黑人巨大| 亚洲电影在线看| 黄上黄在线观看| 理论片在线不卡免费观看| 亚洲精品永久免费视频| 国产精品日韩久久久久| 视频成人永久免费视频| 久久国产日韩欧美| 久久久久久久久99精品大| 欧美一级片免费播放| 日本亚洲一区二区| 欧美一区二区在线视频| 日本妇乱大交xxxxx| 精品99久久久久久| 国产在线观看免费| 不卡av电影院| 精品美女一区| 国产一区高清视频| 日韩精品一区二区久久| 男女视频网站在线观看| 麻豆成人在线观看| www.免费av| 亚洲夂夂婷婷色拍ww47| 超碰在线97观看| 91精品国产综合久久精品图片 | 国产一区二区三区久久久| 30一40一50老女人毛片| 亚洲视频 欧洲视频| 国产又色又爽又黄的| 日韩欧美国产综合一区| 欧洲成人av| 性日韩欧美在线视频| 色妞ww精品视频7777| 亚洲欧美电影在线观看| 宅男噜噜噜66国产日韩在线观看| 韩国三级在线看| 亚洲欧美日本在线| 这里只有精品免费视频| 亚洲女人天堂视频| 波多野一区二区| 亚洲free嫩bbb| 先锋资源久久| 久久午夜夜伦鲁鲁一区二区| 国产精品原创巨作av| 在线看的片片片免费| 色久优优欧美色久优优| www.黄色片| 欧美精品情趣视频| 国产精品99久久免费| 一本久道久久综合| 三级欧美在线一区| 亚洲久久久久久| 高跟丝袜一区二区三区| 免费观看国产视频| 九九热这里只有精品免费看| 精品一区二区三区在线观看视频| 亚洲乱码一区二区三区| 欧美a一区二区| 久草手机视频在线观看| 欧美日韩一区二区在线观看 | 久久综合狠狠综合久久激情 | 99电影网电视剧在线观看| 国产三级在线免费观看| 亚洲美女屁股眼交3| 中文区中文字幕免费看| 伊人久久综合97精品| yy6080久久伦理一区二区| 国产欧美一区二区在线播放| 亚洲一区二区三区高清| 日本五十肥熟交尾| 一本色道久久综合亚洲91| 四虎影视在线观看2413| 欧美一区二区三区免费观看| 九九视频免费观看视频精品 | 日韩av在线播放中文字幕| 永久免费毛片在线观看| 欧美日韩一区精品| 黄色网址视频在线观看| 国产乱码精品一区二区三区卡| 亚洲精品麻豆| 久久久久国产精品区片区无码| 色婷婷综合久久久久中文一区二区 | heyzo一区| 久久精品日产第一区二区三区乱码| 日韩视频一区| 欧美波霸videosex极品| 欧美日韩激情在线| 蜜臀av国内免费精品久久久夜夜| 国产一区二区免费电影| 性色av一区二区怡红| 欧美巨胸大乳hitomi| 欧美日本国产一区| 丝袜美女在线观看| 神马影院午夜我不卡| 久久99久久99小草精品免视看| 国产一级视频在线| 亚洲区在线播放| 日本a人精品| 国产日本在线播放| 久久精品视频在线看| 五月激情丁香网| 欧美精品久久一区二区| 亚洲成aⅴ人片久久青草影院| 五月天婷婷在线观看视频| 亚洲国产综合91精品麻豆| 免费在线观看污视频| 成人免费在线看片|