Docker架構及其三要素


1、Docker架構

a、Docker客戶端和服務端

  Docker是客戶-服務器(C/S)架構的程序。Docker客戶端只需向Docker服務器或守護進程發出請求,服務器或守護進程將完成所有工作並返回結果。Docker提供了一個命令行工具docker以及一整套RESTful APICD。你可以在同一台宿主機上運行Docker守護進程和客戶端,也可以從本地的Docker客戶端連接到運行在另一台宿主機上的遠程Docker守護進程。下圖描繪了Docker的架構:

b、Docker架構圖

c、Docker run 運行流程圖

2、Docker三要素

2.1、Docker鏡像

  鏡像是容器構建的基石,是基於聯合文件系統的一種層式結構。由一系列指令構建,是一種輕量級、可執行的獨立軟件包,用於打包軟件運行環境和基於運行環境開發的軟件(代碼、運行時、庫、環境變量和配置文件)。

  聯合文件系統(UnionFS)是一種分層、輕量級、高性能的文件系統。它支持對文件系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一虛擬文件系統下。Union文件系統是Docker鏡像的基礎。

  典型的Linux文件系統由bootfs和rootfs兩部分組成,bootfs(boot file system)主要包含 bootloader和kernel,bootloader主要是引導加載kernel,當kernel被加載到內存中后 bootfs就被umount了。 rootfs (root file system) 包含的就是典型 Linux 系統中的/dev,/proc,/bin,/etc等標准目錄和文件,rootfs就是不同操作系統的發行版。

  Docker容器的文件系統類似於Linux虛擬化棧。Docker鏡像是由文件系統疊加而成。最底端是一個引導文件系統,即bootfs, 很像典型的Linux/Unix的引導文件系統。當一個容器啟動時,首先加載bootfs用於引導重要文件,當容器啟動后,bootfs引導文件系統會被卸載(unmount)。

  傳統的Linux引導過程中,root文件系統會最先以只讀的方式加載,當引導結束並完成了完整性檢查之后,rootfs將會從read-only改為read-write。
Docker的鏡像加載時,在bootfs自檢完畢之后並不會把rootfs的read-only改為read-write。而是利用聯合加載union mount(UnionFS的一種掛載機制)將一個或多個read-only的rootfs加載到之前的read-only的rootfs層之上。在加載了這么多層的rootfs之后,仍然讓它看起來只像是一個文件系統,在Docker的體系里把union mount的這些read-only的rootfs叫做Docker的鏡像。

  一個鏡像可以放到另一個鏡像的頂部。位於下面的鏡像稱為父鏡像(parent image), 依次類推,直到鏡像棧的最底部,最底部的鏡像稱為基礎鏡像( base image)。最后,當從一個鏡像啟動容器時,Docker會在該鏡像的最頂層加載一個讀寫文件系統。鏡像可以通過分層來進行繼承,基於基礎鏡像可以制作各種具體的應用鏡像。
  此時的每一層rootfs都是read-only的,在鏡像啟動容器的最后階段,Docker會在該鏡像的最頂層加載一個讀寫read-write的rootfs文件系統,我們想在Docker中運行的程序就是在這個讀寫層中執行的。

  當Docker第一次啟動一個容器時,初始的讀寫層是空的。當文件系統發生變化時,這些變化都會應用到這一層上。比如,如果想修改一個文件,這個文件首先會從該讀寫層下面的只讀層復制到該讀寫層。該文件的只讀版本依然存在,但是已經被讀寫層中的該文件副本所隱藏。
這種機制被稱為寫時復制C copy on write), 這也是使Docker如此強大的技術之一。 每個只讀鏡像層都是只讀的,以后永遠不會變化。當創建一個新容器時,Docker會構建出一個鏡像棧,並在棧的最頂端添加一個讀寫層。這個讀寫層再加上其下面的鏡像層以及一些配置數據,就構成了一個容器。容器的這種特點加上鏡像分層框架( image-layering framework), 使我們可以快速構建鏡像並運行包我們自己的應用程序和服務的容器。
docker本地鏡像保存在 /var/lib/docker ,容器保存在 /var/lib/docker/containers 。
  總結:Docker鏡像(image)就是一個只讀的模板。 鏡像可以用來創建Docker容器,一個鏡像可以創建很多容器。

鏡像分層優勢

  共享資源:通過引入分層技術,可以增加鏡像復用度,減少磁盤占用;同時可以實現差分上傳下載,加快鏡像pull、push性能。

2.2、Docker容器

  Docker利用容器(container)獨立運行的一個或者一組應用。容器是利用鏡像創建的運行實例(相對於Java中的類和對象的概念)。容器可以被啟動、開始、停止、刪除。每個容器都是互相隔離的,保證安全的平台。可以把容器看做是一個簡易版的Linux環境 (包括root用戶名權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。
  容器的定義和鏡像幾乎是一模一樣的,也是一堆層的統一視角, 唯一區別的是容器的最上面那一層是可讀可寫的。
  容器是鏡像啟動或執行階段。Docker中的每個容器都包含了一個軟件鏡像,該鏡像可以被創建、啟動、關閉、重啟和銷毀。

2.3、Docker倉庫Registry

  倉庫(repository)是集中存放鏡像文件的場所 。最大的公開倉庫是docker hub( https://hub.docker.com/), 存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括阿里雲、網易雲等。
  Docker Hub中有兩種類型的倉庫:用戶倉庫(user repository)和頂層倉庫(top-level repository)。用戶倉庫的鏡像都是由Docker用戶創建的,而頂層倉庫則是由Docker內部的人來管理的。
用戶倉庫的命名由用戶名和倉庫名兩部分組成,如:jamtur01/puppet。用戶名:jamtur01,倉庫名:puppet。
頂層倉庫只包含倉庫名部分,如ubuntu倉庫。頂層倉庫由Docker公司和由選定的能提供優質基礎鏡像的廠商(如Fedora團隊提供了fedora鏡像)管理,用戶可以基於這些基礎鏡像構建自己的鏡像。
  倉庫(repository)和倉庫注冊服務器(registry)是有區別的。倉庫注冊服務器上往往放着很多個倉庫,每個倉庫中又包含了很多個鏡像,每個鏡像有不同的標簽(tag)。使用示例:倉庫名:TAG號。

總結:

  Docker本身是一個容器運行載體或者稱之為管理引擎。我們把應用程序和配置依賴打包好形成一個可交付的運行環境,這個打包好的運行環境就叫image鏡像文件。 只有通過這個鏡像文件才能生成docker容器。image文件可以看做是容器的模板。 Docker根據image文件生成容器的實例。 同一個image文件,可以生成多個同時運行的容器實例。
  a)image文件生成的容器實例,本身也是一個文件,稱為鏡像文件;
  b)一個容器運行一種服務,當我們需要的時候,就可以通過docker客戶端創建一個對應的運行實例,也就是我們的容器;
  c)至於倉庫,就是放了一堆鏡像的地方,我們可以把鏡像發布到倉庫中,需要的時候從倉庫中拉下來就可以了。

  • 作者: DeepInThought
    出處: https://www.cnblogs.com/DeepInThought
    本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

  • 免責聲明!

    本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



     
    粵ICP備18138465號   © 2018-2025 CODEPRJ.COM