Docker 是什麼?他和 VM 的差別在哪裡?

古古

2024/09/03


作為軟體工程師,大家可能多多少少聽過什麼是 Docker,但是卻不了解 Docker 實際要解決的問題是什麼、以及他和 VM 之間的區別。

所以這篇文章就會來介紹一下,到底什麼是 Docker、什麼又是 VM,並且他們兩個之間的差別又是什麼,那我們就開始吧!

什麼是 VM? #

在了解 Docker 之前,一定要先了解什麼是 VM 才可以,所以我們先來介紹一下 VM 是什麼。

VM 的全稱是 Virtual Machine,中文翻譯為「虛擬機」,而 VM 要解決的問題,就是要達到「硬體資源的共享」。

在很久以前 VM 還沒被發明出來的時代,這時候如果我們想要在一台電腦上運行程式,那我們首先要做的,就是要先帶著你的錢錢,先到 3C 商店買一台實體的電腦回家之後,你才能夠在那台電腦上面運行你所寫的程式。

所以在 VM 被發明出來以前的時代,我們所有的程式,就都是直接運行在實體的主機上。

不過隨著網路的發展,大家就漸漸發現,每次在運行程式之前,都還得要提前去買一台實體的電腦,這真的是太麻煩了!所以大家就開始思考:「我們是否能夠讓一台實體的電腦,分身成無數台電腦?」,這樣子我們就再也不用提前去購買實體的主機了,只要按一下按鍵就可以生成一部新的電腦出來。

而正是這個想法,就造就了 VM(虛擬機)的出現了!

所謂的 VM,就是將「一台實體的主機」,拆分成「許多個作業系統」的技術。 所以舉例來說的話,假設我們有一台超強的實體主機(64 核 cpu、128 GB ram),那麼我們就可以透過 VM 的技術,將這台實體主機「拆分」成是三台電腦,而每一台電腦,我們就可以自由的選擇我們想要灌哪個作業系統。

所以像是在下圖中,在 VM 虛擬機 1 這台電腦上,我們可以灌 Linux 這個作業系統;而在 VM 虛擬機 2 這台電腦上,我們可以灌 Windows 這個作業系統…等等,所以當我們使用了 VM 之後,我們就只要購買一台實體的主機,就可以拆分成許多台小電腦出來,因此就達到了 「硬體資源的共享」 了!

使用 VM 的注意事項 #

在使用 VM 時,因為 VM 本質上是去共享一台實體主機,所以所有 VM 的運算資源,都是從實體主機上面瓜分出來的。

所以像是在上面的例子中,假設實體主機的運算能力是 64 核 cpu、128 GB ram,那麼 VM 1 可能只會分到 2 核 cpu、4G ram,VM 2 可能會分到 4 核 cpu、8G ram…等等,每一台 VM 都可以依照自身的需求,去和實體的主機請求適量的運算資源。

也因為 VM 的運算資源都是從實體主機上面瓜分出來的,所以一台實體主機能創建的 VM 也是有限的,沒辦法無限的創建下去,所以萬一 VM 的需求越來越多的話,仍舊是會需要我們提前去購買新的實體主機回來的。

補充:常見的 VM 例子 #

其實大家平常在用的雲端服務,就是 VM 最常見的用法。像是我們可以用滑鼠點一點,就能夠在 AWS 中去租用一台 EC2 的 VM 出來。

像是在下圖中,AWS 預設就是租用 t2.micro 的 VM 給我們,所以這一台 VM 就是擁有 1 核 cpu、並且有 1G 的 ram,而運行這台 VM 的實體主機,就是 AWS 提前採購好的實體主機。

OK 所以到這邊為止,我們已經了解到什麼是 VM 了,所謂的 VM,就是要達到「硬體資源的共享」。

那麼在了解了 VM 的概念之後,接著我們可以來了解一下,什麼是 Docker?他和 VM 又有什麼差別?

什麼是 Docker? #

如果說 VM 的目的,是為了要達到「硬體資源的共享」,那麼 Docker 的目的,則是要達到「應用程式的隔離」。

大家可以想像一個情境,假設你今天上網看到了一段爬蟲程式,然後你想把他載下來使用,但是這段程式要求要使用 Python 2.x 的環境才能夠運行,所以你為了運行這段程式,你就努力的在你的電腦上安裝好 Python 2.x 的環境,最後就成功的運行了這段程式。

但是,當你好不容易處理完環境的問題之後,假設你又要執行另一段網頁程式,他所需要的是 Python 3.x 的版本,這時候你又得大費周章,努力的去研究要怎麼將 Python 2.x 更新到 Python 3.x、以及怎麼樣同時在你的電腦上安裝 Python 2.x 和 Python 3.x 的開發環境。

這時候,你可能心已經累了,你明明只是想去運行網路上的那段程式而已,但是你卻得花非常多的心力,去處理架設開發環境的設定。

所以為了解決這個問題,Docker 就被發明出來了!

所謂的 Docker,他的目的是要達到「應用程式的隔離」,所以在你的電腦中,就會有很多個「容器」存在,每一個容器都是一個箱子,裡面會放置你想運行的程式、以及該程式需要的開發環境,並且每一個箱子之間不會互相干擾。

所以像是在下圖中,在 VM 1 這個 Linux 的作業系統裡面,我們就可以創建許多個 Docker 容器出來,而每一個 Docker 容器,我們都可以安裝不同的開發環境、並且運行不同的程式,這樣子就可以達到開發環境之間的隔離,進而節省我們反覆架設開發環境的時間。

所以舉例來說的話,我們就可以將「爬蟲程式 + Python 2.x 的開發環境」,放置在 Docker 容器 1 裡面,而我們也可以將「網頁程式 + Python 3.x 的開發環境」,放置在 Docker 容器 2 裡面。因此當我們之後想要執行爬蟲程式的時候,就直接去運行 Docker 容器 1 就好,而如果我們想要運行的是網頁程式,那就是改成運行 Docker 容器 2。

所以透過 Docker 容器的概念,我們就可以達到「應用程式之間的隔離」了!

有了 VM 之後,我們還需要 Docker 嗎? #

在了解了 VM 和 Docker 的概念之後,接著我們也可以來討論一下一個很常見的問題,那就是:有了 VM 之後,我們還需要 Docker 嗎?

在看完了上面的介紹之後,大家心裡可能會有一個疑惑,就是上述的 Python 環境的問題,我們創建兩個 VM 出來,不就也可以解決了?譬如說我們可以創建一個 VM 1,裡面安裝 Linux 的作業系統,並且安裝 Python 2.x 的環境,然後我們也可以再創建 VM 2,裡面也是安裝 Linux 的作業系統,但是改成安裝 Python 3.x 的環境,這樣不是也能解決上面的開發環境的問題嗎?

確實透過創建兩個 VM 的方法,是可以解決 Python 的環境問題沒錯,不過相較來說,Docker 的解法會更加輕量化。

因為對於傳統的 VM 來說,每一個 VM 都需要安裝一個作業系統(ex: Linux),然後才能在這個作業系統上面安裝 Python 的開發環境。但是在作業系統中,其實是包含非常多的功能的(ex: 操作介面、驅動程式、網路管理…等等),所以每當我們創建一個 VM 出來,就必須要一起創建這些我們根本用不到功能出來,所以我們就會浪費不少的運算資源,在維護這些不必要的功能上。

而 Docker 之所以可以更加輕量化,是因為他是在同一個作業系統底下,去創建許多的容器出來,然後再在每一個容器中,各自去安裝需要的開發環境。所以這些容器,他們就會共享同一個作業系統的所有功能,所以我們就不需要重複去安裝驅動程式這類的功能,因此就可以節省許多的運算資源,降低 cpu 的負擔了。

所以 Docker 之所以這麼好用,就是因為他除了能夠達到「應用程式的隔離」之外,同時他也能達到「作業系統的共享」,所以 Docker 容器們能夠去共用同一個作業系統的共通部分,這樣子就不用再額外花費多餘的運算資源,重新蓋一套作業系統出來,進而就可以降低 cpu 的負擔了。

所以如果你只是想要隔離不同的應用程式的話,那就非常推薦使用 Docker 來解決,而如果是想要直接操作底層的作業系統的話,那就推薦使用 VM 來解決,因此大家就可以根據自己的需求,決定要使用哪種方式來實作了。

VM 和 Docker 總結 #

所以總結上面的介紹的話,最後可以歸納出下面這張表格:

VM 虛擬機 Docker 容器
用途 達到「硬體資源的共享」 達到「應用程式的隔離」,並且同時達到「作業系統的共享」
優點 能夠直接操作底層的作業系統 執行起來更輕量化
缺點 運算資源負擔較大 需要了解如何撰寫 Docker file、如何管理 Docker 集群
適用情境 所有情境皆適用 所有情境皆適用

所以 VM 和 Docker,他們並沒有誰好誰壞,就單純是根據不同的使用場景,而有不同的選擇而已,只不過如果要使用 Docker 的話,確實會需要具備比較多相關知識。

不過在實際的工作中,通常是會交由 DevOps 維運工程師,負責管理 Docker 的相關設定,所以我們身為後端工程師,就只要了解 Docker 的概念、以及知道他所解決的問題是什麼就可以了,至於詳細的 Docker 操作,就再請教公司的 DevOps 大大就可以了😆。

如果大家對 Docker 有興趣的話,也可以到 Docker 的官方網站 下載 Docker 來玩玩看~現在的 UI 介面都做得很親民了😆,多了解一點總是不吃虧的對吧!

結語 #

這篇文章我們有分別的去介紹了什麼是 Docker、什麼是 VM,以及他們之間的差異在哪裡,希望可以透過這篇文章,讓你更了解 Docker 和 VM 的概念!

如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!