天天看點

容器技術基礎(1)| 學習筆記容器技術基礎(1)

開發者學堂課程【現代應用容器技術快速入門第一課時:容器技術基礎(1)】學習筆記,與課程緊密聯系,讓使用者快速學習知識。

課程位址:

https://developer.aliyun.com/learning/course/830/detail/13950

容器技術基礎(1)

課程簡介

•       由阿裡雲、Linux 開源軟體學園和馬哥教育聯合推出

–       “CNCF x Alibaba 雲原生技術公開課”的前置課程

–       CKAD/CKA/CKS 認證的配套課程

•       内容涵蓋

–       手把手實踐Kubernetes 雲原生作業系統

–       阿裡雲Kubernetes 托管服務ACK

1.容器技術基礎

1.1應用部署及運作

•       應用部署環境

–       主機

–       虛拟機

–       容器

容器技術基礎(1)| 學習筆記容器技術基礎(1)

2.現代作業系統的核心空間與使用者空間

1.命現代作業系統在記憶體中有兩個不同的、分離的區域,稱為使用者空間和核心空間;、

2.核心充當使用者空間和硬體的中間層,負責程序排程、記憶體管理、中斷處理等,對系統資源具有完全控制權3.使用者空間通過“系統調用”與核心通信,系統調用通過API向應用程式提供系統級服務

容器技術基礎(1)| 學習筆記容器技術基礎(1)

3.虛拟化技術

•       通過專用軟體模拟或/和虛拟技術,将主機硬體虛拟為獨立、完整且隔離的不同單元,每個單元可作為一個主機使用

–       這個專用軟體稱為VMM,即虛拟機監視程式

–       根據VMM 運作的位置,可将虛拟化技術劃分為兩種類型

•       直接運作于硬體之上:類型1

•       運作于作業系統之上:類型2

–       每個虛拟機直接暴露硬體接口

•       有獨立的核心空間和使用者空間

•       跨虛拟機的程序之間完全隔離

•       資源開銷較大,半虛拟化技術有助于降低開銷

容器技術基礎(1)| 學習筆記容器技術基礎(1)

4.容器技術

•       借助于稱之為“容器運作時”的軟體技術,在同一個核心之上生成多個彼此隔離的使用者空間

–       ·各使用者空間可獨立管理運作其内部程序

–       每個使用者空間“自以為”獨占該核心及硬體資源

•       需要将核心級的共享資源進行隔離

–       依賴于核心中稱為“名稱空間”的技術進行

•       名稱空間是Linux核心特性,用于隔離部分系統資源,進而使得程序僅可通路同一名稱空間中的相應資源;

–       資源限制則依賴于由Google貢獻的“CGroups”

容器技術基礎(1)| 學習筆記容器技術基礎(1)

5.Linux核心支援的名稱空間

目前,核心(5.13)支援8種名稱空間

容器技術基礎(1)| 學習筆記容器技術基礎(1)

備注:

monotonic time:單調遞增時鐘,自系統開機後開始累加計時,但系統休眠時間不計入;

boot time:類似于monotonic time,不同之處是,boot time 會計入系統休眠時間;

6.名稱空間和Chroot

•       1979年,chroot()系統調用被添加到Unix系統中,用于為開發人員提供一個獨立于根檔案系統的測試平台;

–       借助于chroot(),開發人員可以更改程序及其子程序的根目錄

–       如圖,檔案系統被分成兩個部分,它們互不影響

•       Linux 引入了新的子系統和系統調用來改進程序隔離機制

–       名稱空間的概念最早出現在2002年的Kernel 2.4.19中.當時唯一支援的名稱空間是Mount,該名稱空間的Flag 甚至就名為CLONE_NEWNS

容器技術基礎(1)| 學習筆記容器技術基礎(1)

7.隔離程序及辨別的PID 名稱空間

•       PID 名稱空間能夠支援多個完全獨立的程序樹

–       Linux 系統在使用者空間啟動的PID 号為1的程序,作為程序樹的“根”

–       PID 名稱空間允許使用者建立具有1号PID的單獨分支

•       新樹中的程序永遠不會同父程序互動,也不會看到它

•       父程序可以通路所有的子程序樹

•       帶有CLONE_NEWPID 标志的clone()系統調用可用于建立新的命名空間PID

容器技術基礎(1)| 學習筆記容器技術基礎(1)

8.隔離檔案系統的Mount 名稱空間

•        Mount 名稱空i間能夠建立同無關程序完全獨立的檔案系統,其可靠性遠大于chroot();

–       子程序首先“看到”與父程序相同的挂載點

–       —旦子程序被移至一個單獨的名稱空間,住何檔案系統都可以挂載到該名稱之間之上,并且父程序或其他命名空間都無法通路到它

容器技術基礎(1)| 學習筆記容器技術基礎(1)

9.名稱空間API

•       Linux 核心中,與namespace 相關的API有4個

–       clone():建立子程序,并将其隔離至建立的名稱空間之中;

•       負責建立一個子程序,若同時使用了CLONE_NEW*相關的标志,則為每個标志建立出名稱空間,并将該程序置于該名稱空間中;

–       setns():将程序加入到指定的現有名稱空間中;

•       通過操作程序相關的/proc/[pid]/ns/目錄完成

–       unshare():将程序隔離至建立的名稱空間中;

•       與clone()類似,但不同之處在于,unshare()在目前程序中建立名稱空間,一旦調用完成,目前程序即位于新的名稱空間中;

–       ioctl():擷取名稱空間的相關資訊

容器技術基礎(1)| 學習筆記容器技術基礎(1)

10.容器運作時

•       容器并非Linux 核心中的“一等公民”,它從根本上來說就是由名稱空間、cGroups 和LSM(Linux 核心安全子產品)等幾個核心原語組成;

–       借助于這些核心原語即可設定安全、隔離的程序運作環境,但這也意味着每次建立都得手動執行相關的操作;

•       “容器運作時”便是一組簡化該類操作的工具集

–       “運作時”是程序的生命周期管理工具,容器運作時是一種特指運作和管理容器所需要的軟體

–       用于幫助使用者輕松、高效、安全地部署容器,而且是容器管理的關鍵元件

•       2007年,CGroups 引入到Linux 核心之後,便出現了一些容器運作時項目,例如LXC 和LMCTFY(Google)等

11.Linux 容器和LXC 項目

•       LXC,全稱LinuX Containers,一個知名的Linux 容器管理項目,由一組工具、模闆和庫組成;

但是

–       LXC 僅提供了單機的指令行工具,且這些指令非常底層,使用者了解起來較為困難

–       LXC 沒有daemon 程序,無法提供基于Socket 的API,也難以實作跨主機的容器遷移

–       LXD 項目提供了這部分缺失的功能

容器技術基礎(1)| 學習筆記容器技術基礎(1)

 12.Docker 容器

•       dotCloud 公司的Docker 項目最初也是建立在LXC之上,以促進容器技術對開發人員和使用者更加友好;

–       不久之後,Docker便使用了自行研發的libcontainer 取代了LXC

–       在Docker 項目聲名大噪之後,dotCloud公司也更名為Docker

•       最終,Docker 于2013年釋出,解決于開發人員在端到端到行視窗時遇到的許多問題

•       容器鏡像格式

•       建構容器鏡像:Dockerfile、docker build

•       容器鏡像管理:docker image、docker rmi

•       容器執行個體管理: docker ps、docker rm、……

•       共享容器鏡像:docker push/pull

•       運作容器鏡像的方式:docker run

繼續閱讀