容器技術與應用(第2版)(微課版) 課件 任務2.3 創建定制的Dker鏡像_第1頁
容器技術與應用(第2版)(微課版) 課件 任務2.3 創建定制的Dker鏡像_第2頁
容器技術與應用(第2版)(微課版) 課件 任務2.3 創建定制的Dker鏡像_第3頁
容器技術與應用(第2版)(微課版) 課件 任務2.3 創建定制的Dker鏡像_第4頁
容器技術與應用(第2版)(微課版) 課件 任務2.3 創建定制的Dker鏡像_第5頁
已閱讀5頁,還剩46頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Docker容器技術與應用湖北

輕工職業技術學院Docker鏡像管理和定制項目2項目背景在正常情況下,docker有一個默認連接的國外官方鏡像,在國外的用戶訪問該官方鏡像自然不成問題,但是國內,由于國情不同,中國的網絡訪問國外官方鏡像網速一向很慢,而且往往還會遭遇斷網的窘境,所以對于國內的用戶,要想正常使用docker的鏡像,就不得不配置相應的國內鏡像。Docker鏡像管理和定制項目2鏡像是Docker的核心技術之一,是創建Docker容器的基礎模板。本項目通過3個任務介紹鏡像的基本概念和圍繞鏡像這一核心概念的具體操作,包括如何使用pull命令獲取鏡像、如何查看本地已有的鏡像信息和管理鏡像、如何創建用戶定制的鏡像,以及如何創建私有倉庫。項目二:Docker鏡像管理和定制目錄任務2.1、查看和管理Docker鏡像任務2.2、創建和使用私有倉庫任務2.3、創建定制的Docker鏡像查看和管理Docker鏡像回顧1、了解鏡像的基本概念。2、掌握鏡像的常用操作命令。3、了解倉庫的基本概念。4、掌握私有倉庫的構建及使用方法。知識目標掌握dockercommit命令構建鏡像的方法。掌握利用Dockerfile文件構建鏡像的方法。能力目標掌握dockercommit命令定制鏡像的方法。掌握dockerbuild命令定制鏡像的方法。素質目標培養科技強國意識。樹立工匠精神。小王編寫完Docker鏡像基礎操作手冊后,發現鏡像基礎操作手冊中所用的鏡像均為DockerHub提供的鏡像,但這些通用鏡像在實際部署中可能與具體項目需求存在不匹配的情況。因此,小王決定在操作手冊中添加關于Docker鏡像定制的功能,并通過實例進行說明。任務2.3創建定制的Docker鏡像任務要求2.3通過commit命令創建鏡像構建Docker鏡像有以下兩種方法。(1)使用dockercommit命令手動構建。(2)使用dockerbuild命令和Dockerfile文件進行構建原則上不能無中生有地創建一個鏡像,需要一個基礎鏡像。嚴格來說,用戶并不是真正創建一個新的鏡像,無論是啟動一個容器還是創建一個鏡像,一般都是在基礎鏡像基礎之上的,比如基礎redhat鏡像、ubuntun鏡像等。任務2.3創建定制的Docker鏡像相關知識2.3通過commit命令創建鏡像dockercommit命令和dockerbuild命令的區別:dockercommit是將容器提交為一個鏡像,只提交容器鏡像發生變更的部分,即修改后的容器鏡像與當前倉庫對應鏡像之間的差異部分,這使得更新非常輕量級。而dockerbuild是在一個基礎鏡像上重新構建一個新的鏡像。任務2.3創建定制的Docker鏡像相關知識2.3通過commit命令創建鏡像DockerDaemon接收到對應的HTTP請求后,需要執行的步驟如下。(1)根據用戶輸入的pause參數的設置,來判定是否暫停該Docker容器的運行。(選項-p:在提交時,將容器暫停)(2)將容器的可讀寫層導出打包,該讀寫層代表了當前運行容器的文件系統與當初啟動容器的鏡像之間的差異。(3)在存儲層中注冊可讀寫層差異包。(4)更新鏡像歷史信息和rootfs,并據此在鏡像存儲中創建一個新鏡像,記錄其元數據。(5)如果指定了repository信息,則給上述鏡像添加標簽信息任務2.3創建定制的Docker鏡像相關知識2.3舉例:以ubuntu安裝vim為例,說明dockercommit創建定制docker鏡像的過程。任務2.3創建定制的Docker鏡像相關知識2.3舉例:以ubuntu更新apt-get為例,說明dockercommit更新docker鏡像的過程。更新鏡像之前,我們需要使用鏡像來創建一個容器。任務2.3創建定制的Docker鏡像相關知識2.3在運行的容器內使用

apt-getupdate

命令進行更新。在完成操作之后,輸入

exit命令來退出這個容器。此時ID為e218edb10161的容器,是按我們的需求更改的容器。我們可以通過命令dockercommit來提交容器副本。dockercommit命令的格式dockercommit[選項]<容器ID或容器名>[<倉庫名>[:<標簽>]]dockercommit命令的常用選項如下。(1)-a:提交鏡像的作者。(2)-c:使用Dockerfile指令來創建鏡像。(3)-m:提交時的說明文字。(4)-p:在提交時,將容器暫停。任務2.3創建定制的Docker鏡像相關知識2.3任務2.3創建定制的Docker鏡像相關知識2.3各個參數說明:-m:

提交的描述信息-a:

指定鏡像作者e218edb10161:容器IDrunoob/ubuntu:v2:

指定要創建的目標鏡像名我們可以使用

dockerimages

命令來查看我們的新鏡像

runoob/ubuntu:v2舉例:利用dockercommit創建定制docker鏡像。dockercommit的缺點雖然dockercommit命令可以比較直觀的構建鏡像,但在實際環境中并不建議使用dockercommit命令構建鏡像,因為存在以下缺點:

1、在構建鏡像中,由于需要安裝相關的軟件,可能會造成大量不必要的軟件也被安裝,如果清理軟件不小心,也會導致鏡像比較大。

2、利用dockercommit在構建鏡像的過程中,由于dockercommit對鏡像的操作屬于黑箱操作,主要指除了制定鏡像的用戶知道執行過什么命令,怎么生成鏡像的,而其他用戶無從得知,將會給后期對鏡像維護工作帶來很大的困難。任務2.3創建定制的Docker鏡像相關知識2.3利用Dockerfile構建鏡像

我們使用命令

dockerbuild

,從零開始來創建一個新的鏡像。為此,我們需要創建一個

Dockerfile

文件,其中包含一組指令來告訴Docker如何構建我們的鏡像。Dockerfile文件是一個文本文件,也是一個Docker可以解讀的腳本文件,在這個腳本文件中記錄著用戶“創建”鏡像過程中需要執行的所有命令。當docker讀取并執行Dockerfile文件中所定義的指令時,這些指令將產生一些臨時文件層,并會用一個名稱來標記這些臨時文件層。有些Dockerfile中的指令并不會創建新的鏡像層。比如ENV、EXPOSE、CMD以及ENTRY-POINT。不過,這些命令會在鏡像中添加元數據。

任務2.3創建定制的Docker鏡像相關知識2.3利用Dockerfile構建鏡像Dockerfile從FROM命令開始,緊接著是各種方法、命令和參數。其產出為一個新的可以用于創建容器的鏡像。Dockerfile整體就兩類語句組成:#Comment注釋信息Instructionarguments指令參數,一行一個指令。任務2.3創建定制的Docker鏡像相關知識2.3說明:Dockerfile文件名首字母必須大寫。Dockerfile指令不區分大小寫,但是為方便和參數做區分,通常指令使用大寫字母。Dockerfile中指令按順序從上至下依次執行。Dockerfile中第一個非注釋行必須是FROM指令,用來指定制作當前鏡像依據的是哪個基礎鏡像。Dockerfile中需要調用的文件必須跟Dockerfile文件在同一目錄下,或者在其子目錄下,父目錄或者其它路徑無效。編寫Dockerfile文件要求盡可能精簡。其目的是為了盡可能產生數目較少的中間層鏡像。任務2.3創建定制的Docker鏡像相關知識2.3任務2.3創建定制的Docker鏡像Dockerfile操作指令2.3指令含義FROM鏡像指定新鏡像所基于的鏡像,第一條指令必須為FROM指令,每創建一個鏡像就需要一條FROM指令。MAINTAINER名字說明新鏡像的維護人信息RUN命令在所基于的鏡像上執行命令,并提交到新的鏡像中CMD[“要運行的程序“,”參數1,“參數2“]指令啟動容器時要運行的命令或者腳本,Dockerfile只能有一條CMD命令,如果指定多條則只能最后一條被執行EXPOSE端口號指定新鏡像加載到Docker時要開啟的端口ENV環境變量變量值設置一個環境變量的值,會被后面的RUN使用ADD源文件/目錄目標文件/目錄將源文件復制到目標文件,源文件要與Dockerfile位于相同目錄中,或者是一個URLCOPY源文件/目錄目標文件/目錄將本地主機上的文件/目錄復制到目標地點,源文件/目錄要與Dockerfile在相同的目錄中VOLUME[“目錄“]在容器中創建一個掛載點USER用戶名/UID指定運行容器時的用戶WORKDIR路徑為后續的RUN、CMD、ENTRYPOINT指定工作目錄ONBUILD命令指定所生成的鏡像作為一個基礎鏡像時所要運行的命令HEALTHCHECK健康檢查任務2.3創建定制的Docker鏡像Dockerfile操作指令2.3Docker官方提供的一個最小的鏡像為hello-world鏡像,它的Dockerfile內容只有3行,如下所示。FROMscratchCOPYhello/CMD["/hello"]其中,FROM命令定義所有的基礎鏡像,即該鏡像從哪個鏡像開始構建,scratch表示空白鏡像,該鏡像不依賴其他鏡像,從“零”開始構建,第2行表示將文件hello復制到鏡像的根目錄。第3行則意味著通過鏡像啟動容器時執行/hello這個可執行文件。對Dockerfile文件執行,使用build命令即可構建鏡像。相關知識任務2.3創建定制的Docker鏡像相關知識2.3Dockerfile操作指令語法格式:dockerbuild[選項]

常用選項:-t:指定鏡像的名字-f:顯示指定構建鏡像的Dockerfile文件(Dockerfile可不在當前路徑下);如果不使用-f,則默認將上下文路徑下的名為Dockerfile的文件認為是構建鏡像的“Dockerfile”;上下文路徑|URL:指定構建鏡像的上下文的路徑,構建鏡像的過程中,可以且只可以引用上下文中的任何文件。構建上下文是由文件路徑或一個URL(Git倉庫位置)定義的一組文件。舉例:[root@host1imglayers]#dockerbuild-tsecond:v1.0.注意最后有個點,默認使用“上下文目錄(Context)下的名為Dockerfile的文件作為Dockerfile”,在此,即用當前路徑的Dockerfile進行構建。-tsecond:v1.0給新構建的鏡像取名為second,并設定版本為v1.0。Dockerfile的常用指令1.FROM指令FROM是Dockerfile內置命令中唯一一個必填項,共有以下3種用法。FROM<image>FROM<image>:<tag>FROM<image>:<digest>任務2.3創建定制的Docker鏡像相關知識2.3Dockerfile的常用指令1.FROM指令FROM指令的作用是指定基礎鏡像,并且必須是dockerfile中的第一條非注釋指令。FROM指定的基礎鏡像可以是本地已存在的鏡像,也可以是遠程倉庫中的鏡像。也就是當Dockerfile指令執行時,如果本地沒有其指定的基礎鏡像,則會從遠程倉庫中下載此鏡像。當需要在一個Dockerfile中構建多個鏡像時,允許多次出現FROM。當Dockerfile執行完畢之后,會同時生成多個鏡像,但只會輸出最后一個鏡像的ID值,中間的鏡像會被標記位<none>:<none>。任務2.3創建定制的Docker鏡像相關知識2.3Dockerfile的常用指令2.MAINTAINER指令MAINTAINER指令可以放置在Dockerfile命令的任意位置。該指令用于聲明鏡像作者,建議放在FROM指令之后。MAINTAINER指令的格式如下。MAINTAINER<name>任務2.3創建定制的Docker鏡像相關知識2.3Dockerfile的常用指令3.RUN指令RUN指令是Dockerfile執行命令的核心部分,是用于在鏡像中執行命令的指令,它接收命令作為參數并用于創建鏡像。RUN指令有以下兩種格式。格式1:RUN<command>格式2:RUN["executable","param1","param2"]任務2.3創建定制的Docker鏡像相關知識2.3Dockerfile的常用指令3.RUN指令例如:#RUN[“/bin/sh”,“-c”,“echohello”]等價于RUN/bin/sh–c“echohello”當使用RUN<command>的用法時,表示在SHELL終端中運行命令。例如RUN/bin/sh–c“echohello“,但該指令用法有一個限制,即鏡像中必須有/bin/sh。如果基礎鏡像沒有/bin/sh,則需要使用RUN[”executable”,“param1”,“param2”],表示用exec執行/bin/sh“當成C語言的main函數一樣,寫shell必須有,以使shell程序更嚴密。即:#!/bin/sh

是指此腳本使用/bin/sh來解釋執行。任務2.3創建定制的Docker鏡像相關知識2.3Dockerfile的常用指令3.RUN指令注意:Dockerfile的每一個指令都會構建文件層,例如在docker所使用的aufs中,所有的鏡像層至多保存126層,而執行一次RUN命令就會產生一個新文件,并在其上執行命令,執行完畢后,提交這一層的修改,構建新的鏡像,所以過多無意義的層,會造成鏡像膨脹過大。所以對于編譯軟件的安裝更新的操作,無需分成幾層來操作,這樣會使得鏡像非常臃腫,不僅增加了構建部署的時間,還容易出錯。例如:任務2.3創建定制的Docker鏡像相關知識2.3以上執行會創建3層鏡像。Dockerfile的常用指令3.RUN指令這樣只需要使用一條RUN指令,只會新建一層,因此對于一些需要合并為一層的操作,可以使用&&

符號將多個命令分隔開,再連接起來,使其先后執行。如果run指令太長,則可以使用\符號進行換行操作。此外,還可以使用#符號進行行首的注釋。例如:任務2.3創建定制的Docker鏡像相關知識2.3以上執行會創建3層鏡像。可簡化為以下格式:如上,以

&&

符號連接命令,這樣執行后,只會創建1層鏡像。Dockerfile的常用指令4.CMD指令CMD指令與RUN指令基本相似,其指令格式如下。格式1:CMD["executable","param1","param2"]

例如:#RUN["/bin/sh",“-c","echohello"]格式2:CMD["param1","param2"]

該寫法是為ENTRYPOINT指令指定的程序提供默認參數

格式3:CMDcommandparam1param2

該寫法是以“/bin/sh-c”的方法執行推薦使用第一種格式,執行過程比較明確。第三種格式實際上在運行的過程中也會自動轉換成第一種格式運行,并且默認可執行文件是sh任務2.3創建定制的Docker鏡像相關知識2.34.CMD指令類似于RUN指令,用于運行程序,但二者運行的時間點不同:CMD在dockerrun時運行。RUN是在dockerbuild。作用:為啟動的容器指定默認要運行的程序,程序運行結束,容器也就結束。CMD指令指定的程序可被dockerrun命令行參數中指定要運行的程序所覆蓋。注意:1、在一個Dockerfile文件中可以同時出現多次CMD指令,但只有最后一條CMD指令生效。2、CMD中只能使用雙引號,不能使用單引號。舉例:CMD[“httpd”,“-D”]任務2.3創建定制的Docker鏡像相關知識2.35.ENTRYPOINT指令類似于CMD指令,但其不會被dockerrun的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給ENTRYPOINT指令指定的程序。但是,如果運行dockerrun時使用了--entrypoint選項,將覆蓋ENTRYPOINT指令指定的程序。優點:在執行dockerrun的時候可以指定ENTRYPOINT運行所需的參數。注意:如果Dockerfile中如果存在多個ENTRYPOINT指令,僅最后一個生效。格式:格式1:ENTRYPOINT<command>格式2:ENTRYPOINT["<executeable>","<param1>","<param2>",...]任務2.3創建定制的Docker鏡像相關知識2.3CMD和ENTRYPOINT指令的區別CMD給出的是一個容器的默認的可執行體。也就是容器啟動以后,默認的執行的命令。重點就是這個“默認”。意味著,如果dockerrun沒有指定任何的執行命令或者dockerfile里面也沒有entrypoint,那么,就會使用cmd指定的默認的執行命令執行。同時也從側面說明了entrypoint的含義,它才是真正的容器啟動以后要執行命令。任務2.3創建定制的Docker鏡像相關知識2.35.ENTRYPOINT指令可以搭配CMD命令使用:一般是變參才會使用CMD,這里的CMD等于是在給ENTRYPOINT傳參。示例:假設已通過Dockerfile構建了nginx:test鏡像。任務2.3創建定制的Docker鏡像相關知識2.31、不傳參運行容器內會默認運行以下命令,啟動主進程。2、傳參運行容器內會默認運行以下命令,啟動主進程(/etc/nginx/new.conf:假設容器內已有此文件)6.ENV指令設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。其指令格式如下:格式1:ENV<key><value>格式2:ENV<key1>=<value1><key2>=<value2>...以下示例設置NODE_VERSION=7.2.0,在后續的指令中可以通$NODE_VERSION引用:任務2.3創建定制的Docker鏡像相關知識2.37.ARG指令構建參數,與ENV作用一致。不過作用域不一樣。ARG設置的環境變量僅對Dockerfile內有效,也就是說只有dockerbuild的過程中有效,構建好的鏡像內不存在此環境變量。構建命令dockerbuild中可以用--build-arg<參數名>=<值>來覆蓋。其指令格式:ARG<參數名>[=<默認值>]舉例:--build-arguser_name=username_value如果利用dockerbuild命令傳遞的參數在Dockerfile中沒有對應的參數,則會拋出警告,但從1.13版本開始,不再保存退出,只是警告,可以繼續構建鏡像。

不過在構建鏡像的過程中,不建議以參數的形式傳遞機密信息,比如密碼信息。任務2.3創建定制的Docker鏡像相關知識2.38.ADD指令ADD指令的功能是將主機目錄中的文件、目錄及一個URL標記的文件復制到鏡像中。其指令格式如下。格式1:ADD<src>...<dest>格式2:ADD["<src>",..."<dest>"]說明:兩個格式基本相同,區別是,格式2可以用于處理文件路徑有空格的情況。當src標記的是本地路徑或目錄時,其相對路徑應該是相對于dockerfile所在目錄的路徑。在src標記的路徑中,允許使用通配符。dest指向容器中的目錄,不允許使用通配符。其指定的路徑必須是絕對路徑,或者相對于WORKDIR的相對路徑。如果dest指定的目錄不存在,則當ADD執行命令時,將會在容器中自動創建此目錄。

任務2.3創建定制的Docker鏡像相關知識2.38.ADD指令其指令格式如下。格式1:ADD<src>...<dest>格式2:ADD["<src>",..."<dest>"]舉例:ADD*.conf/myconf//用*代表多個任意字符ADD?.txt/myconf //用?代表1個任意字符

任務2.3創建定制的Docker鏡像相關知識2.38.ADD指令注意(src源路徑,dest目標路徑)1、如果src是一個文件,且dest是以/結尾的,則docker會把目標路徑當做一個目錄,并把源文件復制該目錄中。如果dest不存在,則會自動創建dest。2、如果src是一個文件,且dest不是以/結尾的,則docker會把目標路徑當做一個文件。如果dest不存在,則會以dest為名創建一個文件,內容同源文件;如果dest存在,則會用源文件覆蓋它,但只是內容覆蓋,文件名還是目標文件名;如果dest實際是一個存在的目錄,則會源文件復制到該目錄中。3、如果src是一個目錄,且dest不存在,則docker會自動以目標路徑創建一個目錄,并把源文件復制該目錄中。如果dest是一個存在的目錄,則會把源文件復制該目錄中。4、如果src是一個歸檔文件(壓縮文件),則Docker會自動解壓此文件。

任務2.3創建定制的Docker鏡像相關知識2.39.COPY指令COPY指令和ADD指令的功能及使用方法基本相同,只是COPY指令不會做自動解壓工作,其指令格式如下。格式1:COPY<src>...<dest>格式2:COPY["<src>",..."<dest>"]同ADD指令一樣,COPY指令格式2也用于處理路徑中存在空格的情況。COPY指令的dest必須是絕對路徑或是相對于WORKDIR的相對路徑。任務2.3創建定制的Docker鏡像相關知識2.39.COPY指令COPY指令與ADD指令不同之處如下:1、在實際應用中,如果只是復制文件,則建議使用COPY指令;而如果需要自動解壓文件,則建議使用ADD指令。2、ADD的優點:在執行<源文件>為tar壓縮文件的話,壓縮格式為gzip,bzip2以及xz的情況下,會自動復制并解壓到<目標路徑>。3、ADD的缺點:在不解壓的前提下,無法復制tar壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。任務2.3創建定制的Docker鏡像相關知識2.310.VOLUME指令

VOLUME指令可實現掛載功能,可以將本地文件夾或者其他容器的文件夾掛載到某個容器中,用于定義匿名數據卷。在啟動容器時忘記掛載數據卷,會自動掛載到匿名卷。作用:避免重要的數據,因容器重啟而丟失,這是非常致命的。避免容器不斷變大。其指令格式如下:格式1:VOLUME<路徑>格式2:VOLUME["<路徑1>","<路徑2>",…]在啟動容器dockerrun的時候,我們可以通過-v參數修改掛載點。舉例:volume[“/abv”]任務2.3創建定制的Docker鏡像相關知識2.310.VOLUME指令注意:1、在啟動容器dockerrun的時候,我們可以通過-v參數修改掛載點。2、如果Dokerfile中已經聲明了某個掛載點,那么以后對此掛載點文件的操作將不會生效,因此,建議在Dokcerfile文件的結尾聲明掛載點。任務2.3創建定制的Docker鏡像相關知識2.311.EXPOSE指令EXPOSE指令用于聲明運行時的容器服務端口,僅僅只是聲明端口。作用:幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射。在運行時使用隨機端口映射時,也就是dockerrun-P時,會自動隨機映射EXPOSE的端口。其指令格式如下:EXPOSE<端口1>[<端口2>...]注意:EXPOSE指令只是聲明了容器應該打開的端口,實際上并沒有打開該端口,在容器啟動時,如果不要-p或-P指定映射的端口,則容器不會將端口映射出去,外部網絡也就無法訪問這些端口,只能被主機中其他容器訪問。舉例:EXPOSE80任務2.3創建定制的Docker鏡像相關知識2.312.WORKDIR指令WORKDIR指令用于設置容器的工作目錄.其指令格式如下:WORKDIR<工作目錄>WORKDIR指令指定的工作目錄不存在時,會自動創建該目錄。WORKDIR指令可以為RUN、CMD、ENTRYPOINT、COPY和ADD指令配置工作目錄。dockerbuild構建鏡像過程中的,每一個RUN命令都是新建的一層。只有通過WORKDIR創建的目錄才會一直存在。任務2.3創建定制的Docker鏡像相關知識2.312.WORKDIR指令

注意: Dockerfile文件中允許出現多個WORDIR,但最終生效的路徑

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論