本章內容html
一、docker鏡像基礎docker
二、docker環境下使用的文件系統apache
三、registry(倉庫)後端
四、獲取鏡像安全
五、製做(生成)並上傳鏡像服務器
---------------------------------------網絡
鏡像是做爲docker環境的核心內容,一幫狀況下,咱們都須要根據工做環境來定製鏡像文件,這就對於運維人員提出了很高的要求;app
一、docker鏡像基礎運維
docker鏡像含有啓動容器所須要的文件系統及其內容,所以,其用於建立並啓動docker容器採用分層構建機制,最底層的bootfs,其之爲rootfs;ssh
docker鏡像的分層結構,以下:
首先,咱們須要瞭解bootfs ,它是用於引導文件系統的,包含有bootloader和kernel,容器啓動以後就會將其卸載下來;(這裏就是爲了去加載內核,內核加載完成就能夠卸載,以節約資源)
其次,rootfs 位於bootfs之上,它就是docker容器的根文件件系統,是每一個容器的根;
一、在傳統系統模式中,系統啓動時,內存掛載在rootfs「只讀」模式,完整性自檢完成後將其從新掛載爲讀寫模式;(系統啓動知識)
二、docker中,rootfs由內核掛載爲「只讀」模式,然後經過」聯合掛載「技術額外掛載一個」可寫」層;
最後再在rootfs上面去掛載編譯環境(編輯器emacs),以及應用程序,而這兩層都是「只讀」層,若是須要修改,咱們再在最上層掛載writable讀寫層。也就是咱們的container;
【這裏咱們須要知道,下層是能夠屢次使用的,能夠同時關聯於多個writable層上,這樣的話,下層能夠重複利用】
如上圖:
二、docker環境下使用的文件系統
此時,基於docker鏡像的工做原理,咱們使用原有傳統的數據組織方式(文件系統)是不適用的,因此咱們使用了新的文件系統來知足docker容器技術;
其中包括三種技術:aufs overlayfs devicemapper(dm)
其中,devicemapper使用的是dm的模塊來實現,而並非修改了文件系統,在生產環境下,咱們建議使用overlayfs的文件系統來實現docker技術;
Aufs
用於爲Linux文件系統實現「聯合掛載」,aufs是以前UnionFS的從新實現,2006年由Junjiro Okajima開發;docker使用之初是用aufs做爲文件系統層,它目前仍然做爲存儲後端之一來支持;
它的競爭產品overlayfs,後來從3.18版本開始被合併到Linux內核;docker;
而aufs一直不是內核中自有的文件系統。它由於代碼太亂了,3萬行太多,沒有寫入內核;若是須要,則必須打補丁升級;而Ubuntu則是將aufs寫入內核了;
overlayfs
相對於aufs,overlayfs則要優秀的多,它已經被寫入到Linux內核,默認啓動docker,只要支持overlayfs,則就回使用這種方式來建立docker環境;
devicemapper
在沒有使用上面兩種文件系統的系統程序中,去啓動docker進程,則是使用該方式來實現的;它是藉助 dm 模塊(和lvm技術是同一個模塊)來實現,而不是依靠文件系統;
因此這種方式很是的不穩定,不建議使用;可是在3.18內核以前的版本,redhat系列的Linux操做系統不支持aufs和overlayfs,就會使用該方式來實現docker環境;
查看個人docker環境:
docker info
三、registry(倉庫)
鏡像文件是從registry(倉庫)中獲取;
在啓動容器時(run),docker daemon會同時從本地獲取相關的鏡像文件,若是本地沒有這個鏡像文件,服務器就回直接去對應的公網倉庫中去下載;
倉庫的分類:
sponsor Registry 第三方倉庫,供客戶和docker社區使用
mirror Registry 第三方倉庫,只讓客戶使用
vendor Registry 由發佈docker鏡像的供應商提供的registry
private Registry 經過設有防火牆和額外的安全層的私有實體提供的registry
tag標籤:
對於倉庫,能夠定義標籤tag,每一個倉庫能夠有多個標籤,可是,一個標籤是不能屬於多個倉庫的;
index索引:
維護用戶帳號、鏡像的校驗以及公共命名空間的信息;
至關於爲registry(倉庫)提供了一個完成用戶認證等功能的檢索接口;
四、獲取鏡像
咱們獲取鏡像,經過 docker 命令的子命令 pull 來實現;
用法以下:
docker pull registry[:<port>]/[namespace/]<name>:<tag>
示例:下載一個鏡像文件;
咱們經過第三方的倉庫來下載咱們所須要的鏡像文件: https://quay.io
搜索 flannel ;這是雲環境下最經常使用的一個網絡部署系統鏡像文件;
點擊「coreos/flannel」進入下載界面: 在右下角能夠複製鏡像地址,進入鏡像下載界面
這裏,咱們必定要指定tag,以下圖查看tag:
下載鏡像:
docker pull quay.io/coreos/flannel:v0.11.0-arm
查看鏡像:
docker images
五、製做(生成)並上傳鏡像
鏡像生成途徑有兩種:一、dockerfile 二、基於容器製做
其中dockerfile是咱們最經常使用的鏡像製做方式,並且是docker容器的核心,咱們須要經過dockerfile本身定義鏡像,本身定義倉庫;
這裏咱們先經過容器技術來配置:
咱們經過子命令commit來經過容器製做鏡像;
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a --author 指定做者
-c --change 應用dockerfile的指令來建立鏡像
-m --message 添加消息信息
-p --pause 建立鏡像的時候,須要暫停容器
a\首先咱們運行一個容器
咱們這裏首先經過 pull 命令下載一個busybox的容器,啓動這個容器
docker run --name b1 -it busybox
b\啓動busybox的http服務
/ # mkdir -p /data/html / # vi /data/html/index.html <h1>Busybox httpd server</h1> / # busybox httpd server
查看busybox地址:
重新開啓一個 ssh 遠程接口,查看http服務:
curl 172.17.0.2
c\保存鏡像
docker commit -p b1 //製做新的鏡像
docker images //查看製做的鏡像
咱們能夠爲新的鏡像文件添加標籤:
經過子命令 tag 來實現
docker tag 6l6b37df33a7 test/httpd:v0.1 //添加標籤須要指定鏡像id
刪除鏡像,咱們能夠經過 images 子命令來實現
docker images rm test/httpd:v0.1
咱們這裏就不刪除了
d\咱們能夠運行這個鏡像
操做以下: 這裏,我新添加一個容器--b1.1,使用的就是咱們建立的鏡像,同時,咱們能夠 cat /data/html/index.html 文件,這樣,咱們就可以看到以前編輯的文件;
e\指定默認容器啓動的服務
這裏咱們啓動的容器後,還須要指定啓動httpd服務,可是,若是咱們默認就須要鏡像啓動httpd的服務,這裏,咱們也能夠經過commit子命令來實現;
docker commit -a "test <test@admin.com>" -c 'CMD ["/bin/httpd","-f","-h","data/html"]' -p b1 test/httpd:v0.2
此時,則建立了一個新的鏡像,咱們再啓動這個鏡像:
docker run --name b1.2 -it test/httpd:v0.2
docker inspect b1.2 //查看地址
查看服務:
查看容器:
在這裏,咱們能夠看到,咱們指定的默認啓動命令;
f\上傳鏡像到公網倉庫
根據上面的內容,咱們已經爲本身製做了對應的鏡像文件;咱們能夠將本身製做的鏡像文件上傳到公網倉庫,提供給別人下載;
首先,咱們須要去dockerhub.com上面註冊帳號:
註冊完成之後,登陸dockerhub.com網站
在該界面下,去建立本身的倉庫;
一、指定倉庫名稱 二、指定倉庫描述 三、指定鏡像是否公開
最後建立便可:
有了本身的公有倉庫,這時候,咱們就能夠將本身的鏡像文件上傳到倉庫中:
pull 子命令爲下載鏡像,一樣的 push 命令就是上傳進項;
在上傳以前,咱們須要登陸到本身的公網倉庫,這個操做經過 login 操做來完成;
docker login -u burnov
提示登陸成功後,咱們就能夠上傳鏡像了
注意:這裏有個問題--上傳鏡像咱們必定要讓倉庫名稱,登陸名稱對應上:
上圖是咱們倉庫的名稱,因此,咱們的鏡像名稱也須要修改過來
docker tag test/httpd:v0.2 burnov/httpd:v0.2
這裏,burnov/httpd 中 burnov爲用戶名,而httpd爲倉庫名;v0.2爲tag標記;
再次上傳鏡像
docker push burnov/httpd:v0.2
這樣就能上傳鏡像到倉庫;
查看倉庫:刷新一下便可