Docker 架構及工做原理

  經過下圖能夠得知,Docker 在運行時分爲 Docker 引擎(服務端守護進程)客戶端工具,咱們平常使用各類 docker 命令,其實就是在使用 客戶端工具Docker 引擎 進行交互。docker

Client 客戶端

  

  Docker 是一個客戶端-服務器(C/S)架構程序。Docker 客戶端只須要向 Docker 服務器或者守護進程發出請求,服務器或者守護進程將完成全部工做並返回結果。Docker 提供了一個命令行工具 Docker 以及一整套 RESTful API。你能夠在同一臺宿主機上運行 Docker 守護進程和客戶端,也能夠從本地的 Docker 客戶端鏈接到運行在另外一臺宿主機上的遠程 Docker 守護進程。數據庫

  

Host 主機(Docker 引擎)

  

  一個物理或者虛擬的機器用於執行 Docker 守護進程和容器。服務器

  

Image 鏡像

  

  什麼是 Docker 鏡像?簡單的理解,Docker 鏡像就是一個 Linux 的文件系統(Root FileSystem),這個文件系統裏面包含能夠運行在 Linux 內核的程序以及相應的數據。架構

  經過鏡像啓動一個容器,一個鏡像就是一個可執行的包,其中包括運行應用程序所須要的全部內容:包含代碼,運行時間,庫,環境變量和配置文件等。工具

  Docker 把 App 文件打包成爲一個鏡像,而且採用相似屢次快照的存儲技術,能夠實現:性能

  • 多個 App 能夠共用相同的底層鏡像(初始的操做系統鏡像);
  • App 運行時的 IO 操做和鏡像文件隔離;
  • 經過掛載包含不一樣配置/數據文件的目錄或者卷(Volume),單個 App 鏡像能夠用來運行無數個不一樣業務的容器。

  

Container 容器

  

  鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等。學習

Docker 面向對象
容器 對象
鏡像

  

鏡像分層

  

  Docker 支持經過擴展示有鏡像,建立新的鏡像。實際上,Docker Hub 中 99% 的鏡像都是經過在 base 鏡像中安裝和配置須要的軟件構建出來的。ui

  

  

  從上圖能夠看到,新鏡像是從 base 鏡像一層一層疊加生成的。每安裝一個軟件,就在現有鏡像的基礎上增長一層。操作系統

  鏡像分層最大的一個好處就是共享資源。好比說有多個鏡像都從相同的 base 鏡像構建而來,那麼 Docker Host 只需在磁盤上保存一份 base 鏡像;同時內存中也只需加載一份 base 鏡像,就能夠爲全部容器服務了。並且鏡像的每一層均可以被共享。命令行

  若是多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,好比 /etc 下的文件,這時其餘容器的 /etc 是不會被修改的,修改只會被限制在單個容器內。這就是容器 Copy-on-Write 特性。

  

可寫的容器層

  

  當容器啓動時,一個新的可寫層被加載到鏡像的頂部。這一層一般被稱做「容器層」,「容器層」之下的都叫「鏡像層」。

  

  

  全部對容器的改動 - 不管添加、刪除、仍是修改文件都只會發生在容器層中。只有容器層是可寫的,容器層下面的全部鏡像層都是隻讀的

  鏡像層數量可能會不少,全部鏡像層會聯合在一塊兒組成一個統一的文件系統。若是不一樣層中有一個相同路徑的文件,好比 /a,上層的 /a 會覆蓋下層的 /a,也就是說用戶只能訪問到上層中的文件 /a。在容器層中,用戶看到的是一個疊加以後的文件系統。

文件操做 說明
添加文件 在容器中建立文件時,新文件被添加到容器層中。
讀取文件 在容器中讀取某個文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,當即將其複製到容器層,而後打開並讀入內存。
修改文件 在容器中修改已存在的文件時,Docker 會從上往下依次在各鏡像層中查找此文件。一旦找到,當即將其複製到容器層,而後修改之。
刪除文件 在容器中刪除文件時,Docker 也是從上往下依次在鏡像層中查找此文件。找到後,會在容器層中記錄下此刪除操做。(只是記錄刪除操做)

  只有當須要修改時才複製一份數據,這種特性被稱做 Copy-on-Write。可見,容器層保存的是鏡像變化的部分,不會對鏡像自己進行任何修改。

總結下來就是:容器層記錄對鏡像的修改,全部鏡像層都是隻讀的,不會被容器修改,因此鏡像能夠被多個容器共享。

  

Volume 數據卷

  

  實際上咱們的容器就好像是一個簡易版的操做系統,只不過系統中只安裝了咱們的程序運行所須要的環境,前邊說到咱們的容器是能夠刪除的,那若是刪除了,容器中的程序產生的須要持久化的數據怎麼辦呢?容器運行的時候咱們能夠進容器去查看,容器一旦刪除就什麼都沒有了。

  因此數據卷就是來解決這個問題的,是用來將數據持久化到咱們宿主機上,與容器間實現數據共享,簡單的說就是將宿主機的目錄映射到容器中的目錄,應用程序在容器中的目錄讀寫數據會同步到宿主機上,這樣容器產生的數據就能夠持久化了,好比咱們的數據庫容器,就能夠把數據存儲到咱們宿主機上的真實磁盤中。

  

Registry 註冊中心

  

  Docker 用 Registry 來保存用戶構建的鏡像。Registry 分爲公共和私有兩種。Docker 公司運營公共的 Registry 叫作 Docker Hub。用戶能夠在 Docker Hub 註冊帳號,分享並保存本身的鏡像。

  Docker 公司提供了公共的鏡像倉庫 https://hub.docker.com(Docker 稱之爲 Repository)提供了龐大的鏡像集合供使用。

  一個 Docker Registry 中能夠包含多個倉庫(Repository);每一個倉庫能夠包含多個標籤(Tag);每一個標籤對應一個鏡像。

  一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤對應該軟件的各個版本。咱們能夠經過 <倉庫名>:<標籤> 的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以 latest 做爲默認標籤。

  

總結

  Docker 官網寫着這樣一句話:Build and Ship any Application Anywhere,再結合剛纔咱們所理解的內容,總結下來就是:一次構建,處處運行。

  此外,Docker 公司提供了公共的鏡像倉庫 https://hub.docker.com(Docker 稱之爲 Repository),GitHub connect,自動構建鏡像,大大簡化了應用分發、部署、升級流程。加上 Docker 能夠很是方便的創建各類自定義的鏡像文件,這些都是 Docker 成爲最流行的容器技術的重要因素。

  經過以上這些技術的組合,最後的結果就是:絕大部分應用,開發者均可以經過 docker build 建立鏡像,經過 docker push 上傳鏡像,用戶經過 docker pull 下載鏡像,使用 docker run 運行容器應用。用戶再也不須要去關心如何搭建環境,如何安裝,如何解決不一樣發行版的庫衝突——並且一般不會消耗更多的硬件資源,不會明顯下降性能。

從下文開始,咱們就進入 Docker 實操部分,先從 Docker 的安裝及配置鏡像加速講起,而後再學習一些鏡像和容器最經常使用的命令。

本文采用 知識共享「署名-非商業性使用-禁止演繹 4.0 國際」許可協議

你們能夠經過 分類 查看更多關於 Docker 的文章。

  

🤗 您的點贊轉發是對我最大的支持。

📢 掃碼關注 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學習更輕鬆噢 ~

相關文章
相關標籤/搜索