一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專(zhuān)注于服務(wù)器技術(shù)及軟件下載分享
分類(lèi)導(dǎo)航

服務(wù)器資訊|IT/互聯(lián)網(wǎng)|云計(jì)算|區(qū)塊鏈|軟件資訊|操作系統(tǒng)|手機(jī)數(shù)碼|百科知識(shí)|免費(fèi)資源|頭條新聞|

服務(wù)器之家 - 新聞資訊 - 云計(jì)算 - 24條Dockerfile及指令最佳實(shí)踐

24條Dockerfile及指令最佳實(shí)踐

2023-12-14 12:04未知服務(wù)器之家 云計(jì)算

來(lái)源:程序新視界 構(gòu)建緩存 在鏡像的構(gòu)建過(guò)程中,Docker會(huì)根據(jù)Dockerfile指定的順序執(zhí)行每個(gè)指令。Dockerfile的每條指令都會(huì)將結(jié)果提交為新的鏡像。然后,下一條指令基于上一條指令的鏡像進(jìn)行構(gòu)建。 在執(zhí)行每條指令之前,Docker都

來(lái)源:程序新視界

24條Dockerfile及指令最佳實(shí)踐

構(gòu)建緩存

在鏡像的構(gòu)建過(guò)程中,Docker會(huì)根據(jù)Dockerfile指定的順序執(zhí)行每個(gè)指令。Dockerfile的每條指令都會(huì)將結(jié)果提交為新的鏡像。然后,下一條指令基于上一條指令的鏡像進(jìn)行構(gòu)建。

在執(zhí)行每條指令之前,Docker都會(huì)在緩存中查找是否已經(jīng)存在可重用的鏡像,如果存在就使用現(xiàn)存的鏡像,不再重復(fù)創(chuàng)建。

因此,為了有效地利用緩存,盡量保持Dockerfile一致,并且盡量在末尾修改:

FROMubuntu

MAINTAINERauthor<[email protected]>

RUNecho"deb

RUNapt-getupdate

RUNapt-getupgrade-y

更改MAINTAINER指令會(huì)使Docker強(qiáng)制執(zhí)行run指令來(lái)更新apt,而不是使用緩存。

如不希望使用緩存,在執(zhí)行 docker build 時(shí)需加上參數(shù)--no-cache=true

Docker中,構(gòu)建緩存遵循的基本規(guī)則如下:

  1. 從緩存中存在的基礎(chǔ)鏡像(FROM指令指定)開(kāi)始,下一條指令將和該基礎(chǔ)鏡像的所有子鏡像進(jìn)行匹配,檢查這些子鏡像被創(chuàng)建時(shí)使用的指令是否和被檢查的指令完全一樣。如果不是,則緩存失效。
  2. 多數(shù)情況中,使用其中一個(gè)子鏡像來(lái)比較Dockerfile中的指令是足夠的。然而,特定的指令需要做更多的判斷。
  3. 對(duì)于ADDCOPY指令,鏡像中對(duì)應(yīng)文件的內(nèi)容也會(huì)被檢查,每個(gè)文件都會(huì)計(jì)算出一個(gè)校驗(yàn)值,通常是檢查文件的校驗(yàn)和(checksum)。在緩存的查找過(guò)程中,會(huì)將這些校驗(yàn)和已存在鏡像中的文件校驗(yàn)值進(jìn)行對(duì)比。如果文件有任何改變,則緩存失效。
  4. 除了ADDCOPY指令,緩存匹配檢查并不檢查臨時(shí)容器中的文件。例如,當(dāng)使用RUN apt-get -y update命令更新了容器中的文件,并不會(huì)被緩存檢查策略作為緩存匹配的依據(jù)。
  5. 一旦緩存失效,所有后續(xù)的Dockerfile指令都將產(chǎn)生新的鏡像,緩存不會(huì)被使用。

使用多階段構(gòu)建

多階段構(gòu)建可以大幅度減小最終的鏡像大小,而不需要去想辦法減少中間層和文件的數(shù)量。因?yàn)殓R像是在生成過(guò)程的最后階段生成的,所以可以利用生成緩存來(lái)最小化鏡像層。

例如,如果構(gòu)建包含多個(gè)層,則可以將它們從變化頻率較低(以確保生成緩存可重用)到變化頻率較高的順序排序:

  • 安裝構(gòu)建應(yīng)用程序所需的依賴(lài)工具
  • 安裝或更新依賴(lài)項(xiàng)
  • 構(gòu)建你的應(yīng)用

比如構(gòu)建一個(gè)Go應(yīng)用程序的Dockerfile可能類(lèi)似于這樣:

FROMgolang:1.11-alpineASbuild

#安裝項(xiàng)目需要的工具
#運(yùn)行`dockerbuild--no-cache.`來(lái)更新依賴(lài)
RUNapkadd--no-cachegit
RUNgogetgithub.com/golang/dep/cmd/dep

#通過(guò)Gopkg.toml和Gopkg.lock獲取項(xiàng)目的依賴(lài)
#僅在更新Gopkg文件時(shí)才重新構(gòu)建這些層
COPYGopkg.lockGopkg.toml/go/src/project/
WORKDIR/go/src/project/
#安裝依賴(lài)庫(kù)
RUNdepensure-vendor-only

#拷貝整個(gè)項(xiàng)目進(jìn)行構(gòu)建
#當(dāng)項(xiàng)目下面有文件變化的時(shí)候該層才會(huì)重新構(gòu)建
COPY./go/src/project/
RUNgobuild-o/bin/project

#將打包后的二進(jìn)制文件拷貝到scratch鏡像下面,將鏡像大小降到最低
FROMscratch
COPY--from=build/bin/project/bin/project
ENTRYPOINT["/bin/project"]
CMD["--help"]

使用標(biāo)簽

除非是在用Docker做實(shí)驗(yàn),否則你應(yīng)當(dāng)通過(guò) -t 選項(xiàng)來(lái) docker build 新的鏡像以便于標(biāo)記構(gòu)建的鏡像。一個(gè)簡(jiǎn)單可讀的標(biāo)簽可以幫助管理每個(gè)創(chuàng)建的鏡像。

dockerbuild-t="tuxknight/luckypython"

始終通過(guò) -t 標(biāo)記來(lái)構(gòu)建鏡像。

公開(kāi)端口

Docker的核心概念是可重復(fù)和可移植,鏡像應(yīng)該可以運(yùn)行在任何主機(jī)上并運(yùn)行盡可能多的次數(shù)。在Dockerfile中可以映射私有和公有端口,但永遠(yuǎn)不要通過(guò)Dockerfile映射公有端口。這樣運(yùn)行多個(gè)鏡像的情況下會(huì)出現(xiàn)端口沖突的問(wèn)題。

EXPOSE80:8080#80映射到host的8080,不提倡這種用法
EXPOSE80#80會(huì)被docker隨機(jī)映射一個(gè)端口

EXPOSE指令用于聲明容器將監(jiān)聽(tīng)的端口。在EXPOSE指令中,端口號(hào)的格式為<容器端口>/<協(xié)議>。其中,容器端口是指在容器內(nèi)部應(yīng)用程序監(jiān)聽(tīng)的端口,而協(xié)議是可選的,默認(rèn)為T(mén)CP。

示例中,EXPOSE 80:8080表示容器將監(jiān)聽(tīng)容器端口80,而宿主機(jī)可以使用端口8080來(lái)訪問(wèn)容器的80端口。也就是,容器的80端口映射到了宿主機(jī)的8080端口。

請(qǐng)注意,EXPOSE指令僅僅是聲明容器將監(jiān)聽(tīng)的端口,并不會(huì)自動(dòng)進(jìn)行端口映射。要實(shí)際進(jìn)行端口映射,需要在運(yùn)行容器時(shí)使用-p-P選項(xiàng)。

CMD ENTRYPOINT語(yǔ)法

CMDENTRYPOINT支持兩種語(yǔ)法:

CMD/bin/echo

CMD["/bin/echo"]

在第一種方式下,Docker會(huì)在命令前加上 /bin/sh -c,可能會(huì)導(dǎo)致一些意想不到的問(wèn)題。在第二種方式下,CMD ENTRYPOINT是一個(gè)數(shù)組,執(zhí)行的命令完全和期待的一樣。

容器是短暫的

容器模型是進(jìn)程而不是機(jī)器,不需要開(kāi)機(jī)初始化。在需要時(shí)運(yùn)行,不需要時(shí)停止,能夠刪除后重建,并且配置和啟動(dòng)的最小化。

.dockerignore 文件

docker build的時(shí)候,對(duì)于一些不需要提交構(gòu)建的文件用.dockerignore來(lái)進(jìn)行忽略。忽略部分無(wú)用的文件和目錄可以提高構(gòu)建的速度。

不要在構(gòu)建中升級(jí)版本

不在容器中更新,更新交給基礎(chǔ)鏡像來(lái)處理。

應(yīng)用解耦

每個(gè)容器只運(yùn)行一個(gè)進(jìn)程,每個(gè)容器應(yīng)用只關(guān)心一個(gè)方面的事情。將多個(gè)應(yīng)用解耦到不同容器中,容器起到了隔離應(yīng)用隔離數(shù)據(jù)的作用,可以更輕松地保證容器的橫向擴(kuò)展和復(fù)用。

例如一個(gè)Web應(yīng)用程序可能包含三個(gè)獨(dú)立的容器:Web應(yīng)用、數(shù)據(jù)庫(kù)、緩存,每個(gè)容器都是獨(dú)立的鏡像,分開(kāi)運(yùn)行。但這并不是說(shuō)一個(gè)容器就只能跑一個(gè)進(jìn)程,因?yàn)橛械某绦蚩赡軙?huì)自行產(chǎn)生其他進(jìn)程,比如Celery就可以有很多個(gè)工作進(jìn)程。

雖然每個(gè)容器跑一個(gè)進(jìn)程是一條很好的法則,但這并不是一條硬性的規(guī)定。主要是希望一個(gè)容器只關(guān)注一件事情,盡量保持干凈和模塊化。如果容器互相依賴(lài),你可以使用 Docker 容器網(wǎng)絡(luò) 來(lái)把這些容器連接起來(lái)。

最小化鏡像層數(shù)

在很早之前的版本中盡量減少鏡像層數(shù)是非常重要的,不過(guò)現(xiàn)在的版本已經(jīng)有了一定的改善了:

  • 只有RUN、COPY和ADD指令會(huì)創(chuàng)建層,其他指令會(huì)創(chuàng)建臨時(shí)的中間鏡像,但是不會(huì)直接增加構(gòu)建的鏡像大小了。
  • 多階段構(gòu)建的支持,允許我們把需要的數(shù)據(jù)直接復(fù)制到最終的鏡像中,這就允許在中間階段包含一些工具或者調(diào)試信息了,而且不會(huì)增加最終的鏡像大小。

需要掌握好Dockerfile的可讀性和文件系統(tǒng)層數(shù)之間的平衡。控制文件系統(tǒng)層數(shù)時(shí)會(huì)降低Dockerfile的可讀性。而Dockerfile可讀性高時(shí),往往會(huì)導(dǎo)致更多的文件系統(tǒng)層數(shù)。

避免安裝不必要的包

為了降低復(fù)雜性、減少依賴(lài)、減小文件大小和構(gòu)建時(shí)間,應(yīng)該避免安裝額外的或者不必要的軟件包。例如,不要在數(shù)據(jù)庫(kù)鏡像中包含一個(gè)文本編輯器。

使用特定標(biāo)簽

Dockerfile中FROM應(yīng)始終包含依賴(lài)的基礎(chǔ)鏡像的完整倉(cāng)庫(kù)名和標(biāo)簽,如使用FROM debian:jessie而不是FROM debian

多行參數(shù)排序

只要有可能,就將多行參數(shù)按字母順序排序。這可以避免重復(fù)包含同一個(gè)包,更新包列表時(shí)也更容易,也更容易閱讀和審查。建議在反斜杠符號(hào) \ 之前添加一個(gè)空格,可以增加可讀性。

RUNapt-getupdate&&apt-getinstall-y\
bzr\
cvs\
git\
mercurial\
subversion

Dockerfile指令最佳實(shí)踐

關(guān)于這些指令的使用建議可以幫助我們創(chuàng)建高效且可維護(hù)的Dockerfile。以下內(nèi)容為Dockerfile指令部分的最佳實(shí)踐。

FROM

盡可能使用當(dāng)前的官方鏡像作為基礎(chǔ)鏡像。推薦使用Debian鏡像,大小保持在100MB上下,且仍是完整的發(fā)行版。

另外,根據(jù)情況也可考慮使用Alpine映像,因?yàn)樗艿絿?yán)格控制且較小(當(dāng)前小于5MB),同時(shí)仍是完整的Linux發(fā)行版。

LABEL標(biāo)簽

可以給鏡像添加標(biāo)簽來(lái)幫助組織鏡像、記錄許可信息、輔助自動(dòng)化構(gòu)建等。每個(gè)標(biāo)簽一行,由LABEL開(kāi)頭加上一個(gè)或多個(gè)標(biāo)簽對(duì)。

下面的示例展示了各種不同的可能格式。#開(kāi)頭的行是注釋內(nèi)容。

#Setoneormoreindividuallabels
LABELcom.example.version="0.0.1-beta"
LABELvendor="ACMEIncorporated"
LABELcom.example.release-date="2015-02-12"
LABELcom.example.version.is-production=""

一個(gè)鏡像可以包含多個(gè)標(biāo)簽,當(dāng)然以上內(nèi)容也可以寫(xiě)成下面這樣,但是不是必須的:

#Setmultiplelabelsatonce,usingline-continuationcharacterstobreaklonglines
LABELvendor=ACME\Incorporated\
com.example.is-production=""\
com.example.version="0.0.1-beta"\
com.example.release-date="2015-02-12"

PS:如果字符串包含空格,那么它必須被引用或者空格必須被轉(zhuǎn)義。如果字符串包含內(nèi)部引號(hào)字符("),則也可以將其轉(zhuǎn)義。

RUN

為了保持Dockerfile文件的可讀性以及可維護(hù)性,建議將過(guò)長(zhǎng)的或復(fù)雜的RUN指令用反斜杠\分割成多行,以提高可讀性和可維護(hù)性。

RUN指令最常見(jiàn)的用法是安裝包用的apt-get。因?yàn)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">RUN apt-get指令會(huì)安裝包,所以有幾個(gè)問(wèn)題需要注意。

  • 避免運(yùn)行apt-get upgradedist-upgrade,在無(wú)特權(quán)的容器中,很多必要的包不能正常升級(jí)。如果基礎(chǔ)鏡像過(guò)時(shí)了,應(yīng)當(dāng)聯(lián)系維護(hù)者。如果你確定某個(gè)特定的包,比如foo,需要升級(jí),使用apt-get install -y foo就行,該指令會(huì)自動(dòng)升級(jí)foo包。
  • 永遠(yuǎn)將apt-get updateapt-get install一起執(zhí)行,否則apt-get install會(huì)出現(xiàn)異常。
  • 推薦apt-get update && apt-get install -y package-a package-b這種方式,先更新,之后安裝最新的軟件包。
RUNapt-getupdate&&apt-getinstall-y\
aufs-tools\
automake\
btrfs-tools\
build-essential\
curl\
dpkg-sig\
git\
iptables\
libapparmor-dev\
libcap-dev\
libsqlite3-dev\
lxc=1.0*\
mercurial\
parallel\
reprepro\
ruby1.9.1\
ruby1.9.1-dev\
s3cmd=1.1.0*

apt-get update放在一條單獨(dú)的RUN聲明中會(huì)導(dǎo)致緩存問(wèn)題以及后續(xù)的apt-get install失敗。比如,假設(shè)有一個(gè)Dockerfile文件:

FROMubuntu:14.04
RUNapt-getupdate
RUNapt-getinstall-ycurl

構(gòu)建鏡像后,所有的層都在Docker的緩存中。假設(shè)后來(lái)又修改了其中的apt-get install添加了一個(gè)包:

FROMubuntu:14.04
RUNapt-getupdate
RUNapt-getinstall-ycurlnginx

Docker發(fā)現(xiàn)修改后的RUN apt-get update指令和之前的完全一樣。所以,apt-get update不會(huì)執(zhí)行,而是使用之前的緩存鏡像。因?yàn)?code style="font-size: 14px;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(239, 112, 96);">apt-get update沒(méi)有運(yùn)行,后面的apt-get install可能安裝的是過(guò)時(shí)的curl和nginx版本。

使用RUN apt-get update && apt-get install -y可以確保Dockerfiles每次安裝的都是包的最新的版本,而且這個(gè)過(guò)程不需要進(jìn)一步的編碼或額外干預(yù)。這項(xiàng)技術(shù)叫做cache busting(緩存破壞)。

EXPOSE 指令

EXPOSE指令用于指定容器將要監(jiān)聽(tīng)的端口。因此,要為應(yīng)用程序使用常見(jiàn)的端口。

例如,提供Apache web服務(wù)的鏡像應(yīng)該使用EXPOSE 80,而提供MongoDB服務(wù)的鏡像使用EXPOSE 27017

對(duì)于外部訪問(wèn),用戶(hù)可以在執(zhí)行docker run時(shí)使用一個(gè)-p參數(shù)來(lái)指示如何將指定的端口映射到所選擇的端口。

ENV 指令

為了方便新程序運(yùn)行,可以使用ENV指令來(lái)為容器中安裝的程序更新PATH環(huán)境變量。例如使用ENV PATH /usr/local/nginx/bin:$PATH來(lái)確保CMD ["nginx"]能正確運(yùn)行。

ENV指令也可用于為容器化的服務(wù)提供必要的環(huán)境變量,比如Postgres需要的PGDATA。最后,ENV也能用于設(shè)置常見(jiàn)的版本號(hào),比如下面的示例:

ENVPG_MAJOR9.3
ENVPG_VERSION9.3.4
RUNcurl-SLhttp://example.com/postgres-$PG_VERSION.tar.xz|tar-xJC/usr/src/postgress&&…
ENVPATH/usr/local/postgres-$PG_MAJOR/bin:$PATH

類(lèi)似于程序中的常量,這種方法可以只需改變ENV指令來(lái)自動(dòng)的改變?nèi)萜髦械能浖姹尽?/p>

CMD

CMD指令是容器啟動(dòng)以后,默認(rèn)的執(zhí)行命令,需要重點(diǎn)理解下這個(gè)默認(rèn)的含義,意思就是如果我們執(zhí)行docker run沒(méi)有指定任何的執(zhí)行命令或者Dockerfile里面也沒(méi)有指定ENTRYPOINT,那么就會(huì)使用CMD指定的執(zhí)行命令執(zhí)行了。這也說(shuō)明了ENTRYPOINT才是容器啟動(dòng)以后真正要執(zhí)行的命令。

所以經(jīng)常遇到CMD會(huì)被覆蓋的情況。為什么會(huì)被覆蓋呢?主要還是因?yàn)镃MD的定位就是默認(rèn),如果不額外指定,那么才會(huì)執(zhí)行CMD命令,但是如果我們指定了的話那就不會(huì)執(zhí)行CMD命令了,也就是說(shuō)CMD會(huì)被覆蓋。

CMD總共有三種用法:

CMD["executable","param1","param2"]#exec形式
CMD["param1","param2"]#作為ENTRYPOINT的默認(rèn)參數(shù)
CMDcommandparam1param2#shell形式

CMD推薦使用CMD ["executable","param1","param2"]這樣的格式。如果鏡像是用來(lái)運(yùn)行服務(wù),需要使用CMD["apache2","-DFOREGROUND"],這種格式的指令適用于任何服務(wù)性質(zhì)的鏡像。

ENTRYPOINT 指令

根據(jù)官方定義來(lái)說(shuō)ENTRYPOINT才是用于定義容器啟動(dòng)以后的執(zhí)行程序的,允許將鏡像當(dāng)成命令本身來(lái)運(yùn)行(用CMD提供默認(rèn)選項(xiàng)),從名字也可以理解,是容器的入口。

ENTRYPOINT 一共有兩種用法:

ENTRYPOINT["executable","param1","param2"](exec形式)
ENTRYPOINTcommandparam1param2(shell形式)

對(duì)應(yīng)命令行exec模式,也就是帶中括號(hào)的,和CMD的中括號(hào)形式是一致的。但是這里貌似是在shell的環(huán)境下執(zhí)行的,與cmd有區(qū)別。

如果run命令后面有執(zhí)行命令,那么后面的全部都會(huì)作為ENTRYPOINT的參數(shù)。如果run后面沒(méi)有額外的命令,但是定義了CMD,那么CMD的全部?jī)?nèi)容就會(huì)作為ENTRYPOINT的參數(shù),這同時(shí)是上面我們提到的CMD的第二種用法。

所以說(shuō)ENTRYPOINT不會(huì)被覆蓋。當(dāng)然如果要在run里面覆蓋,也是有辦法的,使用--entrypoint參數(shù)即可。

一般會(huì)用ENTRYPOINT的中括號(hào)形式作為Docker容器啟動(dòng)以后的默認(rèn)執(zhí)行命令,里面放的是不變的部分,可變部分比如命令參數(shù)可以使用CMD的形式提供默認(rèn)版本,也就是run里面沒(méi)有任何參數(shù)時(shí)使用的默認(rèn)參數(shù)。如果我們想用默認(rèn)參數(shù),就直接run,否則想用其他參數(shù),就run里面加上參數(shù)。

ADD COPY

雖然ADD與COPY功能類(lèi)似,但推薦使用COPY。因?yàn)樗?ADD 更透明。COPY只支持基本的文件拷貝功能,更加的可控。而ADD具有更多特定,比如tar文件自動(dòng)提取,支持URL。通常需要提取tarball中的文件到容器的時(shí)候才會(huì)用到ADD。

如果在Dockerfile中使用多個(gè)文件,每個(gè)文件應(yīng)使用單獨(dú)的COPY指令。這樣,只有出現(xiàn)文件變化的指令才會(huì)不使用緩存。

為了控制鏡像的大小,不建議使用ADD指令獲取URL文件。正確的做法是在RUN指令中使用wget或curl來(lái)獲取文件,并且在文件不需要的時(shí)候刪除文件。

RUNmkdir-p/usr/src/things\
&&curl-SL\
|tar-xJC/usr/src/things\
&&make-C/usr/src/thingsall

VOLUME

VOLUME指令用于聲明容器中的目錄將被持久化保存,即在容器中創(chuàng)建的目錄將被掛載到宿主機(jī)或其他容器中,以便數(shù)據(jù)可以在容器之間共享。

VOLUME指令應(yīng)當(dāng)暴露出數(shù)據(jù)庫(kù)的存儲(chǔ)位置,配置文件的存儲(chǔ)以及容器中創(chuàng)建的文件或目錄。由于容器結(jié)束后并不保存任何更改,應(yīng)該把所有數(shù)據(jù)通過(guò)VOLUME保存到host中。

強(qiáng)烈建議使用VOLUME來(lái)管理鏡像中的可變部分和用戶(hù)可以改變的部分。

USER

如果服務(wù)不需要特權(quán)來(lái)運(yùn)行,使用USER指令切換到非root用戶(hù)。使用RUN groupadd -r mysql && useradd -r -g mysql mysql之后用USER mysql切換用戶(hù)。

要避免使用sudo來(lái)提升權(quán)限,因?yàn)樗豢深A(yù)期的TTY和信號(hào)轉(zhuǎn)發(fā)行為可能造成的問(wèn)題比它能解決的問(wèn)題還多。如果你真的需要和sudo類(lèi)似的功能(例如,以root權(quán)限初始化某個(gè)守護(hù)進(jìn)程,以非root權(quán)限執(zhí)行它),你可以使用gosu。我們可以去查看官方的一些鏡像,很多都是使用的gosu。

最后,不要反復(fù)地切換用戶(hù),減少不必要的layers。

WORKDIR

為了清晰性和可靠性,WORKDIR的路徑應(yīng)該始終使用絕對(duì)路徑。同時(shí),使用WORKDIR來(lái)替代RUN cd ... && do-something這樣難以維護(hù)的指令。后者難以閱讀、排錯(cuò)和維護(hù)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产裸露片段精华合集链接 | 国产亚洲欧美成人久久片 | 日本精品久久久久中文字幕 1 | 无套日出白浆在线播放 | 海派甜心完整版在线观看 | 国产精品色片 | 欧美香蕉视频 | 日韩欧美精品一区二区 | 国产在线精品香蕉综合网一区 | 免费理伦片在线观看全网站 | 青草福利视频 | 免费观看一级欧美在线视频 | 97视频久久久 | 精品久久香蕉国产线看观看麻豆 | 久久伊人免费 | 2012年免费中文视频 | 国产小视频在线 | 精品国产免费久久久久久婷婷 | 久久99国产亚洲高清观着 | 女人叉开腿让男人桶 | 男人含玉势出嫁束器 | 国产 日韩欧美 | 五花大绑esebdsm国产 | 亚洲风情无码免费视频 | 亚欧毛片基地国产毛片基地 | 天天翘| 国产欧美日韩视频在线观看一区二区 | 国产色司机在线视频免费观看 | 亚洲四虎永久在线播放 | 白丝美女用胸伺候主人 | 日本一区视频在线 | 亚洲成人免费 | 男人午夜禁片在线观看 | 桃色公寓| 福利国产精品 | 亚洲乱码一区二区三区国产精品 | 色综合天天娱乐综合网 | 3p文两男一女办公室高h | 男人好大好硬好爽免费视频 | 亚洲日本中文字幕在线2022 | 五月天淫 |