開發者學堂課程【現代應用容器技術快速入門第一課時:容器技術基礎(1)】學習筆記,與課程緊密聯系,讓使用者快速學習知識。
課程位址:
https://developer.aliyun.com/learning/course/830/detail/13950容器技術基礎(1)
課程簡介
• 由阿裡雲、Linux 開源軟體學園和馬哥教育聯合推出
– “CNCF x Alibaba 雲原生技術公開課”的前置課程
– CKAD/CKA/CKS 認證的配套課程
• 内容涵蓋
– 手把手實踐Kubernetes 雲原生作業系統
– 阿裡雲Kubernetes 托管服務ACK
1.容器技術基礎
1.1應用部署及運作
• 應用部署環境
– 主機
– 虛拟機
– 容器

2.現代作業系統的核心空間與使用者空間
1.命現代作業系統在記憶體中有兩個不同的、分離的區域,稱為使用者空間和核心空間;、
2.核心充當使用者空間和硬體的中間層,負責程序排程、記憶體管理、中斷處理等,對系統資源具有完全控制權3.使用者空間通過“系統調用”與核心通信,系統調用通過API向應用程式提供系統級服務
3.虛拟化技術
• 通過專用軟體模拟或/和虛拟技術,将主機硬體虛拟為獨立、完整且隔離的不同單元,每個單元可作為一個主機使用
– 這個專用軟體稱為VMM,即虛拟機監視程式
– 根據VMM 運作的位置,可将虛拟化技術劃分為兩種類型
• 直接運作于硬體之上:類型1
• 運作于作業系統之上:類型2
– 每個虛拟機直接暴露硬體接口
• 有獨立的核心空間和使用者空間
• 跨虛拟機的程序之間完全隔離
• 資源開銷較大,半虛拟化技術有助于降低開銷
4.容器技術
• 借助于稱之為“容器運作時”的軟體技術,在同一個核心之上生成多個彼此隔離的使用者空間
– ·各使用者空間可獨立管理運作其内部程序
– 每個使用者空間“自以為”獨占該核心及硬體資源
• 需要将核心級的共享資源進行隔離
– 依賴于核心中稱為“名稱空間”的技術進行
• 名稱空間是Linux核心特性,用于隔離部分系統資源,進而使得程序僅可通路同一名稱空間中的相應資源;
– 資源限制則依賴于由Google貢獻的“CGroups”
5.Linux核心支援的名稱空間
目前,核心(5.13)支援8種名稱空間
備注:
monotonic time:單調遞增時鐘,自系統開機後開始累加計時,但系統休眠時間不計入;
boot time:類似于monotonic time,不同之處是,boot time 會計入系統休眠時間;
6.名稱空間和Chroot
• 1979年,chroot()系統調用被添加到Unix系統中,用于為開發人員提供一個獨立于根檔案系統的測試平台;
– 借助于chroot(),開發人員可以更改程序及其子程序的根目錄
– 如圖,檔案系統被分成兩個部分,它們互不影響
• Linux 引入了新的子系統和系統調用來改進程序隔離機制
– 名稱空間的概念最早出現在2002年的Kernel 2.4.19中.當時唯一支援的名稱空間是Mount,該名稱空間的Flag 甚至就名為CLONE_NEWNS
7.隔離程序及辨別的PID 名稱空間
• PID 名稱空間能夠支援多個完全獨立的程序樹
– Linux 系統在使用者空間啟動的PID 号為1的程序,作為程序樹的“根”
– PID 名稱空間允許使用者建立具有1号PID的單獨分支
• 新樹中的程序永遠不會同父程序互動,也不會看到它
• 父程序可以通路所有的子程序樹
• 帶有CLONE_NEWPID 标志的clone()系統調用可用于建立新的命名空間PID
8.隔離檔案系統的Mount 名稱空間
• Mount 名稱空i間能夠建立同無關程序完全獨立的檔案系統,其可靠性遠大于chroot();
– 子程序首先“看到”與父程序相同的挂載點
– —旦子程序被移至一個單獨的名稱空間,住何檔案系統都可以挂載到該名稱之間之上,并且父程序或其他命名空間都無法通路到它
9.名稱空間API
• Linux 核心中,與namespace 相關的API有4個
– clone():建立子程序,并将其隔離至建立的名稱空間之中;
• 負責建立一個子程序,若同時使用了CLONE_NEW*相關的标志,則為每個标志建立出名稱空間,并将該程序置于該名稱空間中;
– setns():将程序加入到指定的現有名稱空間中;
• 通過操作程序相關的/proc/[pid]/ns/目錄完成
– unshare():将程序隔離至建立的名稱空間中;
• 與clone()類似,但不同之處在于,unshare()在目前程序中建立名稱空間,一旦調用完成,目前程序即位于新的名稱空間中;
– ioctl():擷取名稱空間的相關資訊
10.容器運作時
• 容器并非Linux 核心中的“一等公民”,它從根本上來說就是由名稱空間、cGroups 和LSM(Linux 核心安全子產品)等幾個核心原語組成;
– 借助于這些核心原語即可設定安全、隔離的程序運作環境,但這也意味着每次建立都得手動執行相關的操作;
• “容器運作時”便是一組簡化該類操作的工具集
– “運作時”是程序的生命周期管理工具,容器運作時是一種特指運作和管理容器所需要的軟體
– 用于幫助使用者輕松、高效、安全地部署容器,而且是容器管理的關鍵元件
• 2007年,CGroups 引入到Linux 核心之後,便出現了一些容器運作時項目,例如LXC 和LMCTFY(Google)等
11.Linux 容器和LXC 項目
• LXC,全稱LinuX Containers,一個知名的Linux 容器管理項目,由一組工具、模闆和庫組成;
但是
– LXC 僅提供了單機的指令行工具,且這些指令非常底層,使用者了解起來較為困難
– LXC 沒有daemon 程序,無法提供基于Socket 的API,也難以實作跨主機的容器遷移
– LXD 項目提供了這部分缺失的功能
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