Docker這麼夯,但我在學生時代一次也沒玩過它,結果出了社會還是要自己把它玩起來QAQ
這一篇會講一些Docker名詞和簡單架構,只是想快速玩玩Docker或是已經有概念的可以直接跳過這篇XD
有一點一定要澄清!Docker真的不是Virtual Machine!!!
為什麼這麼說呢?就讓我們看下去~
首先,Docker的出現其實是為了在各種環境中能迅速的佈建應用程式(applications)。
Docker會將應用程式所需的環境和應用程式包在一起,而在新環境中只要能使用Docker,便能迅速使用被Docker包起來的應用程式。
蛤?你說這樣講很抽象?那我換個說法~
在沒有遊戲機的年代,假設你想要玩跳棋,你家就必須有跳棋的棋盤跟棋子;如果想玩圍棋,就必須有圍棋的棋盤跟棋子;如果想玩將棋;那你就得有將棋的棋盤跟棋子。
你想玩什麼(應用程式),就得有相對應的設備(環境部署)。當你需要越來越多遊戲(應用程式)時,家裡可能就會越來越擠(你的主機空間越來越小)。
另外需注意一點,不同的環境部署,很可能彼此之間還會互相影響。
譬如說,應用程式A需要python 2.3,但是應用程式B需要Python 2.6,這時候你就會很頭痛我到底該裝誰咧。
那Docker在上面的例子會對應到什麼呢?答案是一台多插槽的遊戲機~~~~~
家裡只需要一台遊戲機(Docker),而應用程式則被包成一個一個的遊戲光碟(Docker image),每按一次開始鍵,就可以有一個全新的遊戲(Docker container)可以玩。
如果你覺得遊戲的舉例讓你更看不懂的話,拜託,趕快忘掉XD
我下面乖乖的講白話文給你聽~
Docker Image
- 唯讀檔,不可被修改
- 包含作業系統OS和應用程式需要的工具
- 可以用來建立Container
Docker Container
- 透過Image執行起來的Process。一個Container指的就是在不可寫入的Image層的上方,加入一層可寫入層。所以多個Containers可以同時架在同一個Image之上。
- 在Container中擁有root權限,可以看作是沒有UI介面的Linux環境。
- 每個Container互相獨立不影響彼此。
你可能會覺得,蛤~這樣聽起來Docker還是跟VM一樣啊~
那我講一個差別最大的地方:
當我打開一個VM,在裡面做了一些設定和變動以後(譬如我寫入一個Hello.c)。關機之後再開機,Hello.c還存在。<=因為VM本身就是虛擬機器,本來就會記住你做的變動
但是Docker不一樣,假設我開了一個Container之後,寫入一個Hello.c。離開Container(不是刪除),再進入Container,Hello.c還存在。
但是如果我刪除Container,或是用同一個Image檔再跑起一個新的Container的時候,Hello.c都不存在了。
Docker Repository
- 集中存放Docker image檔案的倉庫
- 一個倉庫可能有多個image檔案(舉例來說,Ubuntu倉庫有多個版本號的Image檔)
- 有Public, Private, official等等的區別
Docker Registry
- 倉庫註冊伺服器,集中存放多個倉庫
- Docker Hub (可以想成GitHub的概念)
下面來比較一下VM跟Docker Container的整體架構
傳統VM的架構中有一層Hypervisor,也叫做Virtual Machine Monitor(VMM) - 虛擬機器監視器。
Hypervisor又可以分成兩種type:
|
別名
|
安裝位置
|
產品
|
Type 1
(Bare-Metal Hypervisor)
|
Native VM
|
直接安裝在空機或新機上
|
VMware ESX/ESXi、RedHat KVM
|
Type 2
(Hosted Hypervisor)
|
Hosted VM
|
必須安裝在OS上(例如Windows、Linux等等)
|
VMware Workstation、Sun VirtualBox、Parallels Desktop
|
而對應到Container架構,這邊就是Docker engine的部分。差別上,每個VM有自己獨立的Guest OS,但是Docker其實是共用Host OS的底層資源。
更直接一點的測驗方式,你分別在一台linux 32bit的VM和Container中,輸入 $uname -a 來查看系統的版本,你會發現Container中的系統資訊怎麼跟VM版的不一樣?其實這就是因為Docker Container是跟主機共用OS的啦~
看到這裡,應該心裡多多少少有一點底。VM跟Docker真的不一樣啦~~~~
只要你看完有這種感想,這篇就成功啦~~~
============== 參考分隔線 ==============
留言列表