1. 程式人生 > >容器技術概覽

容器技術概覽

容器是輕量級的作業系統級虛擬化,可以讓我們在一個資源隔離的程序中執行應用及其依賴項。執行應用程式所必需的元件都將打包成一個映象並可以複用。執行映象時,它執行在一個隔離環境中,並且不會共享宿主機的記憶體、CPU 以及磁碟,這就保證了容器內程序不能監控容器外的任何程序。

1.jpg

 

容器與虛擬機器之間的差別

虛擬機器通常包含整個作業系統及其應用程式,同時也需要執行一個 hypervisor 來控制虛擬機器。

因為虛擬機器包括作業系統,所有大小一般是幾個 G。使用虛擬機器的缺點之一是啟動作業系統以及初始化託管應用會花費幾分鐘的時間,但是,容器是輕量級的而且大小在 M 以內。效能方面,與 VM 相比,容器表現更加出色,並且幾乎可以秒啟動。

2.png

 

容器究竟解決了什麼問題?

大多問題都是在執行環境改變時才顯現的,可能是這樣一種場景,開發者把程式碼從開發環境 push 到測試環境然後到更上層的環境。比如開發者在 Windows 上編寫應用程式碼,但是上層環境(測試、stage 或是生產環境)是基於 Linux 的。在這種情況下,當作業系統變化時,應用的某些功能可能就會出現問題。所以,基本上,當配套軟體環境不一樣的時候,間歇性故障的機率就會更大。

正如 Docker 創始人 Solomon Hykes 所說,“測試環境使用 Python 2.7,但是生產環境使用 Python 3,那麼一些奇怪的事情就會發生。或者你依賴某個特定版本的 SSl 庫的行為,但是卻安裝了另外一個版本。在 Debian 上執行測試環境,但是生產環境使用 Redhat,那麼任何奇怪的事情都可能發生。”

改變可能不只是執行環境,也有可能是網路,Hykes 補充道,“網路拓撲可能不同,或者安全策略和儲存也有可能不同,但是,軟體需要在這些基礎設施上面執行。”

容器的優點

  1. 敏捷環境:容器技術最大的優點是建立容器例項比建立虛擬機器示例快得多,容器輕量級的指令碼可以從效能和大小方面減少開銷。
  2. 提高生產力:容器通過移除跨服務依賴和衝突提高了開發者的生產力。每個容器都可以看作是一個不同的微服務,因此可以獨立升級,而不用擔心同步。
  3. 版本控制:每一個容器的映象都有版本控制,這樣就可以追蹤不同版本的容器,監控版本之間的差異等等。
  4. 執行環境可移植:容器封裝了所有執行應用程式所必需的相關的細節比如應用依賴以及作業系統。這就使得映象從一個環境移植到另外一個環境更加靈活。比如,同一個映象可以在 Windows 或 Linux 或者 開發、測試或 stage 環境中執行。
  5. 標準化: 大多數容器基於開放標準,可以執行在所有主流 Linux 發行版、Microsoft 平臺等等。
  6. 安全:容器之間的程序是相互隔離的,其中的基礎設施亦是如此。這樣其中一個容器的升級或者變化不會影響其他容器。

 

容器的缺點

  1. 複雜性增加:隨著容器及應用數量的增加,同時也伴隨著複雜性的增加。在生產環境中管理如此之多的容器是一個極具挑戰性的任務,可以使用 Kubernetes 和 Mesos 等工具管理具有一定規模數量的容器。
  2. 原生 Linux 支援:大多數容器技術,比如 Docker,基於 Linux 容器(LXC),相比於在原生 Linux 中執行容器,在 Microsoft 環境中執行容器略顯笨拙,並且日常使用也會帶來複雜性。
  3. 不成熟:容器技術在市場上是相對新的技術,需要時間來適應市場。開發者中的可用資源是有限的,如果某個開發者陷入某個問題,可能需要花些時間才能解決問題。

 

容器分類

作業系統容器:如維基百科中所述,“作業系統層虛擬化是一種計算機虛擬化技術,這種技術將作業系統核心虛擬化,可以允許多個獨立使用者空間的存在,而不是隻有一個。這些例項有時會被稱為容器、虛擬引擎、虛擬專用伺服器或是 jails(FreeBSD jail 或者 chroot jail)。從執行在容器中的程式角度來看,這些例項就如同真正的計算機。”

如上所述,容器共享宿主機的核心,但是提供使用者空間隔離。我們可以像在宿主機作業系統上一樣,在容器中安裝、配置以及執行應用程式。相似的是,分配給容器的資源僅對自己可見。就好比是,任何虛擬機器不能獲取其他虛擬機器的資源。

當需要配置大量具有相同配置的作業系統時,作業系統容器就會非常有用。因此,容器有助於建立模板,可以用於建立與另一個作業系統類似風格的容器。

要建立作業系統容器,我們可以利用容器技術,如 LXC,OpenVZ,Linux VServer,BSD Jails 和 Solaris 區域。

3.jpg


應用容器:如維基百科所述,“應用程式虛擬化是從其所執行的底層作業系統封裝計算機程式的軟體技術。一個完全虛擬化的應用,儘管仍像原來一樣執行,但是並不會進行傳統意義上的安裝。應用在執行時的行為就像它直接與原始作業系統以及作業系統所管理的所有資源進行互動一樣,但可以實現不同程度的隔離或者沙盒化。”

在這種情況下,術語 “虛擬化” 是指被封裝的工件(應用程式),這與其在硬體虛擬化中的含義截然不同,其中它涉及被抽象的工件(物理硬體)。

應用程式容器旨在作為單個程序進行打包和執行服務,而在 OS 容器中,可以執行多個服務和程序。

容器技術如 Docker 和 Rocket 就是應用程式容器的示例。

來源:https://dzone.com/articles/container-technologies-overview