初識Docker

此文章對Docker進行一個初步瞭解(能做到面試的被問Docker是個什麼鬼的時候能說出點道道出來)

  • 什麼是Docker
  1. Docker是一個對進程進行封裝隔離的一種操作系統層面的虛擬化技術,簡單的理解爲一個容器,進程可以隔離宿主以及其他被隔離的進程。但是Docker在容器的基礎之上,從文件系統、網絡互聯到進程隔離等進行了更進一步的封裝,簡化容器的創建和維護,更加輕盈便捷。
  2. 它與傳統的虛擬化方式相比,由於是在宿主內核上直接運行,放棄了容器自身的內核,不再進行硬件虛擬,不需要像傳統的虛擬技術那樣在運行一個完整的操作系統的基礎之上再去運行所需應用的進程。

  • 爲什麼要用Docker(Docker的優點)
  1. 更高效的利用系統資源:相比於虛擬技術,一個相同配置的主機可以運行數量更多的應用,執行速度、內存損耗和文件存儲速度都更加的高效。
  2. 更快的啓動時間:由於不需要啓動完整的操作系統的特性,啓動時間可以達到秒級乃至毫秒級
  3. 一致的運行環境:Docker提供除了內核以外的完整的運行環境,確保了應用運行環境的一致性,規避了因爲開發環境、測試環境、生產環境不一致導致的bug
  4. 持續交付和部署:開發人員可以通過Dockerfile進行鏡像構造,並且可以結合持續集成系統進行集成測試;運維人員可以直接在生產環境中快速部署該鏡像,乃至結合持續部署系統進行自動部署
  5. 更輕鬆的遷移:由於Docker確保了應用環境的一致性,導致Docker可以在各種平臺上運行,用戶可以很輕鬆的在一個平臺上遷移到另一個平臺上,並且不用擔心運行環境的變化導致的無法正常運行。
  6. 更輕鬆的維護和擴展:Docker使用分層存儲以及鏡像的技術,使得應用重複的部分複用更加的容易,運維更新也變得更加的簡單,進一步擴展鏡像也便的格外的容易,此外開源的Docker集合的各大團隊一起維護的高質量的官方鏡像也大大降低了應用服務鏡像製作的成本。

  • Docker的三個基本概念
  1. Docker鏡像:

Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資 源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境 變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。由於鏡像包含操作系統完整的 root 文件系統,其體積往往是龐大的,因此Docker設計爲分層存儲的架構,所以說此處的鏡像並非IOS文件,只是一個虛擬的概念,並非由一個文件組成,而是由一組文件系統組成,或者說由多層文件系統聯合組成。鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生 改變,後一層上的任何改變只發生在自己這一層。因此,在構建鏡像的時候,每一層儘量只包含該層需要添加的東西, 任何額外的東西應該在該層構建結束前清理掉

  1. Docker容器

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

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。容器內的進程是運行在一個隔離的環境裏,使用起來,就好像是在一個獨立於宿主的系統下操作一樣,因爲這種隔離的特性,很多人初學 Docker 時常常會把容器和虛擬機搞混。

與鏡像一樣,每一個容器運行時,是以鏡像爲基礎層,在其上創建一個當前容器的存儲層,我們可以稱這個爲容器運行時讀寫而準備的存儲層爲容器存儲層,因此容器同樣也是運用了分層存儲。並且容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此, 任何保存於容器存儲層的信息都會隨容器刪除而丟失。

按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲 層要保持無狀態化。所有的文件寫入操作,都應該使用數據卷(Volume)、或者 綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發 生讀寫,其性能和穩定性更高。數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。因此,使用數據卷 後,容器可以隨意刪除、重新 run ,數據卻不會丟失。

  1. Docker倉庫(Docker Registry

鏡像構建完成後,可以很容易的在當前宿主上運行,但是如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個鏡像。通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本。我們可以通過<倉庫名>:<標籤><標籤>(ubuntu:14.04) 的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以 latest 作爲默認標籤(ubuntu:latest)。倉庫名經常以兩段式路徑形式出現,比如 jwilder/nginx-proxy ,前者往往意味着 Docker Registry 多用戶環境下的用戶名,後者則往往是對應的軟件名。但這 並非絕對,取決於所使用的具體 Docker Registry 的軟件或服務。

Docker Registry 公開服務:Docker Registry 公開服務是開放給用戶使用、允許用戶管理鏡像的 Registry 服 務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務 供用戶管理私有鏡像。常用公開服務Docker Hub(默認Registry)、CoreOS 的 Quay.io。由於訪問限制,國內使用一些加速器:阿里雲加速器、DaoCloud 加速器、靈雀雲加速器等(此處僅作了解,後期繼續補充)。國內也有一些雲服務商提供類似於 Docker Hub 的公開服務。比如 時速雲鏡像倉 庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫等。

私有 Docker Registry:除了使用公開服務外,用戶還可以在本地搭建私有 Docker Registry。Docker 官方 提供了 Docker Registry 鏡像,可以直接使用做爲私有 Registry 服務。

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