我眼中的 Docker(一)docker、vm、lxc
前言
docker 是什麼?docker 能幹什麼?docker 為什麼這麼火?相信不少人都有這個疑問。我也有。覺得 docker 涉及到的技術太多了,從 linux 核心到各種雲端計算的解決方案,對於我來說實在是有點艱難的。然而學了一個月的 docker 相關的東東,還是想簡單談談,說一下我的理解,希望對 docker 的初學者有所幫助。
Docker 的歷史
當我們在談論一項技術的時候,經常會追溯它的歷史,這可以幫助我們更好地理解它是怎麼發展起來的,是為了解決什麼問題。
docker 起源於國外一家很酷的公司 dotclound, 2013 年在 Github 上開源並推進,專案吸引了世界範圍內大量的目光,社群非常活躍,許多巨頭也參與進來,而 dotclound 直接就把自己改名為 docker 了….
關於 docker 的開源發展可以詳細看這篇:
Docker 是什麼
那麼,docker 究竟是什麼?docker 是一個基於LXC 的高階容器引擎。聽起來是不是不知道在說什麼?簡單地說,docker 是一個輕量級的虛擬解決方案,或者說 —— 一個超輕量級的虛擬機器。你一定理解虛擬機器是什麼,那麼,你現在可以認為 docker 是一個秒級啟動的虛擬機器,可以輕易建立和刪除,就這一點,是不是酷斃了。
我們會經常看到這個 docker 的圖,它告訴我們,docker 是一種集裝箱式的工作方式。正如我們會將各種不同的貨物統一打包成一個個集裝箱,進行標準的管理和運輸,在 docker 的世界裡,我們把應用和應用所依賴的執行環境打包成一個個 image,然後分發到任意支援 docker 的平臺,就可以在這些平臺執行我們的應用,提供服務。
那支援 docker 的平臺有哪些?因為 docker 是基於 linux 的,在任意的 linux 發行版我們都可以原生地支援 docker,只要對應的核心版本大於 3.10 並且是 64bit,而在 Windows 和 Mac 中,我們可以通過 boot2docker 來執行 docker,這幾乎意味著,所有的主流平臺都支援 docker 的執行 —— 從此你不再需要為跨平臺而苦惱。
Docker vs VM
說起虛擬化,與 VM 的比較是離不開的,我們可以看看下面這張圖:
vm 的理念是在宿主的系統之上,自己虛擬了一個硬體平臺,然後執行一個不同的 OS。這意味著它要求很多的資源,在一臺機器上,你最多就跑幾個虛擬機器吧。
而 docker 是依託於宿主機提供的核心,僅僅把一個不同的 linux 發行版本所需的特性打包成一個 image, 這樣子當你執行一個 ubuntu 映象,你會感覺就是在一個 ubuntu 的操作環境裡,但實際呼叫的系統介面都是來源於宿主機。所以當你執行一些核心相關的命令時,你就會發現一些端倪,比如 uname -a, 這時給出的資訊肯定是宿主機的。
因為共用宿主機的核心,所以 docker 所需的資源也很少,效能開銷很小,通常可以在秒內啟動,有些已經可以做到毫秒內啟動了。在一臺機器上,你完全可能做到同時執行上千個 docker 的容器。
docker 的執行方式也讓我們對 VM 的理念產生質疑,假如我們需要虛擬一個不同的執行環境,是否需要一個完全新的系統?其實我們要的只是執行一個應用所需的依賴環境,不是嗎?
總的來說,docker 拋棄傳統 VM 試圖模擬完整機器的思路,本著“面向應用”的核心理念,以應用為單元進行”集裝封箱”。
Docker vs LXC
LXC 是什麼?LXC 就是 Linux Container,官網。 LXC 也是一種輕量的虛擬技術,Linux 原生支援的容器。可以說 docker 就是基於 LXC 發展起來的,提供 LXC 的高階封裝,發展標準的配置方法。
LXC 的定位是替代傳統的虛擬機器,側重於提供一個個作業系統,如 Ubuntu、Debian等。Docker 是面向應用的,官方提倡一個容器即是一個應用,以應用為中心。所以,docker 還提供了統一的打包部署方案,即 Dockerfile, 還有版本控制,image 複用,遠端倉庫以供映象共享等。
可以說,LXC 只是 Docker 的底層技術之一,而 Docker 已經在此之上發展出了一個生態系統,如果有另一種容器虛擬技術的話,也許 LXC 也只是配置檔案裡的 option 選項,libContainer 專案就是在做這樣的事情。
Docker 在解決什麼
看到這裡,你應該對 docker 在解決的問題有一些模糊的概念,我們不妨總結一下:
- 簡化配置。在容器中開發完成後快速部署於各主流系統,解決了地獄依賴問題,再也沒有了“在我電腦明明可以執行”的情況。
- 機器資源利用率的提高,不需要為虛擬一個環境而耗費大量資源。
- 改變了傳統應用交付的方式,軟體的開發和管理從部門間的裝配和除錯轉換為部件的簡單替換。
- 軟體的管理和共享從程式碼層次嚮應用層次上升。
- 給了我們更多的選擇自由性,使軟體架構更加靈活。詳見:這裡
也許以後 docker 成為了新的軟體管理模式,我們不會再看到開發人員為每個不同發行版本編寫配置檔案,處理複雜的系統依賴。無論我們需要什麼服務,我們只需要安裝 docker,然後 pull 一個映象到本地就可以了。事實上,我們已經開始看到這種趨勢了,畢竟 docker 作為開發和測試來說都太方便了。
至於 docker 在叢集自動化部署中的意義,我還是直接分享這篇文章吧:閒談叢集管理模式
有點長了,下一篇見。