Docker 之 基於容器的鏡像製做

1  概述
html

鏡像包含啓動容器所需的文件系統和內容,能夠理解爲打包的文件,用於建立並啓動docker容器。前端

鏡像的生成途徑有三個:linux

1.基於dockerfile實現,鏡像製做的程序文件nginx

2.基於容器實現,啓動容器後,將新的操做製做爲新鏡像git

3.docker hub automated buildsgithub

鏡像文件採用分層構建機制,最底層爲bootfs,上面爲rootfsrootfs上還能夠有多層。位於最下層的鏡像文件爲父鏡像(parent image,最底層爲基礎鏡像(base imagerootfs爲這一層,這一層必須存在).最上層爲「可讀寫」層,其下的均爲「只讀」層web

以下截圖docker

其中:shell

bootfs:用於系統引導的文件系統,包含bootloaderkernel,容器啓動完成後會被卸載以節約內存資源,能夠理解爲容器引擎,不是宿主機操做系統ubuntu

rootfs:位於bootfs之上,表現爲docker容器的根文件系統;

傳統模式中,系統啓動時,內核掛載rootfs時會首先將其掛載爲只讀模式,完整性自檢完成後將其從新掛載爲讀寫模式

docker中,rootfs由內核掛載爲只讀模式,然後經過「聯合掛載」技術額外掛載一個「可寫」層。聯合掛載,須要文件系統支持,目前支持最好的文件系統爲Aufs(advanced multi-layered unification filesystem),高級多層統一文件系統,用於爲linux文件系統實現」聯合掛載「,docker 最初使用aufs做爲容器文件系統層,目前還做爲存儲後端之一來支持,目前沒有基層到linux內核,須要對內核打補丁才能使用aufsdocker的分層鏡像,除了aufs,還支持btrfs,devicemappervfs。在ubuntu系統下,docker默認支持ubuntuaufs,這也是爲何不少底層鏡像都是ubuntu的緣由,由於ubuntu更好的支持aufs.centos7用的是devicemapper.可是,devicemapper在性能上有問題。linux 在3.18版本後把overlayfs整合到內核裏,docker-ce目前在centos7上支持的文件系統爲overlay,使用overlay做爲docker的後端存儲機制,若是是按照extras源裏的docker包,版本1.12,後端的存儲爲devicemapper文件系統

2  Regeistry介紹

Registry用於保存docker鏡像,包括鏡像的層次結構和元數據,RegistryRepositoryIndex兩個組件組成

啓動鏡像時,docker daemon會試圖從本地獲取相關的鏡像,本地鏡像不存在時,將從registry中下載該鏡像並保存到本地。

registry是一個無狀態,高可擴展的服務端應用程序,能夠用於存儲和分發docker 鏡像。docker registry裏,index是一個重要組件,讓用戶能夠查詢搜索到相關的鏡像,同時index支持認證功能。

registry分爲兩種:

公共的registry,如docker hub,

私有化docker registry,本身搭建的registry。

經過應用程序包docker-distribution.x86_64 來實現私有registry搭建,在extras倉庫中。這個軟件沒有web頁面,也不支持認證。能夠經過nginx配置反代,在nginx上實現認證

或者經過harbor這個軟件才實現私有化倉庫搭建,這個軟件有vmware公司維護,企業級的容器registry,是在docker-distribution基礎上添加功能實現的。建議用harbor建立私有registry(倉庫)

3  Repository介紹

Repository是指由某特定的docker鏡像的全部迭代版本組成的鏡像倉庫,一個Registry內部有多個Repository.其中,Repository可風味「頂層倉庫」和「用戶倉庫」,用戶倉庫名稱格式爲「用戶名/倉庫名」。

每一個倉庫能夠包含多個Tag(標籤),每一個標籤對象對應一個鏡像,能夠手動打標籤,若是和官方有衝突,以本標籤地爲準,統一鏡像能夠有多個標籤,tag不同,可是image id同樣,便籤配置命令以下,把busybox的鏡像latest版本,再打一個標籤爲sunny01,則busybox同時有兩個標籤,image id同樣

 docker tag busybox:latest busybox:sunny01

4  Index介紹

用於維護用戶帳號,鏡像的校驗以及公共名稱空間的信息

至關於爲registry提供了一個能夠完成用戶認證等功能的檢索接口

5  docker hub功能介紹

docker hub支持以下組件

image repositories:鏡像倉庫

automated builds:當修改原碼倉庫時自動構建鏡像,只須要上傳dockerfile就會構建鏡像

webhooks:自動構建的屬性之一,當成功推送一個文件到倉庫後webhooks觸發一個動做

organizations:工做組

github and bitbucket integration:和github整合起來,在github上開發,定義webhooks,當監控到github有新的推送後,自動執行構建鏡像,完成鏡像構建。

使用docker hub以外的第三方倉庫,推送鏡像,須要指定以下信息

向那個倉庫的那個端口,哪一個名稱空間推送鏡像,鏡像名稱和標籤是什麼,其中port默認爲5000,命令以下

docker pull  <registry>[:<prot>]/[<namespace>/]<name>:<tag>

6  基於容器製做鏡像

製做鏡像三個方法

1.基於容器製做

2.基於dockerfile實現,鏡像製做的程序文件

3.Docker Hub Automated Builds

這裏僅介紹基於容器製做鏡像

1.基於容器實現

啓動容器後,將新的操做製做爲新鏡像

例子

啓動乾淨的鏡像文件busybox,而後再容器內建立httpd的根目錄和index.html文件,而後製做成行的鏡像

 啓動容器,名稱爲sunny01img

docker run -it --name sunny01img busybox:sunny01
#在容器內進行修改
/ # mkdir -p /web/html
/ # cd /web/html
/web/html # vi index.html
<h1>this is sunny docker image,it is a nice day!<\h1>

在另外一個終端,執行以下命令

 docker commit -a "sunny<sunny@sunny.docker>" -p -m "for test commit image"  sunny01img

用命令查看新生成的鏡像

docker images

查看到有tag爲none的新生成的鏡像

將鏡像推送到阿里雲鏡像倉庫中

登陸https://dev.aliyun.com,選擇產品和服務--》容器鏡像服務--》鏡像倉庫,建立一個本地倉庫,名稱爲sunnytest

首先給本地鏡像打標籤

docker tag 3498bc48a842 registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb

這裏的鏡像名稱爲新建的倉庫名

將打了標籤的鏡像推送到阿里雲,要先登陸倉庫


docker login registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest

這裏registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest 爲新建的倉庫名,輸入帳號爲開發者平臺的帳號,密碼爲Registry登陸密碼,不是登陸開發者平臺密碼

登陸成功後,將鏡像推送到阿里雲倉庫sunnytest上,把鏡像推送到遠程倉庫,用push實現


 docker push registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb

這裏的registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb是鏡像名:tag

使用新的鏡像來啓動容器

新建一個標籤

docker tag  3498bc48a842 websrv:sunnyweb01

將新的鏡像websrv:sunnyweb01 運行爲守護模式(-d,即後臺),而後指定進程爲httpd,前端運行模式(-f),指定家目錄爲/web/html

docker run --name sunnyweb01 -d websrv:sunnyweb01 httpd -f -h /web/html

查看

docker ps

查看到websrv:sunnyweb01鏡像運行爲容器sunnyweb01.

 查看進程信息

 docker top sunnyweb01

查看詳細容器信息

docker inspect sunnyweb01

查看到當前的容器ip爲172.17.0.3

測試httpd的服務

curl 172.17.0.3

改變容器的默認啓動命令

在初版新建鏡像websrv:sunnyweb01的基礎上建立第二版的鏡像,

在另外一個終端上,不執行默認的cmd,而是默認啓動httpd服務

首先,先啓動鏡像,進入cmd,執行相關命令

docker run --name sunnyweb02 -it websrv:sunnyweb01

打開另外一個shell終端,執行以下命令,生成一個新的鏡像

docker commit -a "sunny <sunny@ghnsunny.cn>" -p -m "web server" -c 'CMD  ["/bin/httpd","-f","-h","/web/html"]' sunnyweb02

注意,-c,修改運行中的命令,後接一個字典,全部的字段都要分別傳遞,用引號引用,逗號隔開,不然參數傳遞失敗,致使鏡像不能啓動。

sunnyweb02是指當前要做爲鏡像的模板容器名稱,如這裏以sunnyweb02這個容器做爲模板來建立新鏡像

給新生成的鏡像打標籤

docker tag 990ff989b8fb registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb2.0

經新生成的鏡像推送到阿里雲倉庫

 docker push registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb2.0

啓動鏡像,容器名稱爲web2.0,而且運行在後臺(-d)

docker run --name web2.0 -d registry.cn-hangzhou.aliyuncs.com/ghbsunny/sunnytest:sunnyweb2.0

測試

查看容器是否正常運行

docker ps

查看容器的ip

docker inspect web2.0

這裏查看到ip 爲 172.17.0.6

測試httpd服務


curl 172.17.0.6

這個例子說明,製做鏡像是能夠-c改變默認的命令,而不是默認的sh命令,可讓容器基於新建鏡像啓動時運行指定的命令。

7  分發鏡像文件

docker容許把鏡像導入和導出,包括鏡像的源屬性信息和全部層存儲爲tar格式的打包文件,並在其餘服務器導入該鏡像,並運行

導出鏡像

默認狀況下,會把導出文件打印在屏幕,所以須要用參數-o來指定輸入的鏡像文件

命令以下


docker save -o /root/testsave.tar sunnytest3:1.0

/root/testsave.tar 的鏡像打包文件傳到運行docker服務的10.10.10.73的服務器上


scp testsave.tar 10.10.10.73:/root

 10.10.10.73上導入鏡像

注意,確保 10.10.10.73安裝docker,且運行docker服務,-i選項是指從tar備份文件輸入,而不是從標準輸入來輸入數據

docker load -i testsave.tar

 10.10.10.73運行導入的鏡像sunnytest3:1.0,後臺運行(-d)

 docker run --name testload -d sunnytest3:1.0

測試

容器啓動成功後,運行一個httpd服務,所以用curl進行測試

 curl 172.17.0.2

以上用於分發需求較少的狀況下使用,只能在數量很少,分發需求較少的環境實現。注意12版和17版命令有區別,17 docker image save / load

命令docker image --help來查看更多選項的介紹

用docker image history 查看鏡像的操做歷史

docker image history sunnytest3:1.0

命令stats用來統計容器的數據,查看容器的資源利用狀態,動態刷新,如容器的CPU,內存,網絡等信息,以下命令,統計容器testload的信息

docker stats testload
相關文章
相關標籤/搜索