Docker入門實踐(五) 理解Docker三大組件的工作機制

本文已遷移到我的新博客地址,歡迎訪問:

blog.favorstack.io


#(一)Docker鏡像是如何工作的

我們知道,Docker鏡像是Docker容器運行的靜態模板。每個鏡像都包含一系列的層,Docker使用一種叫做聯合文件系統union file systemsunionFS)的東西來將這些層組合爲單個鏡像。unionFS允許單獨的文件系統中的文件和文件夾以分支的形式出現,可以被透明地覆蓋,最終形成一個連續的文件系統。

Docker如此輕量的原因之一就是因爲這些層。當你修改一個鏡像時,比如將應用程序更新到一個新版本時,就構建了一個新的層。因此,只有這一層被添加或修改,而不是像操作虛擬機時,替換整個鏡像或整個的重構一遍。現在,你無需分發整個鏡像,只需要更新一下就可以了,讓分發Docker鏡像變得更快更簡單。

每個鏡像都開始於一個基礎鏡像,比如我們之前用過的ubuntu:16.04鏡像,我們也可以自己製作一個基礎鏡像,以供新的鏡像使用。比如我們製作的baseos:1.0,以及jre:7u80等,這些鏡像可以用於我們所有的Java應用的基礎鏡像。

接下來,Docker鏡像就可以通過一系列簡單的,描述性的步驟從這些基礎鏡像構建,這些步驟被稱爲指令。每條指令在我們的鏡像中會創建一個新的層,指令一般包括這些行爲:

  • 運行一個命令
  • 添加一些文件或文件夾
  • 創建環境變量
  • 從該鏡像啓動一個容器時,運行哪個程序。

這些指令放在一個名爲Dockerfile的文本文件中,Dockerfile包含了從基礎鏡像構建一個鏡像的一系列指令和命令。當你請求構建一個鏡像時,Docker讀取該Dockerfile文件,執行裏面的指令,並生成一個最終的鏡像。

#(二)Docker registry是如何工作的

Docker registry是託管Docker鏡像的地方,當我們構建完一個鏡像時,可以選擇推送到像Docker Hub這樣的公共倉庫,或者也可以推送到自己的私有倉庫中。

通過Docker 客戶端,我們可以搜索那些已經發布的鏡像,並將他們拉取到Docker主機,然後用於構建容器。

Docker Hub既提供公共倉庫,也提供私有倉庫,用來存儲鏡像。公共倉庫是可以檢索的,並且可以被任何人下載,但私有倉庫裏的鏡像不會出現在搜索結果中,只有你和你的用戶纔可以拉取這些鏡像,並用於構建容器。

#(三)Docker容器是如何工作的

容器包含有一個操作系統,用戶添加的文件,和元數據等。我們之前已經看到,每個容器都是從一個鏡像創建而來,該鏡像告訴Docker一個容器需要託管什麼東西,容器運行時該執行什麼進程,還有一系列其他的配置數據。Docker鏡像是隻讀的,當Docker從一個鏡像運行一個容器時,會在鏡像之上添加一層可讀寫的層(使用之前提到的unionFS),然後我們的應用就可以在上邊運行了。

#(四)運行一個容器時,發生了哪些事情

不管是使用docker可執行二進制文件還是通過API,Docker客戶端告訴Docker守護進程來運行一個容器。

$ docker run -it ubuntu:16.04 /bin/bash

Docker 引擎客戶端通過docker二進制文件和run子命令創建了一個容器。Docker客戶端需要提供給Docker守護進程來創建一個容器的信息至少包括以下兩點:

  • 容器從哪個鏡像創建,比如ubuntu:16.04
  • 容器創建後,容器內要運行的命令,比如/bin/bash

那麼,運行這條命令時,底層都發生了什麼呢?
按照順序,Docker引擎做了這些:

  • 拉取ubuntu:16.04鏡像: Docker引擎首先會檢查該鏡像在本地是否存在,如果存在,直接用它創建容器。如果不存在,會先去Docker Hub拉取。
  • 創建一個新的容器
  • **分配一個文件系統並將其掛載爲一個可讀寫層:**在文件系統中創建容器,一個可讀寫層添加到鏡像上。
  • **分配網卡/網橋:**創建一個網卡,讓容器可以和主機通信。
  • **分配一個IP地址:**從IP池中查找並分配一個可用的IP。
  • 執行你指定的進程
  • **捕獲並提供應用的輸出:**連接並記錄應用的標準輸入、輸出,和錯誤輸出。

現在,我們便有了一個運行中的容器了。接下來我們可以管理我們的容器,與其中的應用程序進行交互,當運行完畢,還可以停掉容器,並將其刪除。

參考:https://docs.docker.com/engine/understanding-docker/

(完)


本文已遷移到我的新博客地址,歡迎訪問:

blog.favorstack.io


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章