Docker技術簡介

1、Docker引擎

         最核心的是 Docker Daemon咱們稱之爲Docker守護進程,也就是Server端,Server端能夠部署在遠程,也能夠部署在本地,由於Server端與客戶端(Docker Client)是經過Rest API進行通訊。
        docker CLI 實現容器和鏡像的管理,爲用戶提供統一的操做界面,這個 客戶端提供一個只讀的鏡像,而後經過鏡像能夠建立一個或者多個容器(container),這些容器能夠只是一個RFS(Root File System),也能夠是一個包含了用戶應用的RFS。容器在docker Client中只是一個進程,兩個進程是互不可見的。
docker



2、Docker架構

image         Docker使用C/S架構,Client 經過接口與Server進程通訊實現容器的構建,運行和發佈。client和server能夠運行在同一臺集羣,也能夠經過跨主機實現遠程通訊。安全

Docker三大核心概念服務器

  • 鏡像(image):
  •         Docker 鏡像(Image)就是一個只讀的模板。例如:一個鏡像能夠包含一個完整的操做系統環境,裏面僅安裝了 Apache 或用戶須要的其它應用程序。鏡像能夠用來建立 Docker 容器,一個鏡像能夠建立不少容器。Docker 提供了一個很簡單的機制來建立鏡像或者更新現有的鏡像,用戶甚至能夠直接從其餘人那裏下載一個已經作好的鏡像來直接使用。網絡

  • 容器(container):
  •          Docker 利用容器(Container)來運行應用。容器是從鏡像建立的運行實例。它能夠被啓動、開始、中止、刪除。每一個容器都是相互隔離的、保證安全的平臺。能夠把容器看作是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。架構

  • 倉庫(repository):
  •          倉庫是集中存放鏡像文件的場所,倉庫註冊服務器(Registry)上每每存放着多個倉庫,每一個倉庫中又包含了多個鏡像,每一個鏡像有不一樣的標籤(tag)。目前,最大的公開倉庫是DockerHub,存放了數量龐大的鏡像供用戶下載。
              Docker倉庫用來保存咱們的images,當咱們建立了本身的image以後咱們就可使用push命令將它上傳到公有或者私有倉庫,這樣下次要在另一臺機器上使用這個image時候,只須要從倉庫上pull下來就能夠了。
              Docker的運行離不開這幾位的支持,Docker的成功也是拜幾位所賜。也有人會誤覺得,Docker就是容器。但Docker只會傲嬌地說:我不是容器,我是管理容器的引擎。
    工具

    3、Docker組成

    Docker是由Cgroup、NameSpace、rootfs和容器引擎(用戶態工具)組成。性能

    docker-core-techs

    3.一、Cgroup

           Cgroup是Control group的簡寫,屬於Linux內核的一個特性,用於限制和隔離一組進程對系統資源的使用,也就是作資源QOS,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免多個容器同時運行時對宿主機系統的資源競爭。控制組能夠提供對容器的內存、CPU、磁盤IO等資源進行限制和計費管理。控制組的設計目標是爲不一樣的應用狀況提供統一的接口,從控制單一進程(好比nice工具)到系統級虛擬化(包括OpenVZ、Linux-VServer、LXC等)。從實現的角度來看,Cgroup中實現的子系統其做用以下:測試

    • devices:設備權限控制
    • cpuset:分配指定的cpu和內存節點
    • cpu:控制cpu的佔用率
    • cpuacct:統計cpu的使用狀況
    • memory:限制內存的使用上限
    • freezer:凍結(暫停)Cgroup中的進程
    • net_cls:配合tc(traffic controller)限制網絡帶寬
    • net_prio:設置進程的網絡流量優先級
    • huge_tlb:限制HugeTLB的使用
    • perf_event:容許Perf工具基於Cgroup分組作性能測試

            從而可見Cgroup主要的做用是如下幾點。操作系統

    1. 資源限制(Resource limiting):能夠將組設置爲不超過設定的內存限制。好比:內存子系統能夠爲進程組設定一個內存使用上限,一旦進程組使用的內存達到限額再申請內存,就會出發Out of Memory警告。
    2. 優先級(Prioritization):經過優先級讓一些組優先獲得更多的CPU等資源。
    3. 資源審計(Accounting):用來統計系統實際上把多少資源用到適合的目的上,可使用cpuacct子系統記錄某個進程組使用的CPU時間。
    4. 隔離(isolation):爲組隔離命名空間,這樣一個組不會看到另外一個組的進程、網絡鏈接和文件系統。
    5. 控制(Control):掛起、恢復和重啓動等操做。

    3.二、NameSpace

            NameSpace是將內核的全局資源作封裝,使得每一個NameSpace都有一份獨立的資源,所以不一樣的進程在各自的NameSpace內對同一種資源的使用不會互相干擾。目前Linux內核公共實現了6種NameSpace:設計

    • IPC:隔離進程間通訊(System V IPC和POSIX消息隊列):
    • Network:隔離網絡資源
    • Mount:隔離文件系統掛載點
    • PID:隔離進程ID
    • UTS:隔離主機名和域名
    • User:隔離用戶ID和組ID

          Linux 的命名空間機制提供了七種不一樣的命名空間,包括 CLONE_NEWCGROUP、CLONE_NEWIPC、CLONE_NEWNET、CLONE_NEWNS、CLONE_NEWPID、CLONE_NEWUSER 和 CLONE_NEWUTS,經過這七個選項咱們能在建立新的進程時設置新進程應該在哪些資源上與宿主機器進行隔離。

    3.三、rootfs

            掛載在容器根目錄上、用來爲容器進程提供隔離後執行環境的文件系統,就是所謂的「容器鏡像」;一個最多見的rootfs,或者說容器鏡像,會包括以下所示的一些目錄和文件,好比/bin /etc/ proc等等。對Docker項目來說,最核心的管理是爲等待建立的用戶進程:

    • 啓用Linux NameSpace隔離配置;
    • 設置指定的Cgroup限制參數;
    • 切換進程的根目錄(Change Root)

            這樣一個完整的容器就誕生了。須要明確的是rootfs只是一個操做系統所包含的文件、配置和目錄,並不包括操做系統的內核(bootfs包含了BootLoader和Kernel), 在Linux操做系統中,這兩部分是分開存放的,操做系統只有在開機啓動

    時纔會加載指定版本的內核。

            因此說,rootfs 只包括了操做系統的「軀殼」,並無包括操做系統的「靈魂」。

    4、Docker容器的能力

    • 文件系統隔離:每一個容器都有本身的root文件系統;
    • 進程隔離:每一個容器都運行在本身的進程環境中;
    • 網絡隔離:容器間的虛擬網絡接口和IP地址都是分開的;
    • 資源隔離和分組:使用cgroups將CPU和內存之類的資源獨立分配給每一個Docker容器;
    相關文章
    相關標籤/搜索