1. 程式人生 > >容器技術詳解

容器技術詳解

一、什麼是容器?

IT裡的容器技術是英文單詞Linux Container的直譯。container這個單詞有集裝箱、容器的含義(主要偏集裝箱意思)。不過,在中文環境下,咱們要交流要傳授,如果翻譯成“集裝箱技術” 就有點拗口,所以結合中國人的吐字習慣和文化背景,更喜歡用容器這個詞。不過,如果要形象的理解Linux Container技術的話,還是得念成集裝箱會比較好。我們知道,海邊碼頭裡的集裝箱是運載貨物用的,它是一種按規格標準化的鋼製箱子。集裝箱的特色,在於其格式劃一,並可以層層重疊,所以可以大量放置在特別設計的遠洋輪船中(早期航運是沒有集裝箱概念的,那時候貨物雜亂無章的放,很影響出貨和運輸效率)。有了集裝箱,那麼這就更加快捷方便的為生產商提供廉價的運輸服務。

img

因此,IT世界裡借鑑了這一理念。早期,大家都認為硬體抽象層基於hypervisor(['haɪpəvaɪzə],系統管理程式,一種執行在基礎物理伺服器和作業系統之間的中間軟體層,可允許多個作業系統和應用共享硬體)的虛擬化方式可以最大程度上提供虛擬化管理的靈活性。各種不同作業系統的虛擬機器都能通過hypervisor(KVM、XEN等)來衍生、執行、銷燬。然而,隨著時間推移,使用者發現hypervisor這種方式麻煩越來越多。為什麼?因為對於hypervisor環境來說,每個虛擬機器都需要執行一個完整的作業系統以及其中安裝好的大量應用程式。但實際生產開發環境裡,我們更關注的是自己部署的應用程式,如果每次部署釋出我都得搞一個完整作業系統和附帶的依賴環境,那麼這讓任務和效能變得很重和很低下。

基於上述情況,人們就在想,有沒有其他什麼方式能讓人更加的關注應用程式本身,底層多餘的作業系統和環境我可以共享和複用?換句話來說,那就是我部署一個服務執行好後,我再想移植到另外一個地方,我可以不用再安裝一套作業系統和依賴環境這就像集裝箱運載一樣,我把貨物一輛蘭博基尼跑車(好比開發好的應用APP),打包放到一容器集裝箱裡,它通過貨輪可以輕而易舉的從上海碼頭(CentOS7.2環境)運送到紐約碼頭(Ubuntu14.04環境)。而且運輸期間,我的蘭博基尼(APP)沒有受到任何的損壞(檔案沒有丟失),在另外一個碼頭卸貨後,依然可以完美風騷的賽跑(啟動正常)。

img

Linux Container容器技術的誕生(2008年

)就解決了IT世界裡“集裝箱運輸”的問題。Linux Container(簡稱LXC)它是一種核心輕量級的作業系統層虛擬化技術。Linux Container主要由Namespace和Cgroup兩大機制來保證實現。那麼Namespace和Cgroup是什麼呢?剛才我們上面提到了集裝箱,集裝箱的作用當然是可以對貨物進行打包隔離了,不讓A公司的貨跟B公司的貨混在一起,不然卸貨就分不清楚了。那麼Namespace也是一樣的作用,做隔離。光有隔離還沒用,我們還需要對貨物進行資源的管理。同樣的,航運碼頭也有這樣的管理機制:貨物用什麼樣規格大小的集裝箱,貨物用多少個集裝箱,貨物哪些優先運走,遇到極端天氣怎麼暫停運輸服務怎麼改航道等等... 通用的,與此對應的Cgroup就負責資源管理控制作用,比如程序組使用CPU/MEM的限制,程序組的優先順序控制,程序組的掛起和恢復等等。

img

二、容器技術的特點

容器的特點其實我們拿跟它跟硬體抽象層虛擬化hypervisor技術對比就清楚了,我們之前也提到過,傳統的虛擬化(虛擬機器)技術,建立環境和部署應用都很麻煩,而且應用的移植性也很繁瑣,比如你要把vmware裡的虛擬機器遷移到KVM裡就很繁瑣(需要做映象格式的轉換)。那麼有了容器技術就簡單了,總結下容器技術主要有三個特點:

  • 1. 極其輕量:只打包了必要的Bin/Lib
  • 2. 秒級部署:根據映象的不同,容器的部署大概在毫秒與秒之間(比虛擬機器強很多);
  • 3. 易於移植:一次構建,隨處部署;
  • 4. 彈性伸縮:Kubernetes、Swam、Mesos這類開源、方便、好使的容器管理平臺有著非常強大的彈性管理能力。

img

三、容器的標準化

當前,docker幾乎是容器的代名詞,很多人以為docker就是容器。其實,這是錯誤的認識,除了docker 還有coreos。所以,容器世界裡並不是只有docker一家。既然不是一家就很容易出現分歧。任何技術出現都需要一個標準來規範它,不然各搞各的很容易導致技術實現的碎片化,出現大量的衝突和冗餘。因此,在2015年,由Google,Docker、CoreOS、IBM、微軟、紅帽等廠商聯合發起的OCI(Open Container Initiative)組織成立了,並於2016年4月推出了第一個開放容器標準。標準主要包括runtime執行時標準和image映象標準。標準的推出,有助於替成長中市場帶來穩定性,讓企業能放心採用容器技術,使用者在打包、部署應用程式後,可以自由選擇不同的容器Runtime;同時,映象打包、建立、認證、部署、命名也都能按照統一的規範來做。

兩種標準主要包含以下內容:

  1. 容器執行時標準 (runtime spec)

a). creating:使用 create 命令建立容器,這個過程稱為建立中

b). created:容器創建出來,但是還沒有執行,表示映象和配置沒有錯誤,容器能夠執行在當前平臺

c). running:容器的執行狀態,裡面的程序處於 up 狀態,正在執行使用者設定的任務

d). stopped:容器執行完成,或者執行出錯,或者 stop 命令之後,容器處於暫停狀態。這個狀態,容器還有很多資訊儲存在平臺中,並沒有完全被刪除

  1. 容器映象標準(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資源進行整合,從而獲得向雲端的可遷移性,同時減少作業系統和伺服器的維護工作。