容器技术详解
一、什么是容器?
IT里的容器技術是英文單詞Linux Container的直譯。container這個單詞有集裝箱、容器的含義(主要偏集裝箱意思)。不過,在中文環境下,咱們要交流要傳授,如果翻譯成“集裝箱技術” 就有點拗口,所以結合中國人的吐字習慣和文化背景,更喜歡用容器這個詞。不過,如果要形象的理解Linux Container技術的話,還是得念成集裝箱會比較好。我們知道,海邊碼頭里的集裝箱是運載貨物用的,它是一種按規格標準化的鋼制箱子。集裝箱的特色,在于其格式劃一,并可以層層重疊,所以可以大量放置在特別設計的遠洋輪船中(早期航運是沒有集裝箱概念的,那時候貨物雜亂無章的放,很影響出貨和運輸效率)。有了集裝箱,那么這就更加快捷方便的為生產商提供廉價的運輸服務。
因此,IT世界里借鑒了這一理念。早期,大家都認為硬件抽象層基于hypervisor(['ha?p?va?z?],虛擬機管理程序,一種運行在基礎物理服務器和操作系統之間的中間軟件層,可允許多個操作系統和應用共享硬件)的虛擬化方式可以最大程度上提供虛擬化管理的靈活性。各種不同操作系統的虛擬機都能通過hypervisor(KVM、XEN等)來衍生、運行、銷毀。然而,隨著時間推移,用戶發現hypervisor這種方式麻煩越來越多。為什么?因為對于hypervisor環境來說,每個虛擬機都需要運行一個完整的操作系統以及其中安裝好的大量應用程序。但實際生產開發環境里,我們更關注的是自己部署的應用程序,如果每次部署發布我都得搞一個完整操作系統和附帶的依賴環境,那么這讓任務和性能變得很重和很低下。
基于上述情況,人們就在想,有沒有其他什么方式能讓人更加的關注應用程序本身,底層多余的操作系統和環境我可以共享和復用?換句話來說,那就是我部署一個服務運行好后,我再想移植到另外一個地方,我可以不用再安裝一套操作系統和依賴環境。這就像集裝箱運載一樣,我把貨物一輛蘭博基尼跑車(好比開發好的應用APP),打包放到一容器集裝箱里,它通過貨輪可以輕而易舉的從上海碼頭(CentOS7.2環境)運送到紐約碼頭(Ubuntu14.04環境)。而且運輸期間,我的蘭博基尼(APP)沒有受到任何的損壞(文件沒有丟失),在另外一個碼頭卸貨后,依然可以完美風騷的賽跑(啟動正常)。
Linux Container容器技術的誕生(2008年)就解決了IT世界里“集裝箱運輸”的問題。Linux Container(簡稱LXC)它是一種內核輕量級的操作系統層虛擬化技術。Linux Container主要由Namespace和Cgroup兩大機制來保證實現。那么Namespace和Cgroup是什么呢?剛才我們上面提到了集裝箱,集裝箱的作用當然是可以對貨物進行打包隔離了,不讓A公司的貨跟B公司的貨混在一起,不然卸貨就分不清楚了。那么Namespace也是一樣的作用,做隔離。光有隔離還沒用,我們還需要對貨物進行資源的管理。同樣的,航運碼頭也有這樣的管理機制:貨物用什么樣規格大小的集裝箱,貨物用多少個集裝箱,貨物哪些優先運走,遇到極端天氣怎么暫停運輸服務怎么改航道等等... 通用的,與此對應的Cgroup就負責資源管理控制作用,比如進程組使用CPU/MEM的限制,進程組的優先級控制,進程組的掛起和恢復等等。
二、容器技術的特點
容器的特點其實我們拿跟它跟硬件抽象層虛擬化hypervisor技術對比就清楚了,我們之前也提到過,傳統的虛擬化(虛擬機)技術,創建環境和部署應用都很麻煩,而且應用的移植性也很繁瑣,比如你要把vmware里的虛擬機遷移到KVM里就很繁瑣(需要做鏡像格式的轉換)。那么有了容器技術就簡單了,總結下容器技術主要有四個特點:
1. 極其輕量:只打包了必要的Bin/Lib;
2. 秒級部署:根據鏡像的不同,容器的部署大概在毫秒與秒之間(比虛擬機強很多);
3. 易于移植:一次構建,隨處部署;
4. 彈性伸縮:Kubernetes、Swam、Mesos這類開源、方便、好使的容器管理平臺有著非常強大的彈性管理能力。
三、容器的標準化
當前,docker幾乎是容器的代名詞,很多人以為docker就是容器。其實,這是錯誤的認識,除了docker 還有coreos。所以,容器世界里并不是只有docker一家。既然不是一家就很容易出現分歧。任何技術出現都需要一個標準來規范它,不然各搞各的很容易導致技術實現的碎片化,出現大量的沖突和冗余。因此,在2015年,由Google,Docker、CoreOS、IBM、微軟、紅帽等廠商聯合發起的OCI(Open Container Initiative,開放容器倡議)組織成立了,并于2016年4月推出了第一個開放容器標準。標準主要包括runtime運行時標準和image鏡像標準。標準的推出,有助于替成長中市場帶來穩定性,讓企業能放心采用容器技術,用戶在打包、部署應用程序后,可以自由選擇不同的容器Runtime;同時,鏡像打包、建立、認證、部署、命名也都能按照統一的規范來做。
兩種標準主要包含以下內容:
容器運行時標準 (runtime spec)
a). creating:使用 create 命令創建容器,這個過程稱為創建中
b). created:容器創建出來,但是還沒有運行,表示鏡像和配置沒有錯誤,容器能夠運行在當前平臺
c). running:容器的運行狀態,里面的進程處于 up 狀態,正在執行用戶設定的任務
d). stopped:容器運行完成,或者運行出錯,或者 stop 命令之后,容器處于暫停狀態。這個狀態,容器還有很多信息保存在平臺中,并沒有完全被刪除
容器鏡像標準(image spec)
a). 文件系統:以 layer 保存的文件系統,每個 layer 保存了和上層之間變化的部分,layer 應該保存哪些文件,怎么表示增加、修改和刪除的文件等;
b). config 文件:保存了文件系統的層級信息(每個層級的 hash 值,以及歷史信息),以及容器運行時需要的一些信息(比如環境變量、工作目錄、命令參數、mount 列表),指定了鏡像在某個特定平臺和系統的配置。比較接近我們使用 docker inspect
四、容器的主要應用場景
容器技術的誕生其實主要解決了PAAS的層的技術實現。像OpenStack、Cloudstack這樣的技術是解決IAAS層的問題。IAAS層和PAAS層大家估計也聽得很多了,關于他們的區別和特性我這里不在描述。那么容器技術主要應用在哪些場景呢?目前主流的有以下幾種:
1. 容器化傳統應用 容器不僅能提高現有應用的安全性和可移植性,還能節約成本。
每個企業的環境中都有一套較舊的應用來服務于客戶或自動執行業務流程。即使是大規模的單體應用,通過容器隔離的增強安全性、以及可移植性特點,也能從 Docker 中獲益,從而降低成本。一旦容器化之后,這些應用可以擴展額外的服務或者轉變到微服務架構之上。
2. 持續集成和持續部署 (CI/CD) 通過 Docker 加速應用管道自動化和應用部署,交付速度提高至少 13 倍。
現代化開發流程快速、持續且具備自動執行能力,最終目標是開發出更加可靠的軟件。通過持續集成 (CI) 和持續部署 (CD),每次開發人員簽入代碼并順利測試之后,IT 團隊都能夠集成新代碼。作為開發運維方法的基礎,CI/CD 創造了一種實時反饋回路機制,持續地傳輸小型迭代更改,從而加速更改,提高質量。CI 環境通常是完全自動化的,通過 git 推送命令觸發測試,測試成功時自動構建新鏡像,然后推送到 Docker 鏡像庫。通過后續的自動化和腳本,可以將新鏡像的容器部署到預演環境,從而進行進一步測試。
3. 微服務 加速應用架構現代化進程。
應用架構正在從采用瀑布模型開發法的單體代碼庫轉變為獨立開發和部署的松耦合服務。成千上萬個這樣的服務相互連接就形成了應用。Docker 允許開發人員選擇最適合于每種服務的工具或技術棧,隔離服務以消除任何潛在的沖突,從而避免“地獄式的矩陣依賴”。這些容器可以獨立于應用的其他服務組件,輕松地共享、部署、更新和瞬間擴展。Docker 的端到端安全功能讓團隊能夠構建和運行最低權限的微服務模型,服務所需的資源(其他應用、涉密信息、計算資源等)會適時被創建并被訪問。
4. IT 基礎設施優化 充分利用基礎設施,節省資金。
Docker 和容器有助于優化 IT 基礎設施的利用率和成本。優化不僅僅是指削減成本,還能確保在適當的時間有效地使用適當的資源。容器是一種輕量級的打包和隔離應用工作負載的方法,所以 Docker 允許在同一物理或虛擬服務器上毫不沖突地運行多項工作負載。企業可以整合數據中心,將并購而來的IT資源進行整合,從而獲得向云端的可遷移性,同時減少操作系統和服務器的維護工作。
總結
- 上一篇: UG二次开发GRIP修改颜色
- 下一篇: 出现—passwd:Authentica