03 docker容器鏡像基礎

  本章內容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層上,這樣的話,下層能夠重複利用】

  

  如上圖:

  Apache 運行在一個純淨的 debian上面運行,在系統上使用一個編輯器 - emacs;
  bootfs在內存中掛載後,以後被移除掉;
  debian-emacs-apache 這三層用來啓動服務,而且一塊兒掛載--這就叫作 聯合掛載;這三層是能夠多個用戶同時共享使用的;
  可是,若是想寫入文件,則不能再接寫在這三層中,而是再加一層 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

  這樣就能上傳鏡像到倉庫;

  查看倉庫:刷新一下便可

相關文章
相關標籤/搜索