Docker鏡像含有啓動容器所須要的文件系統及其內容,所以,其用於建立並啓動docker容器。docker鏡像採用分層構建機制,這種分層可大致分爲兩部分,第一部分最低層爲bootfs,向上真正來構建用戶空間運行容器的稱之爲rootfs。
(1)鏡像構成
其中bootfs用於系統引導的文件系統,包括bootloader和kernel,容器啓動完成後會被卸載以節約內存資源,而rootfs位於bootfs之上,表現爲docker容器的根文件系統。
須要注意的是在傳統模式中,系統啓動之時,內核掛載rootfs時會首先將其掛載爲「只讀」模式,完整性自檢完成後將其從新掛載爲讀寫模式。
而在docker中,rootfs由內核掛載爲「只讀」模式,然後經過「聯合掛載」技術額外掛載一個「可寫」層。位於下層的鏡像稱爲父鏡像(parent image),最底層的稱爲基礎鏡像(base image),最上層爲「可讀寫」層,其下的均爲「只讀」層。例如bootfs文件系統之上的基礎鏡像是一層Debian操做系統,用來供給系統的基礎構成,提供bin、sbin、usr等目錄,接着若是咱們要用到一個額外的應用工具的話,在上面直接安裝一層鏡像例如emacs編輯器,再向上安裝一層鏡像好比Apache,隨後咱們要啓動Apache的時候須要把3層都啓動起來,先啓動最底層,在最底層的基礎之上掛載第二層,而後再掛載第三層,它們是疊加在一塊兒掛載的,這就是咱們所謂的聯合掛載,這三層都是隻讀的,容器啓動完以後若是某一進城須要建立臨時文件類的,會放在/tmp目錄下,事實上/tmp目錄所在的底層是不容許編輯的,要想可以編輯,是在最頂層建立一個可寫層,這一層纔是容器自有的,下面的層都是可供多個基於同一個鏡像啓動的容器所共享的層次。對於容器來講全部的寫操做都是在最上層writable層實現,若是刪除容器這個writable層也會一併被刪除。
(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
(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到服務器上部署並啓動。
(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
(5)鏡像相關的操做
通常鏡像的生成途徑有以下的三種方式,第一種是使用Dockerfile並使用docker build命令進行製做;第二種是基於容器進行製做,在已有作好的容器基礎上進行製做;第三種是使用Docker Hub automated builds進行自動構建,其實這種方式也是和第一種的方式一致,也是基於Dockerfile來實現的。
(6)基於容器製做鏡像
(6.1)
# docker image ls
查看當前全部的鏡像文件
# docker run --name b1 -it busybox
# docker commit -p b1
基於已經建立的容器b1製做一個鏡像,使用p選項表示將容器暫停
# docker tag 3ddbb184105a wanggeedu/httpd:v0.1-1
針對b1建立的鏡像文件,咱們使用IMAGE ID來惟必定位鏡像,併爲其用tag打一個標籤
# 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 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 commit -a "WanggeEdu <1342697644@qq.com>" -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 container ls
查看容器運行的狀態
# docker inspect t2
查看建立的t2容器運行的詳細信息
# curl 172.17.0.3
使用命令行鏈接t2容器的web服務
(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)使用阿里雲構建鏡像倉庫
國內訪問比較快的鏡像服務器平臺,通常使用阿里雲的就比較好
而後咱們新建一個鏡像倉庫,並填上相關的配置信息,點擊下一步便可
而後咱們點擊建立一個本地倉庫
建立完後咱們點擊管理後,咱們發現咱們應該使用「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 login --username=王翔宇食神 registry.cn-shenzhen.aliyuncs.com
咱們使用上面的倉庫登陸地址,並輸入登陸密碼等信息
# docker push registry.cn-shenzhen.aliyuncs.com/wanggeedu/httpd:v0.2-1
咱們將建立好的鏡像推送到阿里雲的倉庫中
此時咱們發現製做的httpd服務的鏡像已經正常的推送到了阿里雲的倉庫中了
(8)咱們能夠在一臺主機上將已有的鏡像文件打包
# docker save --help
查看docker save命令的使用幫助
# docker save -o mymage.gz wanggeedu/httpd:latest wanggeedu/httpd:v0.1-1
咱們將建立的2個鏡像文件進行打包並保存爲mymage.gz文件
# 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文件進行下載html
—————— 本文至此結束,感謝閱讀 ——————前端