玩轉Docker基礎知識

Docker是一個開源的應用容器引擎,基於Go語言並遵從Apache2.0協議開源。Docker可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口(類似iPhone的App),更重要的是容器性能開銷極低

Docker讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,便可以實現虛擬化。Docker改變了虛擬化的方式,使開發者可以直接將自己的成果放入Docker中進行管理。方便快捷已經是Docker的最大優勢,過去需要用數天乃至數週的 任務,在Docker容器的處理下,只需要數秒就能完成

作爲一種輕量級的虛擬化方式,Docker在運行應用上跟傳統的虛擬機方式相比具有顯著優勢:Docker容器很快,啓動和停止可以在秒級實現,這相比傳統的虛擬機方式要快得多。

Docker容器對系統資源需求很少,一臺主機上可以同時運行數千個Docker容器。

Docker通過類似Git的操作來方便用戶獲取、分發和更新應用鏡像,指令簡明,學習成本較低。

Docker通過Dockerfile配置文件來支持靈活的自動化創建和部署機制,提高工作效率。

Docker容器除了運行其中的應用之外,基本不消耗額外的系統資源,保證應用性能的同時,儘量減小系統開銷。

Docker利用Linux系統上的多種防護機制實現了嚴格可靠的隔離。從1.3版本開始,Docker引入了安全選項和鏡像簽名機制,極大地提高了使用Docker的安全性

容器虛擬化的是操作系統而不是硬件,容器之間是共享同一套操作系統資源的。虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操作系統。因此容器的隔離級別會稍低一些

Docker使用客戶端-服務器(C/S)架構模式,使用遠程API來管理和創建Docker容器。

Docker容器通過Docker鏡像來創建。容器與鏡像的關係類似於面向對象編程中的對象與類

Docker組件

  • Docker Client客戶端——>向Docker服務器進程發起請求,如:創建、停止、銷燬容器等操作

  • Docker Server服務器進程—–>處理所有Docker的請求,管理所有容器

  • Docker Registry鏡像倉庫——>鏡像存放的中央倉庫,可看作是存放二進制的scm

Docker技術的基礎

  • Namespace,容器隔離的基礎,保證A容器看不到B容器,6個名空間:User、Mnt、Network、UTS、IPC、Pid

  • CGroups,容器資源統計和隔離。主要用到的CGroups子系統:CPU、blkio、Device、freezer、memory

  • UnionFS,典型:AUFS/OverlayFS,分層鏡像實現的基礎

Docker包括三個基本概念:

  • 鏡像(Image)

  • 容器(Container)

  • 倉庫(Repository)

鏡像(Image)——一個特殊的文件系統

操作系統分爲內核和用戶空間。對於Linux而言,內核啓動後,會掛載root文件系統爲其提供用戶空間支持。而Docker鏡像(Image),就相當於是一個root文件系統。

Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。 鏡像不包含任何動態數據,其內容在構建之後也不會被改變。

Docker設計時,就充分利用Union FS的技術,將其設計爲分層存儲的架構。 鏡像實際是由多層文件系統聯合組成。

鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在自己這一層。比如,刪除前一層文件的操作,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,但是實際上該文件會一直跟隨鏡像。因此,在構建鏡像的時候,需要額外小心,每一層儘量只包含該層需要添加的東西,任何額外的東西應該在該層構建結束前清理掉。

分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至可以用之前構建好的鏡像作爲基礎層,然後進一步添加新的層,以定製自己所需的內容,構建新的鏡像

容器(Container)——鏡像運行時的實體

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

容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。

容器存儲層的生存週期和容器一樣,容器消亡時,容器存儲層也隨之消亡。因此,任何保存於容器存儲層的信息都會隨容器刪除而丟失。

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

倉庫(Repository)——集中存放鏡像文件的地方

鏡像構建完成後,可以很容易的在當前宿主上運行,但是, 如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。

一個Docker Registry中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個鏡像。所以說:鏡像倉庫是Docker用來集中存放鏡像文件的地方類似於我們之前常用的代碼倉庫。

通常,一個倉庫會包含同一個軟件不同版本的鏡像,而標籤就常用於對應該軟件的各個版本 。我們可以通過<倉庫名>:<標籤>的格式來指定具體是這個軟件哪個版本的鏡像。如果不給出標籤,將以latest作爲默認標籤。

這裏補充一下Docker Registry公開服務和私有Docker Registry的概念:

Docker Registry公開服務是開放給用戶使用、允許用戶管理鏡像的Registry服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

最常使用的Registry公開服務是官方的Docker Hub ,這也是默認的Registry,並擁有大量的高質量的官方鏡像,網址爲:hub.docker.com/ 。在國內訪問Docker Hub可能會比較慢國內也有一些雲服務商提供類似於Docker Hub的公開服務。

除了使用公開服務外,用戶還可以在本地搭建私有Docker Registry 。Docker官方提供了Docker Registry鏡像,可以直接使用做爲私有Registry服務。開源的Docker Registry鏡像只提供了Docker Registry API的服務端實現,足以支持Docker命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能

  • Build(構建鏡像):鏡像就像是集裝箱包括文件以及運行環境等等資源。

  • Ship(運輸鏡像):主機和倉庫間運輸,這裏的倉庫就像是超級碼頭一樣。

  • Run (運行鏡像):運行的鏡像就是一個容器,容器就是運行程序的地方。

Docker運行過程也就是去倉庫把鏡像拉到本地,然後用一條命令把鏡像運行起來變成容器

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