Virtual Machine 的工作是模擬出一台真實的 OS 系統,包含硬體操作,網路操作與軟體運作,如果你要用虛擬機器,實作線上的環境,那麼你可能需要建一台 VM 當資料庫,一台 VM 當 Web Service ,一台 VM 當 Backend Service ,再建一台 VM 來跑 CronJob 與離線作業,總共是四台 VM ,你每建一台 VM ,就要分配給它一些硬碟空間跟 Memory,所需的資源會非常巨大。
而 Docker 是一個 Virtual Environment (VE) 的工具,Docker 不需要模擬一台真實的作業系統,Docker 會建立一個 Container ,每個 Container 的 image 與 application 是獨立的,各 container 只需要執行必要的程式,不像 VM 必須實作一整台作業系統 ,Docker container 會真接使用 Docker Host 的資源(CPU, Memory),需要多少就使用多少,而也因為 Docker container 之間的資源是共享的,所以 Docker 的獨立性沒有 VM 這麼高。
Docker 有多好用呢 ?
Docker 不只是虛擬環境這麼簡單,它做得跟 Git 很像,還支援 OS commit 功能,你可以將 container 有修改過的檔案系統, commit 到 image 裡,而下次再打開 container 時,就會直接回到上一次 commit 的狀態,有了 commit 的過程,我們就可以有每台機器的歷史記錄,當系統出現問題或 Bug 時,也能很輕鬆的將系統還原,另外 Docker 可以建一個 Dockerfile 的設定檔,透過 Dockerfile 我們可以重新建立一個新 image ,也就是說我可以將 Dockerfile 分享給我的同事,讓我的同事也能快速的建立一個跟我一樣的環境。
想想 100 個工程師的開發團隊,每天每個人都在開發環境上的修改程式,哪一天環境突然壞了,要找到問題是非常的困難,有時還要去訪問這 100 個人最近修改了什麼,如果我們使用 Docker 來建立開發環境,就可以 20 分鐘重新建立一個開發環境,另外使用 Docker 不用考慮硬體與 OS 的問題,省去了處理這兩個問題,可以減少很麻煩,例如在 Ubuntu, RedHat, Debian, CentOS 等等不用 OS ,很容易會遇到 OS 不同,而程式有不同的執行結果。
以前我要複製一台 VM 的話 ,大約要花 二個小時,開啟一台 VM 也要花個 30 秒以上,現在改用 Docker 之後,重製一個 Image 大約也只要 20 分鐘,開啟 container 不到 3 秒就完成了,真的方便很多。
Docker 可以用來做什麼
- 自學/教學 - Docker 環境乾淨,又可以快速建立一個全新的 OS,學員也可以很容易的建立出跟老師一樣的系統。
- OS Version control
- 摸擬線上環境,建立出自已的開發環境。
- 建立測試環境,測試不用版本的程式,是否能正常執行 unit test ,例如在 php4, php5, php7 中執行 unit test。