認識Docker

一、Docker是什麼?
  Docker最初是由dotCloud公司的創始人Solomon Hykes在法國期間發起的一個公司內部項目,它是基於dotCloud公司多年雲服務技術的一次革新,並於2013年3月以Apache 2.0授權協議開源,主要項目代碼在GitHub上進行維護。Docker項目後來還加入了了Linux基金會,併成立了推動開放容器聯盟(OCI)。
  Docker是一個開放源代碼的軟件項目,可以讓應用程序部署在軟件容器下的工作可以自動化的進行,藉此在Linux操作系統上,提供了一個額外的軟件抽象層以及操作系統層虛擬化的自動管理機制。Docker利用Linux核心中的資源分脫機制,例如(cgroup控制組,以及Namespace核心名稱空間來獨立的創建和限制軟件容器的資源)。
  Docker是世界領先的軟件容器平臺。開發人員可以利用Docker來消除協作編碼時"在我機器上可以正常工作運行"的問題。運維人員可以利用Docker在隔離容器中並行運行和管理應用,獲得更好的計算密度。企業利用Docker可以構建敏捷的軟件交付管道,以更快的速度、更高的安全性和可靠的信譽爲Linux和Windows Server應用發佈新的功能。
  Docker屬於Linux容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的Linux容器解決方案。Docker講應用程序與該程序的依賴打包在一個文件裏,可以實現一次創建到處運行;運行這個文件,就會生成一個虛擬容器。程序在這個虛擬容器裏運行,就好像在真實的物理機上運行一樣。有了Docker,就不用再擔心環境問題了。
  總體來說,Docker的接口相當的簡單,用戶可以方便的創建和使用容器,把自己的應用放入容器。容器還可以進行版本管理、複製、分享、修改等操作,就想管理普通的代碼一樣便利。

二、Docker的優點
  Docker極大的解決了環境配置的問題,真正的實現了"一次配置,到處運行"的效果。Docker在開發和運維的過程中,具有以下幾個方面的優勢:
  1)更高效的資源利用。使用Docker容器不再需要額外的虛擬化管理程序(Virtual Machine Manager,VMM,以及Hypervisor)的支持,因爲Docker它是內核級層面的虛擬化,可以實現更高的性能,同時對資源的額外需求很低。
  2)更快速的交付和部署。使用Docker,開發人員可以使用鏡像來快速構建一套標準的開發環境;開發完成之後,測試人員和運維人員可以直接使用完全相同的環境來部署代碼。
  3)更輕鬆的遷移和擴展。Docker容器幾乎可以在任意平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等,同時支持主流的操作系統髮型版本。
  4)更簡單的更新管理。創建Dockerfile文件,只需要根據Dockerfile的指令來基於基礎鏡像根據應用需求來修改和配置自己所需要的鏡像,就可以替代以往大量的更新工作。並且所有的修改都以增量的方式被髮布和更新出來,從而實現自動化並且高效的同期管理。

在這裏插入圖片描述

三、Docker VS VM
  作爲一種輕量級的虛擬化方式,Docker在運行應用上與傳統的虛擬機方式相比較具有以下顯著的優勢:
  1)Docker容器具有快速性,容器的創建、啓動、停止、銷燬都可以在秒級別實現,而傳統的虛擬機方式需要數分鐘才能完成;
  2)Docker容器對系統主機的資源佔用很少,一臺主機上可以同時運行數千個Docker容器;
  3)Docker通過類似於Git設計的理念的操作方便用戶的獲取、分發和更新應用鏡像,存儲複用,增量更新;
  4)Docker通過Dockerfile支持靈活的自動化創建和部署機制,提供工作效率,使流程標準化。

在這裏插入圖片描述

四、Docker的架構與工作機制
Docker Engine是一個CS架構,主要有以下兩個概念:
  1)Docker daemon:Docker的守護進程,運行在宿主機上,用戶通過Docker Client(Docker命令)與Docker daemon進程交互。
  2)Docker Client:Docker的命令行工具,是用戶使用Docker的主要方式,Docker Client與Docker daemon通信並將結果返回給用戶,Docker Client也可以通過socket或者RESTful API來訪問遠程的Docker daemon進程。

在這裏插入圖片描述

瞭解了Docker的基本組成之後,再來了解一下Docker的核心概念:
  1)Docker Image:Docker鏡像類似於虛擬機的鏡像,可以將它理解爲是一個只讀模板,鏡像自身是隻讀的,容器從鏡像啓動的時候,會在鏡像的最上層創建一個可寫層。例如,一個鏡像可以包含一個基本的操作系統環境,裏面僅包含了Apache應用程序。鏡像用來創建Container容器,一個鏡像可以運行多個Container容器;鏡像可以通過Dockerfile來創建,也可以從Docker Hub/Registry上去下載。在面向對象編程中鏡像可以理解爲是一個了類。
  2)Docker Container:Docker類似於一個輕量級的沙箱,Docker利用容器來運行和隔離應用。容器是從鏡像創建的應用運行的實例,容器是一個隔離的環境,多個容器之間不會互相影響,保證容器中的程序運行在一個相對安全的環境中。(可以把容器看做是一個簡易版的Linux系統環境,包括root用戶權限、進程空間、用戶空間和網絡空間等,以及運行在其中的應用程序打包而成的盒子),在面向對象編程中容器可以理解爲一個實例。
  3)Docker Hub/Registry:共享和管理Docker鏡像,用戶可以上傳和下載上面的公共鏡像到本地。

在這裏插入圖片描述

五、Docker底層的技術依賴
  Docker是使用Go語言編寫的,它利用了Linux內核的幾個核心技術來提供其功能。
  1)Namespaces名稱空間
    Docker使用一種稱爲namespaces提供隔離工作空間的技術,這種技術稱爲容器,當你運行容器時,Docker會爲改容器創建一組namespaces名稱空間。這些名稱空間提供了一層隔離。容器的每個方面都在單獨的名稱空間中運行,其訪問權限只能是限於該名稱空間。
    Linux內核所提供的主要名稱空間有:MountNamespaces:文件系統掛載點,每個容器能看到不同的文件系統層次結構。UTSNamespaces:nodename和domainname,每個容器可以有自己的hostname和domainame。IPCNamespaces:特定的進程間通信資源,包括System V IPC和POSIX message queues,每個容器都有其自己的System V IPC和POSIX消息隊列文件系統,因此,只有在同一個IPC namespaces的進程之間的才能互相通信。PID namespaces:進程ID數字空間,每個PID namespace中的進程可以有其獨立的PID,每個容器都有其PID爲1的root進程,這也使得容器可以在不同的主機之間遷移,因爲namespace中的進程ID和主機無關,所以容器中的每個進程都有兩個PID:容器中的PID和host主機上的PID。Networknamespace:網絡相關的系統資源,每個容器用有其獨立的網絡設備,IP地址,IP路由表,/porc/net目錄,端口號等等,這也使得一個host上多個容器內的同一個應用都可以綁定到各自容器的80端口上。Usernamespaces:用戶和組ID空間,在user namespaces中的進程和組ID可以和host主機上不同,每個容器可以有不同的user和group id;一個host上的非特權用戶可以成爲user namespace中的特權用戶。

2)Control groups
    Linux上的Docker Engine還依賴於另一種稱爲控制組(cgroups)的技術。cgroup將應用程序限制爲特定的一組資源。控制組允許Docker Engine將可用的硬件資源共享給容器,並可以選擇強制執行限制和約束。例如,您可以限制容器的可用內存爲多大。(用來分配資源,優先級設定、資源計量、資源控制)

3)Union file systems
    聯合文件系統或UnionFS是通過創建層來操作的文件系統,使它們非常輕量和快速。Docker Engine使用UnionFS爲容器提供構建塊。Docker Engine可以使用多種UnionFS變體,包括AUFS,btrfs,vfs和DeviceMapper。

4)Container format
    Docker Engine將命名空間,控制組和UnionFS組合到一個稱爲容器格式的包裝器中。默認的容器格式是libcontainer。將來,Docker可以通過與BSD Jails或Solaris Zones等技術集成來支持其他容器格式。

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