工作總結:一文了解Docker 容器和VM的區別

工作總結:一文了解Docker 容器和VM的區別

本文嘗試解釋兩者的不同,不涉及底層知識。相當於科普小知識。

Docker Container

一個謹慎的比較docker和vm,個人覺得Container像個一個迷你的vm

從某種意義上說,這是正確的。但從另一個角度來看,這是非常不準確的,可能會讓讀者導致混亂,錯誤的假設。

需要理解的重要相似之處是,這兩種方法都是為部署和運行應用程序創建隔離環境的方法。

Virtual Machines

VM(VMware)在宿主機器、宿主機器操作系統的基礎上創建虛擬層、虛擬化的操作系統、虛擬化的倉庫,然後再安裝應用;

Containers

容器完全在容器主機的應用程序層中運行。在UserLAnd[1]中,OSs有內核空間,操作系統的核心在其中運行。然後是用戶空間,所有與用戶活動相關的東西都在這裡運行。沒有安裝操作系統。容器共享主機的內核空間,類似於主機中的一個用戶,LXC所實現的隔離性主要是來自kernel的namespace, 其中pid, net, ipc, mnt, uts 等namespace將container的進程, 網絡, 消息, 文件系統和hostname 隔離開。但是,cgroup的隔離性要比kvm粒度大,並且很難metric指標。比如,磁盤的IO就很難隔離。導致一個容器的io增大,這個主機都有可能hang。

容器實際上就是一個進程。當它在容器內時,感覺就像一臺完全獨立的機器。我們可以啟動新的進程,當監控這些進程時,您將只看到容器內的進程。但是,如果您監控主機進程,仍然能夠看到容器中運行的所有內容。

容器共享主機。那麼他是如何在同一臺機器上運行Ubuntu和CentOS呢?

因為容器實際上共享主機的內核。特定的Linux發行版都構建在同一個內核之上(儘管版本不同)。所有的包管理器、UI之類的東西,以及其他各種軟件,都可以在用戶空間中運行,這些軟件使發行版獨一無二,並創造出不同的Linux風格。具有不同發行版的不同容器可以在同一臺機器上運行而不會產生衝突。

當涉及到平臺設計時,這個內核共享事實還有其他重要的含義。例如,Windows容器將不能在Linux主機上運行。

不可修改

容器本質上是不可變的。 容器操作系統、庫、實用程序和應用程序在構建時都是凍結的,在此之後它就不能更改了。所以,不需要以傳統的方式更新容器。重新構建和重新部署。雖然有一些缺點,但是在可重複性、簡化部署和可靠性方面有很大的提高。

鏡像(image)

鏡像其實是一個標準的文件包,它表示容器運行時文件系統的狀態。這可以發佈到註冊表,也可以用作父鏡像。

大多數鏡像將構建在父鏡像之上(父鏡像通常也構建在另一個鏡像像之上)。基本映像沒有父鏡像的。

下面是一個完整的ubuntu鏡像[2]

工作總結:一文了解Docker 容器和VM的區別

小結

簡而言之,容器化為單個OS上的工作負載隔離提供了標準化的方法,而虛擬化為在一臺服務器上安裝多個OSs提供了標準化的方法。它們在業界都很突出,在雲計算中經常一起使用。

因為容器沒有安裝完整的操作系統,所以它的重量更輕,因為下載和運行更快,存儲更小。

舉例對比兩者的不同

下圖以儘可能簡單的方式說明了上述差異。請注意使用VMs和容器運行相同的兩個工作負載的堆棧組合。

工作總結:一文了解Docker 容器和VM的區別

如果大家理解了上面描述的容器和vm之間的關鍵區別,那麼第二個圖將提供對正在發生的事情的更深入的信息。大家可以清楚地看到這兩種技術如何提供工作負載隔離。

記住,堆棧表示邏輯層次結構。我們知道這些容器都在主機操作系統上作為唯一的進程運行,而VM客戶操作系統是成熟的操作系統,可以管理它們自己的進程。

工作總結:一文了解Docker 容器和VM的區別

現在,讓我們看看vm和容器通常是如何一起使用的。假設我們想在雲中運行Python Flask應用程序和Java Spring應用程序。下圖描述了AWS上可行的狀態。

工作總結:一文了解Docker 容器和VM的區別

Amazon EC2是Amazon的託管計算服務。這意味著用戶不需要擔心服務器或管理程序。我們只需選擇實例類型(針對不同工作負載的不同特性)並部署VM。(國內的同學們還是使用阿里雲吧)

有許多不同的Amazon機器鏡像可供選擇[3],或者可以創建自己的鏡像。因為vm比容器更重。

我們可以在許多不同的服務中共同使用VM鏡像。可以將基本操作系統、包更新、一些腳本、監視代理的安裝和配置,以及其他操作和安全工具打包到vm中。

通常使用配置管理工具(如Ansible或Chef)來管理工作負載或服務。Chef已經是devops的標準管理工具。

容器編排

下一個例子提供了一個非常基本的架構圖,瞭解在雲中運行容器的基本原理。

容器編排工具用於在平臺上管理容器,在這個平臺上,讓我們感覺就像是在處理一臺機器一樣透明。這是通過巧妙地管理集群(雲中的機器或vm集群)來實現的。它們可以通過自動化資源調度、擴展和工作負載管理功能來擴展容器的優點。Kubernetes是目前最流行的容器編排平臺。

這些工具在體系結構上很複雜,很難配置和讓他們良好的運行(坑還是比較多的)。但從用戶的角度來看,它們非常棒,而且隨著知識的增長、反饋的實現和託管服務的出現,它們越來越容易管理。

最後,我們希望獲取Python容器並在本地機器上運行它。 它們允許我們相對容易地在機器上運行與生產中完全相同的內容。

工作總結:一文了解Docker 容器和VM的區別

Docker是一個本質上Linux應用程序。不過,Docker提供了易於使用的特點,可以在後臺處理VM的運行 。上面顯示了在Mac上部署docker應用程序的邏輯架構。

阿里的數據庫基本都已經做到了docker化,這其中在存儲、網絡、數據庫和docker本身都做了大量的優化。要想把整體服務docker化在技術上來講還是很難的。會用和用好難度是不一樣的。

[1]:https://play.google.com/store/apps/details?id=tech.ula&hl=en_US 需要翻牆

[2]:https://github.com/tianon/docker-brew-ubuntu-core/blob/9db8c72dd02e8f9fd5dba82ff9266174b088e2e6/bionic/Dockerfile?source=post_page-----94c558905b6----------------------

[3]:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html


分享到:


相關文章: