基於高度虛擬化所誕生的容器技術,如今已經走向大規模應用。那麼容器、虛擬機器、Docker、Openstack、Kubernetes 之間又有什麼關係,對現在的選擇有什麼影響呢?
上世紀 60 年代,計算機是一種稀有商品。即便只租不買,每月也要花一千多美元,這使許多企業都無法承受。而且早期的計算機通常專用於某一項特定的任務,需要同時在許多使用者之間共享計算機資源,並且可能花費幾天甚至幾周的時間才能執行完畢。俗話說:“需求是發明之母”,有了需求人們就會去發明創造來滿足需求。計算機的歷史也不例外,過於昂貴的費用和長時間的共享需求刺激了虛擬化的逐漸發展。
Docker 與容器
基於需求刺激,容器技術應運而生。容器的發展從 Chroot,FreeBSD jails,OpenVZ,LXC,到如今的 Docker、Rocket 真正走向了大規模應用。
相比普通伺服器,容器是一種更輕量級,更靈活的虛擬化處理方式,它將一個應用程式所需的一切打包在一起。一般情況下開發人員在編寫程式碼時,他們是在自己本地的開發環境中工作;當他們準備將程式碼移至生產環境時,總會發生一些意想不到的事情。原因多種多樣:不同的作業系統,不同的依賴項,不同的庫。
而容器解決了可移植性這一關鍵問題,它可以將程式碼與執行它的環境分開。開發人員可以將應用程式(包括正確執行所需的所有庫)打包到一個小的容器映象中。該映象可以在其他任何計算機上執行。
Docker 的興起
雖然 Docker 經常會和“容器(Container)”一詞相提並論,但是 Docker 本身並不是容器。從字面意思可以解讀,“Container”原譯為“集裝箱”,而“Docker”被譯為“碼頭工人”。
Docker 是一個開源的應用容器引擎,是建立容器的工具。讓開發者可以打包他們的應用和依賴包到一個可移植的容器中,然後釋出到任何流行的 Linux 機器或 Windows 機器上。
2013 年 PyCon 大會之後,Docker 迅速成為社群、客戶和更廣泛行業的實際標準與基石。Docker 的強大之處在於它通過可移植的形式和易於使用的工具,在應用程式和基礎設施之間創造了獨立性,使得容器技術大眾化,並使容器技術成為主流。
Docker 如此大火,但是我們需要知道,Docker 並不是唯一的,也不是第一個出現的容器平臺。其他的框架,例如 OpenVZ 和 LXC(Linux Container),於 2000 年中期就已經開始使用。而 FreeBSD jails,則可以追溯到更遠的年代。Docker 是在 2013 年釋出的,與當今大多數主流的容器技術相比,它是非常年輕的。
雖然 Docker 不是最成熟的,卻引起了極大的關注。這是因為 Docker 是一個擴充套件的 Linux 容器(LXC),是一種獨特輕巧、以應用為中心的虛擬化工具。它大大降低了企業開銷,也更容易讓企業在伺服器上部署軟體。且 Docker 允許系統管理員和開發人員在容器中構建任何應用程式,節省資源。
除此之外,Docker 發展迅猛的原因還有:
-
Docker 從一開始就是開源的,這使得 Docker 在行業內有了強大的吸引力。直到 2013 年,行業才開始將“開源”視為軟體生產的預設模式。
-
Docker 出現在了正確的時間。到 2013 年,虛擬機器似乎已經成為了過時的技術。大家一直在尋找一種更精簡,更方便的方式來部署應用程式,而這時 Docker 出現了,它恰好符合要求。
-
Docker 使用的另一個主要重點是 DevOps。DevOps 在 2010 年初開始流行,它強調了軟體交付的敏捷性、靈活性和可擴充套件性。Docker 恰好為根據 DevOps 部署應用程式提供了合適的環境。
Docker 與 OpenStack
容器和虛擬機器這兩種技術經常被互相比較。所謂虛擬機器(Virtual Machine)是指通過軟體模擬的具有完整硬體系統功能的、執行在一個完全隔離環境中的完整計算機系統。
Docker 可能被認為是當前容器技術的代表,而作為虛擬機器技術的代表,OpenStack 也被大眾所周知。
OpenStack 是一個開源的雲端計算管理平臺專案,是一系列軟體開源專案的組合。它不是一個軟體,而是一個雲平臺管理的專案。這個專案由幾個主要的元件組合起來完成一些具體的工作。其中主要包括:
-
Nova(Compute):在 OpenStack 環境中計算例項(即建立的雲主機)的生命週期管理。按需響應包括生成、排程、回收虛擬機器等操作。
-
Neutron(Networking):確保為其它 OpenStack 服務提供網路連線即服務。
-
Swift(Object Storage):通過基於 HTTP 的應用程式介面儲存和任意檢索的非結構化資料物件。
-
Glance(Image service):儲存和檢索虛擬機器磁碟映象,OpenStack Compute 會在例項部署時使用此服務。
許多人都會常用 Docker 和傳統虛擬機器來做比較,並且經常凸顯出 Docker 的優勢。其實這和 OpenStack 沒有直接關係。曾經許多的效能測試都會將 Docker 與 KVM 進行對比,但是後來發現這些測試是通過 OpenStack 執行的,這表明兩種技術其實可以很好地協同工作。
那麼如果使用了 Docker,還能使用 OpenStack 嗎?
答案是可以的,Docker 以最簡單的形式提供了一個容器,用於管理共享基礎架構上的應用程式,同時又使它們彼此隔離。而虛擬機器則通過建立一個完整的作業系統來完成類似的工作。OpenStack 的官方文件(https://wiki.openstack.org/wiki/Docker)特別提供了部署 Docker 的解決方案,並且單獨指出:“容器並非旨在替代虛擬機器,它們是互補的,因為它們更適合特定的用例。”
Docker 與 Kubernetes
如果第一次看到 Kubernetes 這個詞,可能會比較好奇它為何簡寫為 K8S。其實是 k 與 s 中間正好隔了 8 個字母,K8S 為一種偷懶地寫法。Kubernetes 是 Google 開源的一個容器編排引擎,它支援自動化部署、大規模可伸縮、應用容器化管理。
作為容器編排的解決方案,隨著 Kubernetes 越來越流行,“Kubernetes” 與 “Docker” 這兩個詞也經常會相提並論。
目前,Kubernetes 可以說是市場領導者,及編排容器和部署分散式應用程式的標準化方法。Kubernetes 可以在公共雲服務或本地執行,具有高度模組化,開放原始碼,並且擁有一個活躍的社群。許多雲廠商也都已經提供了 Kubernetes 作為服務。
當然了,Docker 和 Kubernetes 並不是競爭對手。Docker 是一個容器化平臺,而 Kubernetes 是 Docker 等容器平臺的協調器。它旨在為容器提供高效地管理,監視應用程式的執行狀況,使應用程式提供不間斷地服務,而不需要運維人員去進行復雜的手工配置和處理。
雲端計算技術發展至今,從最開始的硬體虛擬化、IaaS、OpenStack、PaaS、容器到如今的 Serverless,雲端計算已經越來越接近應用邏輯。容器實現了應用的分裝,方便了應用在不同環境間的遷移,輕量級的特性又使它能夠消耗更少的資源而帶來更大的便利。當然,技術更新迭代迅速,我們只有不斷學習才能跟上行業的步伐,加油吧,小夥伴們!