最核心的是 Docker Daemon咱們稱之爲Docker守護進程,也就是Server端,Server端能夠部署在遠程,也能夠部署在本地,由於Server端與客戶端(Docker Client)是經過Rest API進行通訊。
docker CLI 實現容器和鏡像的管理,爲用戶提供統一的操做界面,這個 客戶端提供一個只讀的鏡像,而後經過鏡像能夠建立一個或者多個容器(container),這些容器能夠只是一個RFS(Root File System),也能夠是一個包含了用戶應用的RFS。容器在docker Client中只是一個進程,兩個進程是互不可見的。docker
Docker使用C/S架構,Client 經過接口與Server進程通訊實現容器的構建,運行和發佈。client和server能夠運行在同一臺集羣,也能夠經過跨主機實現遠程通訊。安全
Docker三大核心概念服務器
Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。網絡
Docker 利用容器(Container)來運行應用。容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。架構
倉庫是集中存放鏡像文件的場所,倉庫註冊服務器(Registry)上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。目前,最大的公開倉庫是DockerHub,存放了數量龐大的鏡像供用戶下載。
Docker倉庫用來保存咱們的images,當咱們建立了本身的image以後咱們就可使用push命令將它上傳到公有或者私有倉庫,這樣下次要在另一臺機器上使用這個image時候,只須要從倉庫上pull下來就能夠了。
Docker的運行離不開這幾位的支持,Docker的成功也是拜幾位所賜。也有人會誤覺得,Docker就是容器。但Docker只會傲嬌地說:我不是容器,我是管理容器的引擎。工具
Docker是由Cgroup、NameSpace、rootfs和容器引擎(用戶態工具)組成。性能
Cgroup是Control group的簡寫,屬於Linux內核的一個特性,用於限制和隔離一組進程對系統資源的使用,也就是作資源QOS,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免多個容器同時運行時對宿主機系統的資源競爭。控制組能夠提供對容器的內存、CPU、磁盤IO等資源進行限制和計費管理。控制組的設計目標是爲不一樣的應用狀況提供統一的接口,從控制單一進程(好比nice工具)到系統級虛擬化(包括OpenVZ、Linux-VServer、LXC等)。從實現的角度來看,Cgroup中實現的子系統其做用以下:測試
從而可見Cgroup主要的做用是如下幾點。操作系統
NameSpace是將內核的全局資源作封裝,使得每一個NameSpace都有一份獨立的資源,所以不一樣的進程在各自的NameSpace內對同一種資源的使用不會互相干擾。目前Linux內核公共實現了6種NameSpace:設計
Linux 的命名空間機制提供了七種不一樣的命名空間,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS,經過這七個選項咱們能在建立新的進程時設置新進程應該在哪些資源上與宿主機器進行隔離。
掛載在容器根目錄上、用來爲容器進程提供隔離後執行環境的文件系統,就是所謂的「容器鏡像」;一個最多見的rootfs,或者說容器鏡像,會包括以下所示的一些目錄和文件,好比/bin /etc/ proc等等。對Docker項目來說,最核心的管理是爲等待建立的用戶進程:
這樣一個完整的容器就誕生了。須要明確的是rootfs只是一個操做系統所包含的文件、配置和目錄,並不包括操做系統的內核(bootfs包含了BootLoader和Kernel), 在Linux操做系統中,這兩部分是分開存放的,操做系統只有在開機啓動
時纔會加載指定版本的內核。
因此說,rootfs 只包括了操做系統的「軀殼」,並無包括操做系統的「靈魂」。