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

面向開發人員的鏡像和容器實踐指南

譯文 精選
數據庫
了解鏡像和容器背后的關鍵概念。然后嘗試演示一個構建和運行鏡像和容器的實驗。

容器和Open Container Initiative (OCI)是重要的開源應用程序打包和交付技術, Docker 和 Kubernetes 等項目使其流行起來。您對它們理解得越好,就越能夠使用它們來增強項目的一致性和可伸縮性。

在本文中,我將用簡單的術語描述這項技術,重點介紹鏡像和容器的基本方面以供開發人員理解,然后討論開發人員可以遵循的一些最佳實踐,以使他們的容器可移植。我還將引導您完成一個簡單的實驗,該實驗將演示如何構建和運行鏡像和容器。

什么是鏡像?

鏡像只不過是軟件的一種打包格式。一個很好的類比是 Java 的 JAR 文件或 Python 輪子。JAR(或 EAR 或 WAR)文件只是具有不同擴展名的 ZIP 文件,Python 輪子作為 gzip 壓縮包分發。它們都遵循一個標準的內部目錄結構。

鏡像被打包為tar.gz(gzipped tarballs),它們包括您正在構建或分發的軟件,但也就是僅有這點與 JAR 和輪子能夠類比的地方。一方面,鏡像不僅包含您的軟件,還包含運行您的軟件所需的所有支持依賴項,包括一個完整的操作系統。輪子和jar通常是作為依賴項構建的,但也可以是可執行的,而鏡像幾乎總是構建為可執行的,很少作為依賴項構建。

了解鏡像中內容的詳細信息對于了解如何使用鏡像或為它們編寫和設計軟件并不是必要的。從軟件的角度來看,重要的是要理解您創建的鏡像將包含一個完整的操作系統。因為從您希望運行的軟件的角度來看,鏡像被打包成一個完整的操作系統,所以它們必然比以更傳統方式打包的軟件大得多。

請注意,鏡像是不可變的。它們一旦構建就無法更改。如果您修改鏡像上運行的軟件,就必須構建一個全新的鏡像并替換舊鏡像。

標簽

在鏡像被創建時,通常都會使用一個唯一的哈希值來創建,但也會使用人類可讀的名稱標識它們。例如ubi、ubi-minimal、openjdk11等。但是,每個名稱都可以有不同版本的鏡像,并且通常通過標簽來區分。例如,openjdk11鏡像可能被標記為jre-11.0.14.1_1-ubi和jre-11.0.14.1_1-ubi-minimal,分別表示openjdk11軟件包版本11.0.14.1_1基于Red Hat ubi和ubi最小鏡像構建的鏡像。

什么是容器?

容器是在主機系統上實例化并運行的鏡像。從鏡像到運行容器分為兩步:創建和啟動。創建獲取鏡像并為其提供自己的 ID 和文件系統。Create(例如在docker Create中)可以重復多次,以創建一個鏡像的多個運行實例,每個實例都有自己的 ID 和文件系統。啟動容器將在主機上啟動一個隔離的進程,在容器中運行的軟件將表現得就像運行在自己的虛擬機中一樣。因此,容器是主機上的一個獨立的進程,具有自己的 ID 和獨立的文件系統。

從軟件開發人員的角度來看,使用容器有兩個主要原因:一致性和可伸縮性。這些是相互關聯的,它們共同允許項目使用近年來最有前途的軟件開發創新之一,即“一次構建,多次部署”的原則。

一致性

因為鏡像是不可變的,并且包含了從操作系統上運行軟件所需的所有依賴項,所以無論您選擇在何處部署它,都可以獲得一致性。這意味著無論您在開發、測試或任何數量的生產環境中將鏡像作為容器啟動,容器都將以完全相同的方式運行。作為軟件開發人員,您不必擔心這些環境是否運行在不同的主機操作系統或版本上,因為容器每次都運行相同的操作系統。這就是將軟件與其完整的運行時環境一起打包的好處,而不僅僅是因為缺乏必需的環境或依賴軟件,而無法運行的軟件。

這種一致性意味著在幾乎所有情況下,當在一個環境(例如,生產環境)中發現問題時,您可以確信自己能夠在開發或其他環境中重現該問題,因此您可以確認行為并專注于修復它。您的項目永遠不應該再次陷入“但是它可以在我的機器上工作”的可怕問題。

可伸縮性

鏡像不僅包含您的軟件,還包含運行您的軟件所需的所有依賴項,包括底層操作系統。這意味著在容器內運行的所有進程都將容器視為宿主系統,宿主系統對容器內運行的進程是不可見的,并且從宿主系統的角度來看,容器只是它管理的另一個進程。當然,虛擬機做的事情幾乎一樣,這就提出了一個合理的問題:為什么要使用容器技術而不是虛擬機?答案在于速度和規模。

容器只需運行支持獨立主機所需的軟件,而無需模擬硬件的開銷。虛擬機必須包含完整的操作系統并模仿底層硬件。后者是一個非常重量級的解決方案,它也會產生更大的文件。因為從主機系統的角度來看,容器只是另一個正在運行的進程,所以它們可以在幾秒鐘內而不是幾分鐘內啟動。當您的應用程序需要快速擴容時,容器每次都會在資源和速度上擊敗虛擬機。而且容器也更容易收縮。

從功能的角度來看,可伸縮性超出了本文的范圍,因此本實驗不會演示該特性,但是為了理解為什么容器技術代表了軟件打包和部署方面的重大進步,理解該原理是很必要的。

注意:雖然可以運行不包含完整操作系統的容器,但很少這樣做,因為可用的最小鏡像可能會引發其它問題。

如何發現和存儲鏡像

與所有其他類型的軟件打包技術一樣,容器也需要一個可以共享、發現和重用的地方。這些被稱為鏡像注冊表,類似于 Java Maven 和 Python 輪子存儲庫或 npm 注冊表。

以下是互聯網上可用的不同鏡像注冊表的例子:

Docker Hub: 最初的Docker注冊表,托管了許多在世界各地項目中廣泛使用的Docker官方鏡像,并為個人提供托管自己鏡像的機會。如adoptopenjdk就是在Docker Hub上托管鏡像的組織之一;可以點擊openjdk11查看其存儲倉庫以獲取該組織項目鏡像和標簽示例。

Red Hat Image Registry: 紅帽的官方鏡像注冊表,為那些有效紅帽訂閱者提供鏡像。

Quay: Red Hat 的公共鏡像注冊表托管了許多 Red Hat 的公共可用鏡像,并為個人提供了托管自己的鏡像的機會。

使用鏡像和容器

有兩個實用程序用于管理鏡像和容器:Docker和Podman。它們可用于 Windows、Linux 和 Mac 工作站。從開發人員的角度來看,它們在執行命令時是完全等價的。它們可以被認為是彼此的別名。您甚至可以在許多系統上安裝一個包,它會自動將 Docker 更改為 Podman 別名。本文檔中無論在哪里提到 Podman,都可以安全地替換 Docker,而不會改變結果。

您會立即注意到這些實用程序與 Git 非常相似,因為它們執行標簽、推送和拉取操作。您將經常使用或引用此功能。然而,它們不應與 Git 混淆,因為 Git 也管理版本控制,而鏡像是不可變的,它們的管理實用程序和注冊表沒有變更管理的概念。如果您將兩個具有相同名稱和標簽的鏡像推送到同一個存儲庫,則第二個鏡像將覆蓋第一個鏡像,而無法查看或理解發生了什么變化。

子命令

下面是你會經常使用或引用的Podman和Docker子命令的例子:

build: 構建鏡像

例子: podman build -t org/some-image-repo -f Dockerfile

image: 本地鏡像管理

例子: podman image rm -a 刪除所有本地鏡像

images: 列出本地存儲的鏡像

tag: 為鏡像打標簽

container: 容器管理

例子: podman container rm -a 刪除所有已停止的容器

run: 創建并啟動一個容器

還有 stop and restart

 pull/push: 從/向注冊表上的存儲庫拉/推和鏡像

Dockerfiles

Dockerfile 是定義鏡像的源文件,并使用build子命令進行處理。該文件將定義一個父鏡像或基礎鏡像,復制或安裝您希望在鏡像中運行的任何額外軟件,定義在構建或運行軟件過程中使用到的任何額外元數據,并有可能指定一個命令,該命令在鏡像實例化為容器后會立即執行。下面的實驗對 Dockerfile 的結構以及其中使用的一些更常用的命令進行了更詳細的描述。

Docker 和 Podman 的根本區別

Docker是類unix系統中的守護進程,是Windows系統中的服務。這意味著它一直在后臺運行,并且具有root或管理員權限。Podman是二進制的。這意味著它只能按需運行,并且可以作為非特權用戶運行。

這使得Podman對系統資源更安全、更高效。根據定義,以 root 權限運行任何東西都不太安全。在云端使用鏡像時,托管容器的云可以更安全地管理鏡像和容器。

Skopeo 和 Buildah

和 Docker 是一個單一的實用程序不同,Podman 在 GitHub 上有兩個由 Containers 組織維護的相關實用程序:Skopeo和Buildah。兩者都提供 Podman 和 Docker 不具備的功能,并且都是與Podman一起安裝在Red Hat系列Linux發行版上的容器工具包組的一部分。

在大多數情況下,鏡像構建可以通過 Docker 和 Podman 執行,但 Buildah 存在以防需要更復雜的鏡像構建。這些更復雜的構建的細節遠遠超出了本文的范圍,你很少會遇到需要它,但為了完整起見,我在這里提到了這個實用程序。

Skopeo 提供了 Docker 沒有的兩個實用功能:將鏡像從一個注冊表復制到另一個注冊表的能力以及從遠程注冊表中刪除鏡像的能力。同樣,此功能超出了本次討論的范圍,但該功能最終可能對您有用,尤其是在您需要編寫一些 DevOps 腳本時。

Dockerfiles 實驗

以下是一個非常短的實驗(大約 10 分鐘),它將教您如何使用 Dockerfiles 構建鏡像并將這些鏡像作為容器運行。它還將演示如何將容器配置外部化,以實現容器開發的全部優勢和“一次構建,多次部署”。

安裝

以下實驗室是在本地運行 Fedora 并在已安裝 Podman 和 Git的Red Hat 沙盒環境中創建和測試的。我相信在Red Hat沙箱環境中運行它會讓您從這個實驗中獲得最大的收獲,但是在本地運行它也是完全可以接受的。

您還可以在自己的工作站上安裝 Docker 或 Podman 并在本地工作。提醒一下,如果您安裝了 Docker,podman 和 docker對于這個實驗來說是完全可以互換的。

構建鏡像

1. 從 GitHub 克隆 Git 存儲庫:

$ git clone https://github.com/hippyod/hello-world-container-lab

2. 編輯 Dockerfile:

$ cd hello-world-container-lab
$ vim Dockerfile
1 FROM Docker.io/adoptopenjdk/openjdk11:x86_64-ubi-minimal-jre-11.0.14.1_1
2
3 USER root
4
5 ARG ARG_MESSAGE_WELCOME='Hello, World'
6 ENV MESSAGE_WELCOME=${ARG_MESSAGE_WELCOME}
7
8 ARG JAR_FILE=target/*.jar
9 COPY ${JAR_FILE} app.jar
10
11 USER 1001
12
13 ENTRYPOINT ["java", "-jar", "/app.jar"]

這個Dockerfile有以下特性:

FROM 語句(第 1 行)定義了構建這個新鏡像的基礎(或父)鏡像。

USER 語句(第 3 行和第 11 行)定義了在構建期間和執行時正在運行的用戶。起初,root 在構建過程中運行。在更復雜的 Dockerfile 中,我需要 root 才能安裝任何額外的軟件、更改文件權限等等,以完成新鏡像。在 Dockerfile 結束時,我切換到 UID 為 1001 的用戶,這樣,每當鏡像實例化為容器并執行時,用戶將不是 root,因此更安全。使用 UID 而不是用戶名,以便主機可以識別哪個用戶正在容器中運行,以防主機加強了安全措施,阻止容器用root用戶運行。

 ARG 語句(第 5 行和第 8 行)定義了只能在構建過程中使用的變量。

 ENV 語句(第 6 行)定義了一個環境變量和值,可以在構建過程中使用,但也可以在鏡像作為容器運行時使用。請注意它是如何通過引用前面 ARG 語句定義的變量來獲取其值的。

COPY 語句(第 9 行)將 Spring Boot Maven 構建創建的 JAR 文件復制到鏡像中。為了方便在未安裝 Java 或 Maven 的 Red Hat 沙箱中運行的用戶,我預先構建了 JAR 文件并將其推送到 hello-world-container-lab 存儲庫。在本實驗室中無需進行 Maven 構建。(注意:還有一個add命令可以替代 COPY。由于該add命令可能具有不可預知的行為,因此最好使用 COPY。)

最后,ENTRYPOINT 語句定義了容器啟動時應該在容器中執行的命令和參數。如果此鏡像成為后續鏡像定義的基礎鏡像并且定義了新的 ENTRYPOINT,它將覆蓋此鏡像。(注意:還有一個cmd命令可以代替 ENTRYPOINT。兩者之間的區別在此本文中無關緊要,超出了本文的范圍。)

鍵入:q并按Enter退出 Dockerfile 并返回到 shell。

3. 構建鏡像:

$ podman build --squash -t test/hello-world -f Dockerfile

你應該看到:

STEP 1: FROM docker.io/adoptopenjdk/openjdk11:x86_64-ubi-minimal-jre-11.0.14.1_1
Getting image source signatures
Copying blob d46336f50433 done
Copying blob be961ec68663 done
...
STEP 7/8: USER 1001
STEP 8/8: ENTRYPOINT ["java", "-jar", "/app.jar"]
COMMIT test/hello-world
...
Successfully tagged localhost/test/hello-world:latest
5482c3b153c44ea8502552c6bd7ca285a69070d037156b6627f53293d6b05fd7

除了構建鏡像之外,這些命令還提供了以下說明:

--squash標志將通過確保在鏡像構建完成時僅向基礎鏡像添加一層來減小鏡像大小。多余的層會使最后生成的鏡像變得更大。FROM、RUN 和 COPY/ADD 語句都會添加一層,最佳實踐是在可能的情況下連接這些語句,例如:

RUN dnf -y --refresh update && \
dnf install -y --nodocs podman skopeo buildah && \
dnf clean all

上面的 RUN 語句不僅會運行每個語句才僅創建一個層,而且如果其中任何一個失敗,也會使構建失敗。

-t 用于命名鏡像。因為我沒有顯式地定義名稱的標簽(如test/hello-world:1.0),所以默認將鏡像標記為latest。我也沒有定義注冊表(如quay.io/test/hello-world),所以默認的注冊表將是 localhost。

-f 標志用于明確聲明要構建的 Dockerfile。

當運行構建時,Podman 將跟蹤“blob”的下載。這些是您的鏡像將建立的鏡像層。它們最初是從遠程注冊表中提取的,它們將被緩存在本地以加速未來的構建。

Copying blob d46336f50433 done  
Copying blob be961ec68663 done
...
Copying blob 744c86b54390 skipped: already exists
Copying blob 1323ffbff4dd skipped: already exists

4. 當構建完成時,列出鏡像以確認它已成功構建:

$ podman images

你應該看到:

REPOSITORY                                        TAG                                                      IMAGE ID      CREATED               SIZE
localhost/test/hello-world latest 140c09fc9d1d 7 seconds ago 454 MB
docker.io/adoptopenjdk/openjdk11 x86_64-ubi-minimal-jre-11.0.14.1_1 5b0423ba7bec 22 hours ago 445 MB

運行容器

5. 運行鏡像:

$ podman run test/hello-world

你應該看到:

.   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.4)

...
GREETING: Hello, world
GREETING: Hello, world

輸出將繼續每三秒打印"Hello, world",直到退出:

crtl-c

6. 證明Java只安裝在容器中:

$ java -version

在容器內運行的 Spring Boot 應用程序需要 Java 才能運行,這也是我選擇基礎鏡像的原因。如果您在Red Hat 沙盒環境中運行這個實驗,這也證明 Java 僅安裝在容器中,而不是主機上:

-bash: java: command not found...

外部化配置

鏡像現在已構建,但是當我希望將鏡像部署到每個環境中的“Hello, world”消息都不同時會發生什么?例如,我可能想要更改它,因為環境是針對不同的開發階段或不同的語言環境。如果我更改 Dockerfile 中的值,我需要構建一個新鏡像才能看到消息,這破壞了容器最基本的好處之一——“一次構建,多次部署”。那么如何使我的鏡像真正可移植,以便可以將其部署在我需要的任何地方呢?答案在于外部化配置。

7. 使用新的外部歡迎消息運行鏡像:

$ podman run -e 'MESSAGE_WELCOME=Hello, world DIT' test/hello-world

你應該看到:

Output:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.4)
...
GREETING: Hello, world DIT
GREETING: Hello, world DIT

通過使用crtl-c停止,并調整消息后重新執行:

$ podman run -e 'MESSAGE_WELCOME=Hola Mundo' test/hello-world
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.4)
...
GREETING: Hola Mundo
GREETING: Hola Mundo

-e標志定義了在啟動時注入容器的環境變量和值。如您所見,即使該變量已內置到原始鏡像中(Dockerfile 中的語句ENV MESSAGE_WELCOME=${ARG_MESSAGE_WELCOME}),它也會被覆蓋。現在,您已經外部化了需要根據部署位置進行更改的數據(例如,在DIT環境中或針對說西班牙語的用戶),從而使鏡像具有可移植性。

8. 使用文件中定義的新消息運行鏡像:

$ echo 'Hello, world from a file' > greetings.txt
$ podman run -v "$(pwd):/mnt/data:Z" \
-e 'MESSAGE_FILE=/mnt/data/greetings.txt' test/hello-world

運行這個例子,您應該看到:

.   ____          _            __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.5.4)
...
GREETING: Hello, world from a file
GREETING: Hello, world from a file

重復,直到按ctrl -c停止

在這種情況下,-e標志定義了/mnt/data/greetings.txt 的文件路徑,該路徑通過-v 標志從主機的本地文件系統$(pwd)/greetings.txt(pwd是一個 bash 實用程序,輸出當前目錄的絕對路徑,在您的情況下應該是hello-world-container-lab)掛載到容器中。現在,您已經外部化了需要根據部署位置更改的數據,但這一次數據是在掛載到容器中的外部文件中定義的。如果環境變量數量不多,那么直接在命令行設置是可以的,但是當您要設置好幾個環境變量時,使用文件將環境變量注入容器是更有效的方式。

注意::Z上述卷定義末尾的標志適用于使用SELinux的系統。SELinux 管理許多 Linux 發行版上的安全性,并且該標志允許容器訪問目錄。如果沒有這個標志,SELinux 會阻止讀取文件,并且容器中會拋出異常。刪除:Z標記后再次嘗試運行上面的命令以查看演示。

實驗到此結束。

容器開發:外部化配置

“一次構建,多次部署”之所以有效,是因為在不同環境中運行的不可變容器不必擔心支持特定軟件項目所需的硬件或軟件的差異。這一原則使軟件開發、調試、部署和持續維護變得更快、更容易。它也不是完美的,必須在編寫代碼的方式上進行一些小的更改,才能使容器真正可移植。

為容器化編寫軟件時,最重要的設計原則是決定要外部化什么。這些決定最終使您的鏡像可移植,因此它們可以完全實現“一次構建,多次部署”的范例。盡管這看起來很復雜,但在決定配置數據是否應該注入到運行的容器中時,有一些容易記住的因素需要考慮:

數據環境是否特定的?這包括任何需要根據容器運行位置配置的數據,無論環境是生產環境、非生產環境還是開發環境。此類數據包括國際化配置、數據存儲信息以及您希望應用程序在其下運行的特定測試配置文件。

數據發布是否獨立? 這種類型的數據可以運行從功能標志到國際化文件再到日志級別的所有數據——基本上,您可能想要或需要在版本之間更改的任何數據,而無需構建和新部署。

數據是秘密嗎?憑證不應被硬編碼或存儲在鏡像中。憑證通常需要在與發布時間表不匹配的時間表上刷新,并且將機密嵌入存儲在鏡像注冊表中的鏡像中存在安全風險。

最佳實踐是選擇應該將配置數據外部化的位置(即在環境變量或文件中),并且只外部化那些滿足上述條件的部分。如果它不符合上述標準,最好將其保留為不可變鏡像的一部分。遵循這些準則將使您的鏡像真正可移植,并使您的外部配置保持合理的大小和可管理性。

總結

本文為剛接觸鏡像和容器的軟件開發人員介紹了四個關鍵概念和思路:

鏡像是不可變的二進制文件:鏡像是打包軟件以便以后重用或部署的一種方法。

容器是獨立的進程:當它們被創建時,容器是一個鏡像的運行時實例。當容器啟動時,它們成為主機上內存中的進程,這比虛擬機更輕、更快。在大多數情況下,開發人員只需要了解后者,但了解前者是有幫助的。

 “一次構建,多次部署”:這個原則使容器技術如此有用。鏡像和容器提供了部署的一致性和獨立于主機的獨立性,允許您跨許多不同的環境進行部署。由于這一原則,容器也很容易伸縮。

將配置外部化:如果您的鏡像具有特定于環境、獨立于發布或機密的配置數據,請考慮將該數據置于鏡像和容器之外。您可以通過注入環境變量或將外部文件掛載到容器中來將此數據注入正在運行的鏡像中。

譯者介紹

崔瑩峰,51CTO社區編輯,一名70后程序員,擁有10多年工作經驗,長期從事 Java 開發,架構設計,容器化等相關工作。精通Java,熟練使用Maven、Jenkins等Devops相關工具鏈,擅長容器化方案規劃、設計和落地。


原文標題:A hands-on guide to images and containers for developers,作者:Evan "Hippy" Slatis

鏈接:https://opensource.com/article/22/5/guide-containers-images


責任編輯:莫奇 來源: 51CTO技術棧
相關推薦

2022-04-20 10:56:06

JavaJVM參數

2023-03-02 17:44:30

DevOps開發

2021-09-27 09:00:00

開發微服務架構

2025-06-06 08:36:21

2022-11-02 14:43:29

2024-12-12 08:00:00

2022-05-16 13:58:52

開發區塊鏈Web3

2025-02-08 11:02:57

2009-08-27 12:00:40

ibmdwJava

2024-02-21 08:00:00

機器學習Java大語言模型

2019-07-22 08:00:00

JavaGitHub編程語言

2020-05-11 09:54:33

JavaScript開發技術

2021-10-27 10:43:24

開發技能代碼

2020-08-30 14:30:33

macOS工具開發Mac

2016-01-25 09:32:37

容器網絡SDN

2016-10-18 10:45:00

開發開源

2019-08-27 14:21:44

Python 開發程序員

2015-02-10 09:24:04

Web開發JavaScript工具

2012-05-17 10:03:25

.NET

2013-09-25 09:20:39

iOS開發iOS7iPhone5s
點贊
收藏

51CTO技術棧公眾號

日韩中文字幕有码| 中文字幕免费高| 久久永久免费视频| 99久久九九| 亚洲精品在线观看视频| 激情五月开心婷婷| av小次郎在线| 久久久五月婷婷| 亚洲va国产va天堂va久久| 日本三级小视频| 天天射天天综合网| 亚洲精品日韩久久久| 911福利视频| 亚洲欧美小说色综合小说一区| 欧美国产激情一区二区三区蜜月| 99久热re在线精品996热视频| 麻豆精品久久久久久久99蜜桃| 91超碰成人| 亚洲性av网站| 亚洲调教欧美在线| 欧美久久一区二区三区| 日本道精品一区二区三区| 一本大道东京热无码aⅴ| 福利在线午夜| 99久久精品国产一区| 91精品视频在线播放| jizz国产在线观看| 亚洲国产高清视频| 久久香蕉频线观| 一级在线观看视频| 竹菊久久久久久久| 亚洲成人国产精品| 国产精品熟女一区二区不卡| 超薄肉色丝袜脚交一区二区| 欧美日韩国产一区二区三区| 成人毛片100部免费看| av在线电影观看| 久久蜜桃一区二区| 国产欧美精品一区二区三区| 国产绿帽一区二区三区| 青青青爽久久午夜综合久久午夜| 欧美孕妇性xx| 日韩经典在线观看| 亚洲黄色免费| 久久免费视频在线观看| 欧美三级 欧美一级| 五月天综合网站| www国产精品视频| 99re6热在线精品视频| 国产精品一区二区99| 亚洲精品日韩丝袜精品| 一区二区三区少妇| 亚洲黄色录像| 国产亚洲欧美一区| 亚洲图片另类小说| 国产日韩欧美一区二区三区| 国产视频在线一区二区| 9.1成人看片免费版| 日韩一级电影| 国产视频在线观看一区二区| 在线观看福利片| 蜜桃一区二区| 在线精品国产欧美| 国产三级精品三级观看| 久久久久久影院| 久久99久久亚洲国产| 久久久久久久久艹| 99热这里只有精品8| 97人人爽人人喊人人模波多| 欧美三级一区二区三区| 久久精品日产第一区二区| 国产成+人+综合+亚洲欧洲| 精品黑人一区二区三区| 美女网站色91| 5566中文字幕一区二区| 亚洲第一精品网站| 久久综合九色综合97婷婷女人| 欧美日韩综合久久| 午夜在线视频| 亚洲综合在线观看视频| 成 年 人 黄 色 大 片大 全| 自拍偷拍欧美视频| 欧美日韩一区二区在线视频| 久久久久久综合网| 国产精品久久久久av蜜臀| 亚洲第一在线视频| 国产精品密蕾丝袜| 亚洲天堂免费| 日本精品视频在线| 国产乱淫a∨片免费视频| 国产精品538一区二区在线| 精品国产区在线| 在线国产情侣| 一区二区久久久| 又色又爽又高潮免费视频国产| 九七电影院97理论片久久tvb| 日韩精品一区二区三区三区免费 | 日韩中文影院| 欧美日韩成人综合天天影院 | 久久久久久com| 亚洲精品成人在线视频| 国产一区欧美二区| 久久综合入口| √天堂8在线网| 色视频一区二区| 日本黄色www| 久草精品在线| 久久久免费av| 国产精品色综合| 久久久久国产精品麻豆| 97超碰在线视| 日韩综合久久| 日韩高清人体午夜| 少妇久久久久久被弄高潮| 日韩激情视频在线观看| 91精品黄色| 最新97超碰在线| 欧美日韩精品在线观看| 色哟哟在线观看视频| 欧美久久综合网| 992tv成人免费视频| a级片在线播放| 日本一区二区高清| 国产免费人做人爱午夜视频| 福利在线一区| 久久久av网站| 亚洲无码精品国产| 久久久99精品久久| 国产美女在线一区| 亚洲无线观看| 久久视频这里只有精品| 中文字幕码精品视频网站| 久久色在线视频| 欧美日韩性生活片| 国内精品国产成人国产三级粉色 | 久热这里有精品| 蜜桃视频免费观看一区| 日本精品视频一区| 吉吉日韩欧美| 国产视频精品在线| 久久亚洲精品石原莉奈 | av资源在线免费观看| 巨乳诱惑日韩免费av| 久久资源av| 原纱央莉成人av片| 亚洲视频在线观看网站| 岛国av中文字幕| 久久久综合激的五月天| 国产午夜大地久久| 中国av一区| 国产极品jizzhd欧美| 黄色视屏网站在线免费观看| 日韩欧美大尺度| av在线网站观看| 久久久久一区| 婷婷五月色综合| 色综合.com| 欧美成人免费一级人片100| a天堂视频在线| 一二三四社区欧美黄| 风韵丰满熟妇啪啪区老熟熟女| 亚洲性图久久| 激情小说综合网| 在线天堂中文资源最新版| 亚洲欧美在线播放| 久久久久久av无码免费看大片| 中文字幕免费不卡| 色婷婷激情视频| 欧美日韩亚洲一区三区| 国产一区精品视频| 亚洲成a人片| 日韩视频在线观看免费| 草逼视频免费看| 狠狠色狠狠色综合日日小说| 欧美黄色激情视频| 国产一区二区视频在线播放| a天堂资源在线观看| 色狠狠久久av综合| 国产精品日本精品| 在线电影福利片| 日韩高清有码在线| 中文字幕在线播放不卡| 一区二区三区精品久久久| 免费a v网站| 日韩 欧美一区二区三区| 日本三级中文字幕在线观看| 精品综合久久88少妇激情| 国产精品成人免费电影| 福利视频在线| 亚洲男人av在线| 国产伦精品一区二区三区免.费| 亚洲韩国精品一区| 99自拍偷拍视频| 国产91精品久久久久久久网曝门| 18禁男女爽爽爽午夜网站免费 | 色综合久久久久无码专区| 精品美女视频| 国产精品日韩一区二区三区 | 精品国产一区二区三区四区精华| 在线一区视频观看| 欧美极品美女视频网站在线观看免费| 欧美女优在线| 欧美成人在线直播| 中文字幕一区2区3区| 午夜久久久久久久久久一区二区| 久久久久99精品成人| 成人禁用看黄a在线| wwwwwxxxx日本| 久久久久国产精品一区三寸| 美女黄色免费看| 欧美丰满日韩| 日本成人黄色免费看| 粉嫩的18在线观看极品精品| 成人免费午夜电影| 久久亚洲精品爱爱| 97国产精品视频人人做人人爱| 秋霞a级毛片在线看| 亚洲女成人图区| 日韩中文字幕影院| 91精品国产入口在线| 一级片在线免费播放| 性欧美大战久久久久久久久| 亚洲国产精品免费在线观看| 中文字幕成人网| 中文字幕国产专区| av激情亚洲男人天堂| 丰满少妇一区二区三区专区| 极品美妇后花庭翘臀娇吟小说| 夜久久久久久| 阿v天堂2018| 欧美久久一区| 日韩专区第三页| 欧美日韩mv| 日本a级片在线观看| 中文字幕av亚洲精品一部二部| 亚洲国产日韩美| 成人精品天堂一区二区三区| 欧美日本亚洲| 伊人久久大香线蕉综合网站| 精品国产一区二区三区四区vr| 狼人精品一区二区三区在线 | 欧美国产日韩在线播放| 亚洲欧美日韩专区| 午夜精品久久久久久久无码| 99国产精品| 黄色一级在线视频| 国产欧美大片| 播放灌醉水嫩大学生国内精品| 亚洲三级国产| av网站在线观看不卡| 亚洲女同同性videoxma| 日韩欧美视频网站| 午夜一级在线看亚洲| 凹凸日日摸日日碰夜夜爽1| 久久一区激情| 欧美午夜aaaaaa免费视频| 欧美96一区二区免费视频| 国产精品v日韩精品v在线观看| 蜜臀91精品一区二区三区| 中文字幕资源在线观看| 国产精品一区二区三区99| 国产chinesehd精品露脸| 成人免费高清在线| 天天插天天射天天干| 91免费观看视频在线| www色com| 亚洲色图欧洲色图| 国产一级在线观看视频| 欧美午夜精品在线| 中文字幕久久熟女蜜桃| 日韩午夜中文字幕| 天堂中文资源在线观看| 亚洲香蕉成视频在线观看| 日本在线免费看| 欧美精品久久一区二区| 亚洲精品成人图区| 成人xvideos免费视频| eeuss鲁片一区二区三区| 久久精品magnetxturnbtih| 成久久久网站| 精品一区二区三区无码视频| 亚洲永久网站| 在线免费看v片| jizz一区二区| 中文字幕91视频| 亚洲国产精品人人做人人爽| 久久久久久久亚洲| 日韩精品一区二区三区swag| 免费福利在线视频| 美日韩精品视频免费看| 午夜裸体女人视频网站在线观看| 国产精品一区二区女厕厕| 日本精品视频| 日本一区二区三区视频在线观看 | 日韩激情毛片| 综合操久久久| 校园春色综合网| 激情久久综合网| 国产亚洲成aⅴ人片在线观看| 国产精品99久久久久久成人| 狠狠色狠狠色综合日日小说| 99久久国产免费| 影音先锋欧美精品| 91福利在线尤物| 91九色国产视频| 国内黄色精品| 99久久国产综合精品五月天喷水| 青青草精品视频| 国产白嫩美女无套久久| 亚洲男人的天堂网| 中文字幕日本人妻久久久免费 | 香蕉精品999视频一区二区| 男女视频在线观看网站| 国产亚洲女人久久久久毛片| 国产一级二级毛片| 宅男噜噜噜66一区二区66| 欧美男男激情freegay| 欧美激情乱人伦| 成人亚洲精品| 五月天色一区| 三级成人在线视频| 老鸭窝一区二区| 午夜欧美视频在线观看 | 色999韩欧美国产综合俺来也| 日本一区二区不卡高清更新| 国产欧美丝祙| 亚洲视频在线播放免费| 亚洲乱码精品一二三四区日韩在线| 亚洲精品一区二三区| 精品在线小视频| 亚洲私拍视频| 裸体丰满少妇做受久久99精品| 一区在线视频| 国产在线不卡av| 亚洲国产综合在线| 黑人乱码一区二区三区av| 欧美放荡办公室videos4k| 国产精品亚洲欧美日韩一区在线| 一区二区成人国产精品| 奇米影视一区二区三区| 山东少妇露脸刺激对白在线| 色哟哟精品一区| 黄色国产在线| 国产精品欧美日韩| 欧美亚洲国产精品久久| 在线观看国产一级片| 国产精品进线69影院| 91亚洲国产成人久久精品麻豆| 日韩在线观看你懂的| 日韩一级特黄| 国产成人免费高清视频| 国产成人av一区二区| 国产成人精品av久久| 亚洲精品456在线播放狼人| 中文字幕色婷婷在线视频| 欧美lavv| 六月婷婷色综合| 欧美黄色一区二区三区| 欧美精品一区二区三区四区 | 韩国无码一区二区三区精品| 色婷婷综合五月| 91av资源在线| 亚洲a成v人在线观看| 国产精品多人| 给我看免费高清在线观看| 色综合视频在线观看| 99中文字幕一区| 91麻豆精品秘密入口| 极品av少妇一区二区| 亚洲男人在线天堂| 欧美午夜精品电影| 91极品在线| 精品一卡二卡三卡四卡日本乱码| 久久亚洲视频| 国产精品嫩草影院俄罗斯| 亚洲国产成人久久综合一区| 欧美天堂视频| 浴室偷拍美女洗澡456在线| 不卡av免费在线观看| 黄色av网站免费| 欧美成人亚洲成人| 岳的好大精品一区二区三区| 欧美国产日韩另类| 午夜视频在线观看一区二区三区| 成人在线观看黄色| 粉嫩av免费一区二区三区| 久久久亚洲一区| 免费看一级一片| 亚洲色图17p| 五月亚洲婷婷| 爆乳熟妇一区二区三区霸乳| 亚洲黄色免费网站| 精品99又大又爽又硬少妇毛片| 成人性教育视频在线观看| 国产视频一区欧美| 久久久精品少妇| 亚洲精选中文字幕| 中文字幕日韩在线| 国产又粗又长又大的视频| 亚洲高清久久久|