iT邦幫忙

3

Week23 - 用Minecraft來說明Docker為什麼這麼香 - 概念篇 [Server的終局之戰系列]

本文章同時發佈於:


大家好,繼上次Week22 — 用Redis來幫Line bot髒沙發設計一次性功能 — 實作篇的文章後,我些人私下來詢問我

Docker是什麼?為什麼要拿他來起動Redis,直接安裝Redis不好嗎?

之類的問題。

所以這次就來介紹Docker,告訴大家為什麼Docker會成為一個讓許多人準時下班的好東西XD。

我會用Minecraft與實際遇到的問題來說明,這樣大家可能會比較有感覺。

先來看看我們遇到的問題

小林有一天,想與小昌一起玩Minecraft,於是到了官網下載了Minecraft ServerJava執行檔,運行之後,快樂的與小昌完了數週。

有天小昌問:「欸欸,聽說新版出了,我們把原本舊版的Server留著,然後新開一個新版的Server,兩個版本我都要,何樂而不為?」

於是小林再起了一個Server,於是爆炸了

我們可以看到有關鍵的一行錯誤訊息:

adp$a: /Users/chenyoulin/Downloads/./world/session.lock: already locked (possibly by other Minecraft instance?)

already locked就是指Minecraft Server所使用的資源已經被鎖著,不能再給其他程序讀寫了,導致新的Server開不起來。

為什麼要防止資源被不同程序讀寫呢?

因為要防止Thread同時對同比資料做寫入,導致錯誤的結果

Image from http://bigdata-guide.blogspot.com/2014/01/what-is-race-condition.html

比如說上圖,Thread AThread B同時讀取了17這個數字,Thread A在加1時,Thread B並不知道,所以Thread B還是以17來加1,導致明明AB總共加了兩次,答案卻是18。

Minecraft Serveralready locked也是要防止這個問題,來避免Server的資源被功用,不然就有可能發生同時砍一格樹,卻掉出兩格的狀況。(等等這樣好像不錯?)

你可能會說,其實小林把「新版的Minecraft Server移到別的資料夾就不會共用資源了啊」。

是的,你說的沒錯,但是Server的世界裡,其實很常出現共用的狀況。

比如說Python2 Server可能用著Linux的一個核心模組A,而Python3 Server又用著此新版的核心模組A+。

那問題來了,現在有台Linux主機有兩個Server分別是用Python2 ServerPython3 Server所寫,就會碰到以下狀況:

  • 不更新Linux核心模組A可以正常用Python2 Server,但Python3 Server就無法使用。
  • 更新Linux核心模組A可以正常用Python3 Server,但Python2 Server就無法使用。

這種狀況很難像Minecraft Server單純移到別的資料夾那麼簡單,因為這個核心模組A又會與一大堆核心模組B, C, D...相依。

怎麼解決

如果你有想到

是否可以用VM來解決?就是一台裸機Linux裡面再灌一個灌Linux

那麼你想對了,透過這個方法我們就跟「移到別的資料夾」一樣,我們把共用的核心模組A複製了一份到VM裡了。

但...好像不止複製了核心模組A而已。

所以有沒有辦法

只複製我想要的模組至這個「隔離資料夾」,而其他的東西照舊用裸機Linux的呢

答案就是Docker!

聰明的Dokcer

傳統的VM透過在裸機系統上安裝Hypervisor,來再啟動與裸機隔離的系統,這種做法除了原本要替換的模組,其他連整個系統模組也都複製進了此空間。

Docker則是在裸機系統上製作名為namespace的「隔離資料夾」,只把要替換的模組放進此隔離空間,其他模組還是用原本裸機的。

我們可以來數數這兩種做法的系統數量,因為直觀的感受就是越多系統電腦越卡XD。

Image from How does a Docker engine replace a hypervisor and guest OS?

  • VM: 4
  • Docker: 1

所以Docker在效能上是完勝,Docker效能消耗極少,因為他沒有Hypervisor這層監視人員來分配資源,Docker就像原生的Minecraft Server一樣跑在裸機Linux上,但他卻可以把資源隔開。

因為這樣的特色,所以你電腦如果可以啟動10個Server的效能,那放在Docker裡面跑也是沒問題的,而且資源可以隔離。

Docker可以取代VM嗎

前面說了很多Docker的優點,現在來說說缺點。

我們將核心模組A放入隔離空間後,可以確保此資源不會被共用,但是如果這個核心模組A把Linux核心的主程式檔刪掉了呢,那整個Linux就爆炸了。

因為Docker本身就只有須要替換的東西放入隔離空間內,所以如果你的需求是「隔離空間完全沒有機會觸碰到裸機的資源」,那就需要VM,因為核心是VM自己的,要訪問任何裸機資源也會被Hypervisor控管。

除了Linux以外,Docker在Mac或Windows上運作都是用作在VM中

這可能不太算缺點,因為Docker本來就是為了Linux而生。

剛剛前面有提到Docker會用Linux的核心模組,所以如果Mac或是Windows想用Docker,那就是要先安裝一個Linux VM

當然,MacWindows已經將這個Linux VM在安裝時一同優化至系統中,我們不需要手動安裝他,但是因為Linux VM我們就沒辦法擁有Docker幾乎不耗資源的。

所以,如果你是Mac或是Windows,那麼Docker是僅較適合用在「開發上」,如果要用在真正發佈出去的Server,要使用Linux系統才能發揮Docker的好處。

結論

Docker讓隔離資源變成一個非常不耗效能的事情,以前我們想到要開VM來隔離Server,就頭很痛,光是安裝Linux就要半小時了。或者說要開10個VM,那幾乎是來燒機的XD。

但現在有了Docker,我們可以用幾乎與裸機Linux一模一樣的速度來開啟隔離Server,效能也幾乎與裸機Linux相同。

省了這麼多時間,能提早下班回家睡覺,這能不香嗎!


有了這些概念後,接下來我跟大家介紹怎麼實作DockerMinecraft Server

謝謝你的閱讀,也歡迎分享討論指正~

參考與引用資料


尚未有邦友留言

立即登入留言