Docker(一)--基本概念

1.docker簡介

1.1 雲計算簡介

什麼是雲計算:

       雲計算是一種資源的服務模式,該模式可以實現隨時隨地、便捷按需地從可配置計算資源共享池中獲取所需的資源(如網絡、服務器、存儲、應用及服務),資源能夠快速供應並釋放,大大減少了資源管理工作開銷,你甚至可以再也不用理會那些令人頭痛的傳統服務供應商了。
       隨着雲計算的興起,像"cloud-native"和"cattle not pets"之類的術語行話也紛紛出現,它們都表達了一個意思,那就是整個和雲計算相關的IT領域都需要徹底改變現有的意識形態,不能再像過去一樣看待基礎設施組件,因爲在雲計算模式下,基礎設施已經不再是一個既龐大又昂貴,而且專業的令人難以企及的怪物,它不再需要繁瑣的手動維護,也不再難以改換。

雲計算經典架構:

在這裏插入圖片描述
IaaS(Infrastructure as a Service 基礎設施即服務):IaaS層爲基礎設施運維人員服務,提供計算、存儲、網絡及其他基礎資源,雲平臺使用者可以在上面部署和運行包括操作系統和應用程序在內的任意軟件,無需再爲基礎設施的管理而分心。
PaaS(Platform as a Service 平臺即服務):PaaS層爲應用開發人員服務,提供支持應用運行所需的軟件運行時環境、相關工具與服務,如數據庫服務、日誌服務、監控服務等,讓應用開發者可以專注於核心業務的開發。
SaaS(Software as a Service 軟件即服務):SaaS層爲一般用戶服務,提供了一套完整可用的軟件系統,讓一般用戶無需關注技術細節,只需通過瀏覽器、應用客戶端等方式就能使用部署在雲上的應用服務。

1.2 虛擬化技術分類

硬件級虛擬化(hardware-level-virtualization):硬件級虛擬化是運行在硬件之上的虛擬化技術,也可稱爲主機級虛擬化技術,它的管理軟件也就是我們通常說的 hypervisor 或者 virtual machine monitor,它需要模擬的就是一個完整的操作系統,也就是我們通常所說的 Hyper-V 的虛擬化技術,VMWare,Xen,VirtualBox,AWS EC2 和阿里雲ECS都是用的這種技術。
操作系統級虛擬化(os-level-virtualization):操作系統級虛擬化是運行在操作系統之上的,它模擬的是運行在操作系統上的多個不同進程,並將其封裝在一個密閉的容器裏面,也稱爲容器化技術。Docker 正是容器虛擬化中目前最流行的一種實現。

1.3 什麼是docker

       根據官方的定義,Docker是以Docker容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員設計的,用於構建、發佈和運行分佈式應用的平臺。它是一個跨平臺、可移植並且簡單易用的容器解決方案。Docker的源代碼託管在GitHub上,基於Go語言開發並遵從Apache 2.0協議。Docker可在同期內部快速自動化地部署應用,並通過操作系統內核技術(namespaces、cgroups等)爲容器提供資源隔離與安全保障。
       最初,Linux容器技術是基於LXC(LinuX Container)的,Docker在易用性和穩定性方面做了很大改善,其三大核心功能就是CGroups、Namespaces 和 UnionFS。CGroups 技術同來限定一個進程的資源使用;在一個操作系統之上,用戶ID、機器名等資源是全局的,運行的進程間都是訪問同一份資源,爲了達到隔離的目的,Linux又出現了Namespace技術用來劃分不同的命名空間;而UnionFS則是用來處理分層鏡像的功能。
:LXC是Docker早期使用的技術,後來Docker自行開發了libcontainer容器引擎,現最新版本容器引擎爲runC,三者都是對Linux內核功能的封裝。

1.4 docker解決的問題

       可以看出,容器技術的生態系統自下而上分別覆蓋了 IaaS層和 PaaS層所涉及的各類問題,包括資源調度、編排、部署、監控、配置管理、存儲網絡管理、安全、容器化應用支撐平臺等。除了基於容器技術解決構建分佈式平臺無法迴避的經典問題,容器技術主要帶來了一下幾點好處。

  • 持續部署與測試: 容器消除了線上線下的環境差異,保證了應用生命週期的環境一致性和標準化。開發人員使用鏡像實現標準開發環境的構建,開發完成後通過封裝着完整環境和應用的鏡像進行遷移,由此,測試和運維人員可以直接部署軟件鏡像來進行測試和發佈,大大簡化了持續集成、測試和發佈的過程。
  • 跨雲平臺支持: 容器帶來的最大的好處之一就是其適配性,越來越多的雲平臺都支持容器,用戶再也無需擔心受到雲平臺的捆綁,同時也讓應用多平臺混合部署成爲可能。目前支持容器的IaaS雲平臺包括但不限於亞馬遜平臺(AWS)、Google雲平臺(GCP)、微軟雲平臺(Azure)、OpenStack等,還包括如Chef、Puppet、Ansible等配置管理工具。
    在這裏插入圖片描述
  • 環境標準化和版本控制: 基於容器提供的環境一致性和標準化,你可以使用Git等工具對容器鏡像進行版本控制,相比基於代碼的版本控制來說,你還能夠對整個應用運行環境實現版本控制,一旦出現故障可以快速回滾。相比以前的虛擬機鏡像,容器壓縮和備份速度更快,鏡像啓動也像啓動一個普通進程一樣快速。
  • 高資源利用率與隔離: 容器沒有管理程序的額外開銷,與底層共享操作系統,性能更加優良,系統負載更低,在同等條件下可以運行更多的應用實例,可以更充分地利用系統資源。同時,容器擁有不錯的資源隔離與限制能力,可以精確地對應用分配CPU、內存等資源,確保了應用間不會相互影響。
  • 容器跨平臺性與鏡像: Linux容器雖然早在Linux2.6版本內核已經存在,但是缺少容器的跨平臺性,難以推廣。容器在原有Linux容器的基礎上進行大膽革新,爲容器設定了一整套標準化的配製方法,將應用及其依賴的運行環境打包成鏡像,真正實現了"構建一次,到處運行" 的理念,大大提高了容器的跨平臺性。
  • 提高安全性: Docker會保護我們在容器內運行的軟件。軟件程序可能會有各種各樣的情況,出現錯誤或帶來安全風險: 如程序可能是由攻擊者編寫的、好心的開發人員也會編寫出有害的錯誤程序、程序可能會意外地由於輸入處理的故障,被攻擊者利用。無論何種方式,運行軟件都將給計算機帶來安全威脅。由於運行軟件是擁有計算機的主旨,應謹慎地應用實際的降險措施。像物理的牢房,容器裏的任何東西都只能訪問在它內部的東西。此規則有例外,但僅在用戶顯示創建時,容器限制了一個程序對其他程序帶來的影響範圍、可訪問的數據和系統資源的影響範圍。
    在這裏插入圖片描述
  • 易於理解且易用: Docker的英文原意是處理集裝箱的碼頭工人,標誌是鯨魚運送一大堆集裝箱,集裝箱就是容器,生動好記,易於理解。一個開發者可以在15分鐘之內入門Docker並進行安裝和部署,這是容器使用史上的一次飛躍。因爲它的易用性,有更多的人開始關注容器技術,加速了容器標準化的步伐。
  • 應用鏡像倉庫: Docker官方構建了一個鏡像倉庫,組織和管理形式類似於GitHub,其上已積累了成千上萬的鏡像。因爲Docker的跨平臺適配性,相當於爲用戶提供了一個非常有用的應用商店,所有人都可以自由地下載微服務組件,這爲開發者提供了巨大便利。

2.docker深入解析

2.1 docker的架構

       Docker使用的是C/S結構。Docker Client 同 Docker Daemon 進行交互,其中主要的工作是通過 Daemon 來完成,包括拉取鏡像、編譯鏡像、運行容器、發佈容器等。Docker Client 和 Docker Daemon 可以運行在同一個系統上,也可以通過遠程方式進行訪問。
在這裏插入圖片描述

  • Docker Daemon: Docker Daemon 運行在一個主機上,用戶並不是直接同Docker Daemon進行交互,而是通過Docker Client 進行訪問。
  • Docker Client: Docker Client 是主要的用戶訪問Docker的渠道。用戶通過它對 Docker Daemon 進行訪問控制。
  • Docker Image: Docker Image 是一個只讀的模板。Image是用來創建容器的。Docker 提供了一種簡單的方式來創建 Image和更新已有的 Image,用戶可以從網上下載 Image,也可以自己製作 Image。
  • Docker Containers: Docker容器就像一個文件夾。一個容器包含了應用程序運行所需的所有環境。每個容器都源於某一個Docker Image。Docker容器可以運行、開始、停止、移動並刪除。每個容器都是完全隔離的、安全的應用。
  • Docker Registry: Docker Registry 是存放Image的倉庫。我們可以使用公有的和私有的Registry來進行下載和上傳Image。公共的Docker Registry 位於 Docker Hub,但是國內訪問比較慢。Docker Hub 包含了大量已有的Image,供用戶使用。你可以基於之前的 Image來創建自己的 Image。

2.2 Docker Image 工作方式

       Docker Image 是隻讀模板,並隨容器一起啓動。每個鏡像包含多個層。Docker Image使用的是 UnionFS(Union File System)來將這些層組合成一個鏡像。UnionFS可以將文件和目錄(通常稱作Branch)進行透明的層疊組裝,然後形成一個單獨的文件系統。Docker爲什麼輕量,就是因爲使用了這些層狀的文件系統。當用戶修改一個Docker Image時(如更新應用程序)一個新的層就會被建立。因此,這是一種增量式的修改,而不是新建一個全新的鏡像,這也是區別於傳統虛擬機的特點。當發佈一個新的鏡像時,只需發佈差異的部分,因此速度就非常快。每個鏡像都來自於一個最基礎的鏡像。

2.3 Docker Registry 工作方式

       Docker Registry是鏡像的倉庫,你編譯完成一個鏡像時,可以推送到公共的Registry,如Docker Hub(默認,也可使用國內阿里倉庫如https://dev.aliyun.com/search.html),也可以推送到自己的私有Registry。使用Docker Client,可以搜索已經發布的鏡像,並從中拉取鏡像到本地,並在容器中運行。Docker Hub 提供了公有和私有的Registry。所有人都可以搜索和下載公共鏡像。私有倉庫只有私有用戶能夠查詢和下載。

2.4 底層的技術

Namespace(資源隔離): Docker 使用了Namespace 技術來隔離工作區,也就是通常所說的容器。當容器運行時,Docker創建了一系列的Namespace。通過Namespaces,容器運行在它自己的獨立命名空間之中,而外層沒有訪問權限。目前,Docker 使用了以下 Namespace:
在這裏插入圖片描述

  • UTS:提供了主機名和域名的隔離,這樣每個Docker容器就可以擁有獨立的主機名和域名了,在網絡上可以被視爲一個獨立的節點,而非宿主機上的一個進程。
  • IPC:進程間通信涉及的IPC資源包括常見的信號量、消息隊列和共享內存。申請IPC資源就申請了一個全局唯一的32位ID,所以IPC namespace中實際上包括了系統IPC標識符以及實現POSIX消息隊列的文件系統。在同一個IPC namespace下的進程彼此可見,不同IPC namespace下的進程則互相不可見。
  • PID:PID namespace隔離非常實用,它對進程PID重新標號,即兩個不同namespace可以有相同的PID。每個PID namespace中的第一個進程"PID 1",都會像傳統Linux中的init進程一樣擁有特權,起特殊作用。
  • Mount:mount namespace通過隔離文件系統掛載點對隔離文件系統提供支持,它是歷史上第一個linux namespace。
  • Network:network namespace主要提供了關於網絡資源的隔離,包括網絡設備、Ipv4和Ipv6協議棧、IP路由表、防火牆等等。
  • User:user namespace主要隔離了安全相關的標識符(identifier)和屬性(attribute),包括用戶ID、用戶組ID、root目錄、key(指密鑰)以及特殊權限。

Control Groups(資源限制): 實現CGroups的主要目的是爲不同用戶層面的資源管理,提供一個統一化的接口。從單個任務的資源控制到操作系統層面的虛擬化,CGroups提供了以下四大功能。

  • 資源限制:CGroups可以對任務使用的資源總額(包括CPU、Memory、IO等)進行限制。如設定應用運行時使用內存的上限,一旦超過這個配額就發出OOM(Out of Memory)提示。
  • 優先級分配:通過分配的CPU時間片數量及磁盤IO帶寬大小,實際上就相當於控制了任務運行的優先級。
  • 資源統計:CGroups可以統計系統的資源使用量,如CPU使用時長、內存用量等,這個功能非常適用於計費。
  • 任務控制:CGroups可以對任務執行掛起、恢復等操作。

Union File System: UnionFS 用來對文件系統進行分層,通過分層可以使鏡像更加輕量級和快捷。Docker 可以使用多種不同的UnionFS,如Aufs、Btrfs、VFS、DevicemapperFS。

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