Docker 算是近年來 Developer 與 DevOps 圈的大事,它改變了 Developer 的開發方式,也改變了 DevOps 佈署方式。
Architecture
Virtual Machine
透過 hypervisor 在一個 host os 上執行眾多 guest os。
Docker Container
透過 Docker 在一個 host os 上執行執行眾多 app。
可以發現 Docker 與 VM 最大差異在於 Docker 不需執行 guest os,因此速度比 VM 快很多,也更節省 resource
Why Docker ?
Q : Docker 都是 DevOps 圈在推的,跟 developer 有什麼關係 ?
Docker 的確是 DevOps 圈在推的,但事實上 Docker 對於開發有很多優點 :
Server 跑的是 Linux
macOS 與 Windows 基本上都屬於 client 端 OS,有大量的工具加速開發,硬體 driver 支援完整穩定,macOS 只是比較接近 Linux,一些 Linux 的 service 較容易移植到 macOS 而已,但本質上 macOS 與 Linux 仍然是不同的。
所以無論在 macOS 或 Windows 開發,最後還是要在 Linux 上執行,最常見的問題就是 :
我在本機測試都沒問題,但上 Linux 就掛了
主要的原因就是 Linux 上的環境與 macOS 與 Windows 不同,因此在開發時,你無法發現這個錯誤。
若開發環境能使用與 server 完全相同的 Linux 環境,問題就解決了,不過 Linux 對硬體及開發環境比較不友善,不適合當 client 端 OS,因此在 macOS 或 Windows 可以透過 Docker 虛擬出 Linux 環境,讓開發與上線環境相同。
Server 安裝設定複雜
以前都必須手動安裝設定 server,假如只有一台 server 還好,但若有上百台以上 server 需要設定時,這將是個苦差事。
目前各大 server 官方都會提供 Docker image,只需以
文字檔
描述設定所需 server,就可以疊積木
方式,快速將上百台以上 server 設定好。一些 server,如
Nginx
、PostgreSQL
、Redis
…等安裝並沒有想像中簡單,developer 光設定環境就要花很多時間,但打包成 Docker 後,其他人可快速建立環境。Docker 速度快且省電
之前為了在 macOS 或 Windows 使用 Linux,最流行的就是 Vagrant,這是一個完全 VM 的技術,但它也有不少缺點 :- 記憶體 : 需 2GB 以上記憶體
- CPU : 只能有 50% ~ 70% 的 CPU 速度
- 耗電 : Macbook Pro Retina 15” 若使用 VM,大約只剩下 3 hr 的電力
但 Docker 完全沒有這些問題,用起來感覺跟原生 macOS 或 Windows App 一樣省電。
Docker Desktop for Mac
在 macOS 上只需安裝 Docker Desktop for macOS 即可,同時包含薄薄一層 Linux 與 Docker 角色。
Docker Desktop for Windows
在 Windows 10 Pro 要透過 Hyper-V 提供 hypervisor 功能,Docker Desktop for Windows 則包含薄薄一層 Linux 與 Docker 角色。
Q : Docker 在 Windows 與 macOS 還是需要 Linux VM,既然都是 VM 技術,那還是一樣慢 ?
Docker 目前的確是要透過 Linux kernel 才能執行,因此 Windows 仍然需要透過 Hyper-V 或 VirtualBox 才能跑 Docker,但 Docker engine 是一層很薄的 Linux,並不是如 Vagrant 裝的是一整套 Linux,因此很省記憶體,對 CPU 耗損也不大,重點的是還非常省電。
Conclusion
- Docker 有別於 VM,是以 application 形式執行;而 VM 是以 guest os 形式執行
- 也因為 Docker 不需 guest os,所以執行速度快,CPU 耗損也小,還很節省 resource