1 概述
html
鏡像包含啓動容器所需的文件系統和內容,能夠理解爲打包的文件,用於建立並啓動docker容器。前端
鏡像的生成途徑有三個:linux
1.基於dockerfile實現,鏡像製做的程序文件nginx
2.基於容器實現,啓動容器後,將新的操做製做爲新鏡像git
3.docker hub automated buildsgithub
鏡像文件採用分層構建機制,最底層爲bootfs,上面爲rootfs,rootfs上還能夠有多層。位於最下層的鏡像文件爲父鏡像(parent image),最底層爲基礎鏡像(base image,rootfs爲這一層,這一層必須存在).最上層爲「可讀寫」層,其下的均爲「只讀」層web
以下截圖docker
其中:shell
bootfs:用於系統引導的文件系統,包含bootloader和kernel,容器啓動完成後會被卸載以節約內存資源,能夠理解爲容器引擎,不是宿主機操做系統ubuntu
rootfs:位於bootfs之上,表現爲docker容器的根文件系統;
傳統模式中,系統啓動時,內核掛載rootfs時會首先將其掛載爲只讀模式,完整性自檢完成後將其從新掛載爲讀寫模式
docker中,rootfs由內核掛載爲只讀模式,然後經過「聯合掛載」技術額外掛載一個「可寫」層。聯合掛載,須要文件系統支持,目前支持最好的文件系統爲Aufs(advanced multi-layered unification filesystem),高級多層統一文件系統,用於爲linux文件系統實現」聯合掛載「,docker 最初使用aufs做爲容器文件系統層,目前還做爲存儲後端之一來支持,目前沒有基層到linux內核,須要對內核打補丁才能使用aufs。docker的分層鏡像,除了aufs,還支持btrfs,devicemapper和vfs。在ubuntu系統下,docker默認支持ubuntu的aufs,這也是爲何不少底層鏡像都是ubuntu的緣由,由於ubuntu更好的支持aufs.而centos7用的是devicemapper.可是,devicemapper在性能上有問題。linux 在3.18版本後把overlayfs整合到內核裏,docker-ce目前在centos7上支持的文件系統爲overlay,使用overlay做爲docker的後端存儲機制,若是是按照extras源裏的docker包,版本1.12,後端的存儲爲devicemapper文件系統
Registry用於保存docker鏡像,包括鏡像的層次結構和元數據,Registry由Repository和Index兩個組件組成
啓動鏡像時,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(倉庫)。
Repository是指由某特定的docker鏡像的全部迭代版本組成的鏡像倉庫,一個Registry內部有多個Repository.其中,Repository可風味「頂層倉庫」和「用戶倉庫」,用戶倉庫名稱格式爲「用戶名/倉庫名」。
每一個倉庫能夠包含多個Tag(標籤),每一個標籤對象對應一個鏡像,能夠手動打標籤,若是和官方有衝突,以本標籤地爲準,統一鏡像能夠有多個標籤,tag不同,可是image id同樣,便籤配置命令以下,把busybox的鏡像latest版本,再打一個標籤爲sunny01,則busybox同時有兩個標籤,image id同樣
docker tag busybox:latest busybox:sunny01
用於維護用戶帳號,鏡像的校驗以及公共名稱空間的信息
至關於爲registry提供了一個能夠完成用戶認證等功能的檢索接口
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