news banner

相信只要是IT公司一定會遇到以下情境:

情境一:

開發人員(RD):我的程式寫好並打包了,麻煩幫我安裝到客戶的電腦。

維運人員(SE):好的,已安裝完畢。

這情境當然是最好的情境,可惜現實總是殘酷的…

 

情境二:

維運人員(SE):我把你給的安裝包放在客戶的電腦安裝,怎麼跑不起來。

開發人員(RD):怎麼可能!在我的電腦執行沒問題呀!

這情境大家一定並不陌生,有可能開發人員可能漏包程式檔案,也有可能是維運人員遺漏參數設定,最慘的情境是客戶的電腦做了特殊的設定讓所有人白忙一場…。許多公司往往會消耗大量的人力和時間在解決開發與維運之間的鴻溝。

 

2013年,Docker的出現迅速席捲全球IT界,容器技術不只打破傳統開發者的開發思維,更推翻運維人員舊有的維運模式。IT巨頭Amazon、Microsoft、Google、IBM、RedHat等紛紛表示支持容器技術,Microsoft甚至承諾要讓Windows能支援和Linux同一套容器標準,目前Windows 10以及Windows Server 2016已經能順利運行Docker,Docker幾乎成為容器的標準。

事實上,容器技術的出現最早可追朔至1982年的Unix系統內建的chroot機制,1998年的FreeBSD jails、2005年的OpenVZ以及2008年的LXC(Linux Container)等在作業系統內建立孤立虛擬執行環境的作法,都可稱為是容器的技術。

 

傳統的虛擬化技術如虛擬機器(Virtual Machine)(圖一)往往需要在原本執行的實體作業系統(Host Operating System)上安裝一個虛擬作業系統(Guest Operating System),虛擬機器利用軟體模擬出CPU和記憶體等功能,讓虛擬作業系統(Guest Operating System)以為執行在實體的機器上。

 

Virtual Machine

圖一:虛擬機器(Virtual Machine)

 

傳統虛擬機器(Virtual Machine)安全性高,虛擬作業系統(Guest Operating System)之間彼此不知道彼此的存在,若Guest OS損毀也不會波及Host OS。但相對的缺點是需要消耗非常多的系統資源,常常一個虛擬機器的執行就需要佔據4 GB以上的記憶體以及20 GB以上的硬碟空間,建立虛擬機器往往也需要花費數十秒至數分鐘,等待虛擬機器開機的時間也是非常漫長。此外,虛擬機器與Host OS之間需要透過一層Hypervisor(注一)進行溝通,Hypervisor也需要消耗相當程度的系統資源。

 

相對于傳統的虛擬機器,容器直接將所需的程式庫、環境直接打包成容器映射檔。容器透過Linux Namespaces機制(注二)建立獨立的程式執行環境,同時使用Linux Cgroups(注三)技術限制每個容器能使用的系統資源,這使得容器能共用Host OS的所有資源。LXC(Linux Container)便是將這些Linux技術加以封裝成為Linux容器技術的基石。容器省去了Guest OS和Hypervisor這些多餘的資源消耗(圖二),專注在程式庫的打包,啟動速度也在不需要額外的Guest OS後只需要幾毫秒就可啟動完畢。LXC雖然可以建立及運行容器,但由於使用門檻較高、設定麻煩,沒有得到太多的市場關注。

 

Virtual MachineDocker

圖二:虛擬機器(Virtual Machine)與Docker容器比較

 

Docker將原有的LXC重新封裝使得更簡易上手,只需要一行指令便可輕鬆建立Docker容器環境。同時結合了映射檔管理(圖三),使得程式庫以及系統參數在打包後可以輕鬆移植,不再出現任何開發環境與執行環境不一致的問題。開發環境、測試環境、維運環境都在同一個容器的環境下運行,只要執行的電腦上有安裝Docker,環境就可以享有快速移植、部署的方便性。搭配Docker Hub結合雲端映射檔的使用,讓開發者能簡單的共用Docker映射檔,只要透過Docker Hub,大家都可快速下載映射檔並建立應用程式的容器。方便映射檔管理、分享與重用使Docker迅速席捲整個IT界,改變開發與維運之間的鴻溝。

 

Docker cn

圖三:Docker的映射檔管理

 

Docker自出現以來,迅速累積龐大的生態圈(圖四),幾乎在Linux上常用的軟體幾乎都支援Docker,許多為容器而生的解決方案也紛紛出現,其中以容器編排(orchestration)工具如Google的Kubernetes、Mesosphere的Mesos和Docker公司的Docker Swarm最受矚目,開發者可透過容器編排工具輕易的部署多幾環境,建立自己內部的私有雲。公有雲方面,各家公司如Amazon的ECS(Amazon EC2 Container Service)、Microsoft Azure的Azure Container Service、Google的GKE(Google Container Engine)等也提供了方便客戶直接運行容器的功能。

 

Docker的成功在於提供了更友好的使用者介面,讓每個人都可以使用到容器技術所帶來資源隔離、快速啟動的好處,以及透過Docker Hub共用映射檔,方便使用者快速建立任何應用程式環境。各大IT巨頭對容器化技術的高度投入也確保了容器是IT產業無法逆轉的趨勢,目前各大中小企業也紛紛開始導入容器化技術,減少不必要的資源浪費,讓開發到部署變得高度流暢,IT公司導入容器技術可說是勢在必行。

 

Docker 2

圖四:Docker生態圈

 

*注一:Hypervisor用來執行與維護Guest OS的虛擬作業平臺,如VMWare、Virtual Box、KVM等,負責管理Guest OS與Host OS之間的資源分享與通訊。

*注二:Linux Namespaces機制能將Linux環境彼此隔離,目前有Mount namespaces、UTS namespaces、IPC namespaces、PID namespaces、Network namespaces、User namespaces。這技術能使每個執行的程式以為自己在獨立的環境下運作而不互相干擾。

*注三:Linux Cgroups用來限制每個執行的程式能使用多少的CPU、記憶體、硬碟IO等資源以避免每個容器使用過多資源導致系統資源不足。

 

參照:

圖一:https://www.geekwire.com/2017/review-parallels-desktop-12-mac-shows-virtual-machine-matters/

圖二:https://image.slidesharecdn.com/dockerfromscratch-160208083101/95/docker-from-scratch-9-638.jpg?cb=1454920342

圖三:http://note.drx.tw/2016/07/virtualization-with-docker-container-basic-for-f2e.html

圖四:http://collabnix.com/archives/740

 

作者:德鴻科技 研發部 Tony