【講清楚,說明白!】Docker鏡像管理基礎

Docker鏡像含有啓動容器所需要的文件系統及其內容,因此,其用於創建並啓動docker容器。docker鏡像採用分層構建機制,這種分層可大體分爲兩部分,第一部分最低層爲bootfs,向上真正來構建用戶空間運行容器的稱之爲rootfs。
(1)鏡像構成
其中bootfs用於系統引導的文件系統,包括bootloader和kernel,容器啓動完成後會被卸載以節約內存資源,而rootfs位於bootfs之上,表現爲docker容器的根文件系統。
需要注意的是在傳統模式中,系統啓動之時,內核掛載rootfs時會首先將其掛載爲“只讀”模式,完整性自檢完成後將其重新掛載爲讀寫模式。
【講清楚,說明白!】Docker鏡像管理基礎
而在docker中,rootfs由內核掛載爲“只讀”模式,而後通過“聯合掛載”技術額外掛載一個“可寫”層。位於下層的鏡像稱爲父鏡像(parent image),最底層的稱爲基礎鏡像(base image),最上層爲“可讀寫”層,其下的均爲“只讀”層。例如bootfs文件系統之上的基礎鏡像是一層Debian操作系統,用來供給系統的基礎構成,提供bin、sbin、usr等目錄,接着如果我們要用到一個額外的應用工具的話,在上面直接安裝一層鏡像例如emacs編輯器,再向上安裝一層鏡像比如Apache,隨後我們要啓動Apache的時候需要把3層都啓動起來,先啓動最底層,在最底層的基礎之上掛載第二層,然後再掛載第三層,它們是疊加在一起掛載的,這就是我們所謂的聯合掛載,這三層都是隻讀的,容器啓動完之後如果某一進城需要創建臨時文件類的,會放在/tmp目錄下,事實上/tmp目錄所在的底層是不允許編輯的,要想能夠編輯,是在最頂層創建一個可寫層,這一層纔是容器自有的,下面的層都是可供多個基於同一個鏡像啓動的容器所共享的層次。對於容器來說所有的寫操作都是在最上層writable層實現,如果刪除容器這個writable層也會一併被刪除。
【講清楚,說明白!】Docker鏡像管理基礎
(2)docker鏡像文件系統
Docker最早使用的是Aufs文件系統,即advanced multi-layered unification filesystem高級多層次統一文件系統,用於爲Linux文件系統實現“聯合掛載”;aufs是之前的UnionFS的重新實現,2006年由Junjiro Okajima開發;Docker最初使用aufs作爲容器文件系統層,它目前仍作爲存儲後端之一來支持;aufs競爭產品是overlayfs,後者自從3.18版本開始被合併到Linux內核;docker的分層鏡像除了aufs,docker還支持btrfs,devicemapper和vfs等;在Ubuntu系統下,docker默認Ubuntu使用的是aufs文件系統,而在CentOS 7上,用的是devicemapper。
而在CentOS 7系統中我們可以看到docker使用的後端是xfs文件系統,前端使用的是overlay2文件系統。
# docker info
【講清楚,說明白!】Docker鏡像管理基礎
(3)Docker Registry概述
啓動容器時,docker daemon會試圖從本地獲取相關的鏡像,本地鏡像不存在時,其將從Registry中下載該鏡像並保存到本地。
Registry用於保存docker鏡像,包括鏡像的層次結構和元數據,用戶可自建Registry,也可使用官方的Docker Hub。
其中Registry的分類主要有四種:Sponsor Registry,即第三方的registry,供客戶和Docker社區使用;Mirror Registry,即第三方的registry,只讓客戶使用;Vendor Registry,即由發佈Docker鏡像的供應商提供的registry;第四種Private Registry,即通過設有防火牆和額外的安全層的私有實體提供的registry
一個Registry通常會有兩部分組成,Repository和Index。其中Repository是由特定的docker鏡像的所有迭代版本組成的鏡像倉庫,一個Registry中可以存在多個Repository,而Repository可分爲“頂層倉庫”和“用戶倉庫”;用戶倉庫名稱格式爲“用戶名/倉庫名”。每個倉庫可以包含多個Tag(標籤),每個標籤對應一個鏡像。第二個Index的作用在於維護用戶賬戶、鏡像的校驗以及公共命名空間的信息;相當於爲Registry提供了一個完成用戶認證等功能的檢索接口。
Docker Registry中的鏡像通常由開發人員製作,而後推送至“公共”或“私有”Registry上保存,供其他人員使用,例如“部署”到生產環境。首先Developer開發人員可以到Docker public registry上將鏡像Pull到本地,在原有鏡像的基礎上做額外的修改生成一個新的層次,就做出了一個新的鏡像了,把新鏡像推送到自己的私有倉庫Docker private registry中,然後就可以由我們的運維人員將新的鏡像Pull到服務器上部署並啓動。
【講清楚,說明白!】Docker鏡像管理基礎
(4)Docker Hub概述
A.Image Repositories
B.Automated Builds
C.Webhooks
D.Organizations
E.GitHub and Bitbucket Integration
在docker hub中有如下的幾類標籤,其中第一個Image Repositories,即鏡像倉庫,我們創建了一個nginx,把我們自己做的nginx鏡像上傳上去,如果我們製作了redis鏡像,再上傳我們製作的redis鏡像,以此類推,每一個就是一個鏡像倉庫;第二個Automated Builds即自動構建,一般我們有兩種方式,一種是用docker build基於Dockerfile來做,另一種是基於容器來製作,容器啓動起來後上面有一層可寫層,這個可寫層可能做了很多改變,我們可以把可寫層固定下來做成一個鏡像就可以了,當我們使用Dockerfile來製作鏡像的時候,可以把Dockerfile文件推送到GitHub的倉庫中,這個倉庫可以與docker hub的倉庫建立起關聯關係,docker hub可以持續的監控GitHub倉庫,一旦Dockerfile文件發生改變,docker hub就會自動把Dockerfile拖下來做成docker鏡像,並將鏡像存放在倉庫中;第三個Webhooks即web鉤子,是我們自動構建的一種特徵,它可以觸發一種行爲,當本地的Dockerfile推送到GitHub上後,而GitHub的變動會通知到docker hub,此時docker hub會把Dockerfile文件pull下來自動構建鏡像的過程;第四個Organizations即組織,我們可以創建一個工作組,大家可以協同起來工作;第五個GitHub and Bitbucket Integration表示可以與Bitbucket進行整合
備註:
如果我們想下載鏡像,常用的鏡像站點還有:https://quay.io/ ,例如我們需要下載flannel插件,我們可以按照如下的方式找到合適的版本並進行下載
# docker pull quay.io/coreos/flannel:v0.13.0-amd64
【講清楚,說明白!】Docker鏡像管理基礎
【講清楚,說明白!】Docker鏡像管理基礎
(5)鏡像相關的操作
一般鏡像的生成途徑有如下的三種方式,第一種是使用Dockerfile並使用docker build命令進行製作;第二種是基於容器進行製作,在已有做好的容器基礎上進行製作;第三種是使用Docker Hub automated builds進行自動構建,其實這種方式也是和第一種的方式一致,也是基於Dockerfile來實現的。
【講清楚,說明白!】Docker鏡像管理基礎
(6)基於容器製作鏡像
(6.1)
# docker image ls
查看當前所有的鏡像文件
# docker run --name b1 -it busybox
【講清楚,說明白!】Docker鏡像管理基礎
【講清楚,說明白!】Docker鏡像管理基礎
# docker commit -p b1
基於已經創建的容器b1製作一個鏡像,使用p選項表示將容器暫停
# docker tag 3ddbb184105a wanggeedu/httpd:v0.1-1
針對b1創建的鏡像文件,我們使用IMAGE ID來唯一定位鏡像,併爲其用tag打一個標籤
【講清楚,說明白!】Docker鏡像管理基礎
# docker tag wanggeedu/httpd:v0.1-1 wanggeedu/httpd:latest
我們可以爲已經創建的wanggeedu/httpd:v0.1-1版本的鏡像創建一個新的tag標籤latest
# docker inspect busybox
查看鏡像文件的busybox的默認配置,在Cmd中有標明其默認會運行/bin/sh命令(圖3-11)
【講清楚,說明白!】Docker鏡像管理基礎
# docker run --name t1 -it wanggeedu/httpd:v0.1-1
基於我們創建的新的鏡像wanggeedu/httpd:v0.1-1啓動一個容器
(6.2)需求:我們希望現在基礎busybox鏡像上創建的新的鏡像使用的默認命令不在是原有的/bin/sh,而是運行httpd服務。
# docker commit -h
查看命令的用法和使用參數
# httpd -h
查看httpd服務的幫助
【講清楚,說明白!】Docker鏡像管理基礎
# docker commit -a "WanggeEdu <[email protected]>" -c 'CMD ["/bin/httpd","-f","-h","/data/html"]' -p b1 wanggeedu/httpd:v0.2-1
基於已有的容器b1創建一個鏡像,其中使用的標註是a參數,使用c參數表示修改原有基礎鏡像所使用的命令,具體修改爲啓動httpd進程的命令,使用p參數表示將容器暫停,製作的鏡像名爲wanggeedu/httpd:v0.2-1
# docker run --name t2 wanggeedu/httpd:v0.2-1
運行一個基於新創建的鏡像啓動的容器並且命名爲t2
【講清楚,說明白!】Docker鏡像管理基礎
# docker container ls
查看容器運行的狀態
# docker inspect t2
查看創建的t2容器運行的詳細信息
# curl 172.17.0.3
使用命令行連接t2容器的web服務
【講清楚,說明白!】Docker鏡像管理基礎
(6.3)使用示例
# docker run --rm -it --name bbox1 busybox
啓動容器,執行需要的修改操作
# docker logs bbox1
查看修改
# docker commit bbox1 wanggeedu/busybox/httpd:latest
製作鏡像
# docker commit --change=’CMD [“httpd”,”-h /data/httpd/htdocs”,”-f”]’ -c “EXPOSE 80” bbox1 wanggeedu/busybox/httpd:v0.1
提交鏡像,修改默認運行的命令
# docker tag 3ddbb184105a wanggeedu/busybox/httpd:latest
基於ID打標
# docker wanggeedu/busybox/httpd:v0.1 wanggeedu/busybox/httpd:latest
基於名稱和標籤打標
# docker push wanggeedu/busybox/httpd:latest
將鏡像push到Docker Hub上
(7)使用阿里雲構建鏡像倉庫
國內訪問比較快的鏡像服務器平臺,一般使用阿里雲的就比較好
【講清楚,說明白!】Docker鏡像管理基礎
【講清楚,說明白!】Docker鏡像管理基礎
然後我們新建一個鏡像倉庫,並填上相關的配置信息,點擊下一步即可
【講清楚,說明白!】Docker鏡像管理基礎
然後我們點擊創建一個本地倉庫
【講清楚,說明白!】Docker鏡像管理基礎
創建完後我們點擊管理後,我們發現我們應該使用“registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd” 這樣的標籤前綴
# docker tag wanggeedu/httpd:v0.2-1 registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
【講清楚,說明白!】Docker鏡像管理基礎
【講清楚,說明白!】Docker鏡像管理基礎
# docker login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com
我們使用上面的倉庫登錄地址,並輸入登錄密碼等信息
# docker push registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
我們將創建好的鏡像推送到阿里雲的倉庫中
【講清楚,說明白!】Docker鏡像管理基礎
此時我們發現製作的httpd服務的鏡像已經正常的推送到了阿里雲的倉庫中了
【講清楚,說明白!】Docker鏡像管理基礎
(8)我們可以在一臺主機上將已有的鏡像文件打包
# docker save --help
查看docker save命令的使用幫助
# docker save -o mymage.gz wanggeedu/httpd:latest wanggeedu/httpd:v0.1-1
我們將創建的2個鏡像文件進行打包並保存爲mymage.gz文件
【講清楚,說明白!】Docker鏡像管理基礎
# scp mymage.gz 192.168.26.133:/root/
將創建的壓縮文件通過scp傳輸到133的主機上
# scp docker-ce.repo 192.168.26.133:/etc/yum.repos.d/
將本機服務器中的repo文件傳送到133主機上
# mkdir /etc/docker
在133服務器上創建/etc/docker目錄
# scp /etc/docker/daemon.json 192.168.26.133:/etc/docker/
在本機128服務器上將daemon.json文件拷貝到133主機上
# yum install docker-ce -y
在133主機上安裝docker
# systemctl start docker
在133主機上啓動docker
# docker load -i mymage.gz
在133主機上將docker鏡像下載下來並指定是從mymage.gz文件進行下載
【講清楚,說明白!】Docker鏡像管理基礎




























































































































—————— 本文至此結束,感謝閱讀 ——————

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章