Docker 和一個正常的虛擬機器有何區別?

2022-11-24 23:07:12 字數 1802 閱讀 1216

原文

問:我多次重讀docker.io文件,希望搞明白docker.io和一個完全的虛擬機器的區別。docker是如何做到提供一個完整的檔案系統,獨立的網路環境等等這些功能,同時還沒有如此龐大?

為什麼部署軟體在一個docker映象(image)比部署在一致的生產環境上要容易?

答:當前,docker內部使用的是linux容器技術(lxc),這是執行在與它的宿主機器同樣的作業系統上。這准許它可以和宿主機器共享許多系統資源。它也會使用aufs作為檔案系統,也為你管理網路。

aufs是一個層狀的檔案系統,因此你可以有一個只讀部分和一個只寫部分,然後將二者組合起來。你可以使系統的共同的部分用作只讀,那塊是被所有容器共享,並且給每個容器自己的可寫區域

好吧,讓我們假設你有一個容器映象(image)容量是1gb,如果你想用一個完整的虛擬機器來裝載,你得需要容量的大小是1gb乘上你需要虛擬機器的數量。但使用linux容器虛擬化技術(lxc)和aufs,你可以共享1gb容量,如果你需要1000個容器,假設他們都執行在同樣的系統影像上,你仍然可以用稍微比1gb多一點的空間來給容器系統,

一個完整的虛擬化系統得到了分給它的自有全部資源,只有最小的共享。你獲得了更多的隔離,但是這是很龐大的(需要更多的資源)

使用linux容器虛擬化技術(lxc),隔離性方面有所缺失,但是他們更加輕量,而且需要更少資源。所以你可以輕鬆執行1000個容器在一個宿主機器上,甚至眼都不眨。試著用xen來實現那個,我想除非你有一個超級強大的主機,不然我看是不可能的了

一個完整的虛擬系統通常得用幾分鐘去啟動,linux容器虛擬技術(lxc)只要數秒,甚至有時時間更短。

對於每種虛擬系統都有反對者和支持者。如果你希望一個完全隔離的和資源有保障的環境,那麼完全的虛擬機器是你的選擇。如果你只希望程序之間相互隔離,並且希望大量執行他們在一個合理大小的宿主機器上。那麼linux容器虛擬技術(lxc)是你的選擇。

更多有關資訊,可以參考這些部落格,這非常詳細介紹了lxc的工作

"為嘛在docker映象上部署軟體比在一致生產環境上容易?"我覺得問這個問題是非常愚蠢的

部署一個一致的生產環境說起來容易做起來難。即使你使用了chef 和puppet之類的工具,像作業系統升級,還有一些其它的事情而造成的主機及環境之間的改變,往往是常有的事。

docker所做的事情就是賦予你一種能力,使你可以將os快照存入一個通用的映象,並使得在往其它的docker主機上部署時變得容易。對於本地,開發、質量管理、產品等等,都是用的同一個映象。當然你也可以用其它的工具來做到這一點,但是可能沒有這麼容易或者這麼快。

這對於單元測試是非常棒的。讓我們來看看你有1000個測試,而且都需要連線資料庫。為了不破壞任何事情,你需要一個接著一個的執行,以便這些測試不會相互影響(每個測試都在事務中,然後回滾回去)。使用docker,那麼你可以建立一個資料庫的映象(image),既然你知道這些測試會執行在相同的的資料庫快照下,那麼就可以並行地執行所有測試。既然這些測試都是並行執行在linux容器中,那麼他們可以同時執行在同樣的環境中。這樣你的測試會完成的非常快。試著用完整的虛擬機器來做這件事。

有趣!我覺得我仍然對於“系統快照”的概念有些模糊,如何沒有使用這些系統 映象(image)會怎麼樣啊?
好的,試著看我能不能解釋。你開始有個基礎 映象(image),然後進行改變資料,並且使用docker提交這些改變,這個會建立一個映象(image),這個 映象(image)只包含資料改變的部分。當你想執行你的這個 映象(image)你仍然需要這基礎 映象(image),然後使用層式的檔案系統,將你的映像置於基礎映像之上,這個例子中用aufs,aufs將不同層融合起來,然後你就會得到你想要的,你只要簡單執行就可以了。你可以增加許多的 映象(image),這些 映象(image)只會記錄改變的地方。