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、高性能、超大規模的宿主機部署

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