1. 程式人生 > >Docker系列(一):Docker介紹

Docker系列(一):Docker介紹

Docker的定義:

       Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。       --摘自《百度百科》

       實際上,雖然介紹docker的書籍有很多,但鮮有給docker一個明確的定義,因為它很難概括成一個概念,而應該更多的被闡述它的特性和技術範疇。綜合一些網上的觀點,Docker就是虛擬化的一種輕量級替代技術。這種技術不依賴任何語言、框架或系統,可以將App變成一種標準化的、可移植的、自管理的元件,並脫離伺服器硬體在任何主流系統中開發、除錯和執行。

       簡單的說就是,在 Linux 系統上迅速建立一個容器(類似虛擬機器)並在容器上部署和執行應用程式,並通過配置檔案可以輕鬆實現應用程式的自動化安裝、部署和升級,非常方便。因為使用了容器,所以可以很方便的把生產環境和開發環境分開,互不影響,這是 docker 最普遍的一個玩法


Docker核心技術:

        Namespace是一種Linux核心技術,用來實現資源的隔離。資源,就是程序執行期間所看到的、使用的、依賴的周邊環境,資源有不同的種類,最典型的就是檔案系統、網路系統、程序PID、IPC資源等等。

        Namespaces名稱空間:

               PID    程序隔離

               NET   管理網路介面

               IPC    管理跨程序通訊的訪問 InterProcess Communication

               MNT  管理掛載點

               UTS   隔離核心和版本標識 Unix Timesharing System

        對於使用者態程序,通過Linux提供的系統呼叫來使用Namespace,這些系統呼叫包括:

               clone()      建立程序的時候,將其限制在某個Namespace中

               unshare()  使一個程序脫離某個Namespace

               setns()       使一個程序加入到某個Namespace

        

         CGroup最早叫做Process Container,由Google工程師在2006年提出,後在2007年更名為Control Groups,並被整合進Linux 2.6.24版核心。它用來對一組程序進行資源控制,包括如下功能:

         資源限制(Resource Limitation):對程序組使用的資源總額進行限制

         優先順序控制(Prioritization):通過為程序組分配CPU時間片數量從而控制了程序執行的優先順序

         資源統計(Accounting):統計系統的資源使用量,如CPU使用時長、記憶體用量等等

         程序控制(Control):對程序組執行掛起、恢復等操作    

         CGroup包括如下概念:

                任務(Task):一個Task就是Linux系統中的一個程序

                控制組(Control Group):資源控制的最小單位;資源限制、優先順序控制等等都定義在控制組上。一個任務可以加入某個控制組,也可以從一個控制組遷移到其他控制組。

                層級(Hierarchy):多個控制組形成樹狀的層次結構,叫做層級。

                子系統(Subsystem):一個子系統就是一種型別的資源控制器。子系統必須附加到一個層級上才能起作用。

                       cpu:控制task對cpu的使用

                       cpuacct:生成task對cpu資源使用情況的報告

                       cpuset:為task分配獨立的cpu

                       blkio:為塊裝置設定輸入/輸出限制

                       devices:開啟或關閉task對裝置的訪問

                       freezer:掛起或恢復task

                       memory:設定task對記憶體使用量的限定,並且自動生成這些task對記憶體資源使用情況的報告

                       perfevent:使得task可以進行統一的效能測試

                       net_cls:通過使用等級識別符(classid)標記網路資料包,從而允許Linux流量控制程式識別從具體cgroup中生成的資料包。


          AuFS是一個能透明覆蓋一或多個現有檔案系統的層狀檔案系統。 支援將不同目錄掛載到同一個虛擬檔案系統下,可以把不同的目錄聯合在一起,組成一個單一的目錄。這種是一種虛擬的檔案系統,檔案系統不用格式化,直接掛載即可。

          Docker一直在用AuFS作為容器的檔案系統。當一個程序需要修改一個檔案時, AuFS建立該檔案的一個副本。AuFS可以把多層合併成檔案系統的單層表示。這個過程稱為寫入複製( copy on write ) 。AuFS允許Docker把某些映象作為容器的基礎。例如,你可能有一個可以作為很多不同容器的基礎的CentOS系統映象。多虧AuFS,只要一個CentOS映象的副本就夠了,這樣既節省了儲存和記憶體,也保證更快速的容器部署。

          使用AuFS的另一個好處是Docker的版本容器映象能力。每個新版本都是一個與之前版本的簡單差異改動,有效地保持映象檔案最小化。但,這也意味著你總是要有一個記錄該容器從一個版本到另一個版本改動的審計跟蹤。


Docker相關的基本概念:

       Image:映象,容器(Container)時一個動態的概念,而映象時一個相對靜止的概念。映象其實就是容器中的檔案系統,也可以說是一個極度精簡的Linux程式執行環境。

       Container:容器,從根本形態上而言,容器(Container)其實就是執行在作業系統上的一個程序,只不過加入了對資源的隔離和限制。Docker Container是Image的例項化物件,共享作業系統核心。

       Daemon:

            Docker Daemon是建立和執行Container的Linux守護程序,也是Docker最主要的核心元件

            Docker Daemon 可以理解為Docker Container的Container

            Docker Daemon可以繫結本地埠並提供Rest API服務,用來遠端訪問和控制

       Registry:docker映象倉庫,當docker請求使用一個未在當前系統中的Image時,docker會從映象倉庫中尋找並將其下載到系統中,這個docker獲取Image的地方就是Registry。預設情況下,registry是指的docker官方的倉庫,也就是Docker Hub Registry (https://hub.docker.com  )。需要注意的是,Docker Hub是dotCloud公司私有的,目前國內只有一個DaoCloud提供代理快取服務。當然,docker也提供了搭建私有Registry的方法,這個會在後續篇章中說明。


Docker的三大基礎元件:

       倉庫Repository

       映象Image

       容器Container

       這三者之間的關係為:首先,docker Repository提供各種各樣已經打包好的docker應用,也就是映象Image;其次,使用者可以在Repository中搜索自己需要的映象Image,下載到本地;最後,使用者使用下載好的Image建立docker Container。


Docker容器的能力:

      檔案系統隔離:每個容器都有自己的root檔案系統

      程序隔離:每個容器都執行在自己的程序環境中

      網路隔離:容器間的虛擬網路介面和IP地址都是分開的

      資源隔離和分組: 使用cgroups將CPU和記憶體之類的資源獨立分配給每個Docker容器


Docker的使用場景:

      1、使用Docker容器開發、測試、部署服務

      2、建立隔離的執行環境

      3、搭建測試環境

      4、構建多使用者的平臺即服務(PaaS)基礎設施

      5、提供軟體即服務(SaaS)應用程式

      6、高效能、超大規模的宿主機部署