fbpx

Docker 是什麼?Docker 基本觀念介紹

Docker 是什麼?

Docker 是一種開源軟體平台,它的構想理念是「Build and Ship any Application Anywhere」,意即讓開發者在虛擬環境中,開發、部署和管理任的何應用程式。Docker 的輕量化特性,提供應用程式獨立的測試環境。讓使用者只需專注於應用程式的開發,為他們省下建置環境的時間與精力。 

docker logo

為什麼要使用 Docker

(一)在主機上快速部署

由於 Docker 容器具有跨平台可攜性,並且共享作業系統中的資源,它相較虛擬機更為輕量。在相同資源下,能執行容器數大約是虛擬機的 5 到 10 倍,能夠提高開發者的工作效率並節省資金。

(二)版本控管和物件重複使用

Docker 讓使用者能夠儲存不同的版本的歷史紀錄,使用者能夠依照自己的喜好回滾(Roll Back)至最合適的版本。開發人員只需將環境設定好,就能使用先前保存好的容器,達到重複使用的目的。

(三)更有效率的 CI/CD 流程

Docker 幫助開發人員在任何環境下測試程式碼,協助他們在應用程式開發初期就能找出錯誤。利用 Docker 易與其他工具整合的優勢,開發人員能將 GitHub 和 Jenkins 整合至 Docker 中。只需將程式碼交付至 Github,再由 Jenkins 進行自動化佈署,就能夠快速地建立映像檔。開發者還能將映像檔上傳至 Docker Hub 來解決不同版本間環境不相容的問題。Docker 能夠簡化開發部署流程、減少環境建置的時間,以及讓開發人員同時執行多個測試。

Docker 結合 CI/CD 流程進行自動測試與部署

開發人員讓 Docker 融入 CI 流程的一種方式是,開發者在建立完應用程式後,透過 CI 伺服器建立 Docker 映像檔,再將應用程式裝入映像檔,最後再上傳到 Docker Hub。開發者能夠在另一台主機上,不論是在 QA、DEV 或正式環境,從 Docker Hub 上存取映像檔並運行容器,在 CI 伺服器中,開發者甚至能在創建映像檔的過程中,完成編輯和測試。

虛擬化技術是什麼?

在認識 Docker 前,我們必須先了解何謂虛擬化?簡而言之,虛擬化技術想解決的核心問題是,不同電腦的作業系統與硬體資源配置不相容。舉例來說,今天我開發了一款應用程式,經測試後,它能夠在我的地端環境中正常運行,但如果我想將它安裝至其他環境或部署至雲端。我就必須建置相同的環境,和配置相同硬體資源,例如:伺服器、CPU、資料庫、擴充程式等等。

然而,這種「例行公事」往往需要耗費大量時間,而且沒人能保證你的程式在新環境中能夠正常運作。因為不同環境使用的作業系統不盡相同,即便同樣使用 Linux,不同版本間也存在著些微的差異。而虛擬技術的問世就是為了解決這種「明明在我的環境中能運作,但搬到其他地方就壞掉」的問題。

目前常見的虛擬技術有兩種,一種是以處理作業系統為單位的虛擬化技術,我們將它稱之為虛擬機(Virtual Machine),著名的代表有 VMware; 另一種是以 APP 為單位的虛擬化技術,我們將它稱為容器化(Containerize),著名的代表有 Docker Container。下文將為各位分別介紹這兩種技術

虛擬機(VM)

VM 是一種體積龐大且耗能高的軟體套件。VM 會模擬底層的主機資源(CPU、RAM、Storage),將資源分配給上層的應用程式使用。在 VM 的架構中有一層名為 Hypervisor 的平台。這種平台被用於管理硬體資源的使用和分配。簡單來說,Hypervisor 讓使用者能夠在作業系統上(Host OS)增加另一個作業系統(Guest OS),並且讓這兩種作業系統相互協作。每個 VM 包含操作系統、應用程式、必要的二進製文件和系統函式庫的完整副本-容量大約為 10 GB,因此 VM 啟動的時間會較為緩慢。

container-vm-whatcontainer

容器化(Containerize)

容器化是一種在概念上相似於虛擬機,但在原理上略有不同的技術,其主要目的在於提供開發者用於測試應用程式的沙盒環境。開發者將想測試的應用程式與 Dependency(相依性資源)封裝於容器進行測試。容器化與 VM 的相異之處在於,由於容器不會模擬系統底層的基礎架構,因此需耗費的資源也相對較低。開發者能夠在容器內配置不同的資源,因為每個容器都獨立運行且彼此之間不會互相影響。

譯註: Dependency(相依性資源): Dependency (相依性資源)在這邊泛指 system libraries(系統函式庫)、External Third-Party Code Package(第三方代碼套件)。

docker-containerized-appliction-blue-border_2 (Demo)

容器(Container)VS 虛擬機(VM)

雖然容器和虛擬機具有類似的功能及優勢,但其實它們被用於處理不同面向的問題,VM 的主要功能是作業系統的虛擬化,容器主要的功能是虛擬化操作系統,因此容器相較於 VM 更容易攜帶,也更高效。

以下表格為容器與虛擬機的對比

功能 Virtual Machine Docker Container
虛擬化的目標 作業系統 應用系統
啟動時間 久(幾分鐘) 短(幾秒)
容量 GB MB
耗費資源 較多 較少
複製相同環境
服務內容 大型專案服務 多使用於微服務中

組成 Docker 的重要元素

在了解虛擬技術的基本觀念後,我們將在這段剖析構成 Docker 的重要元素,讓大家對 Docker 元素間的工作流程有更全面的了解。

Dockerfile

開發人員在使用 Docker 時發現,大多現成的 Docker 映像檔無法滿足他們的需求,因此需要一種能夠生成映像檔的工具。Dockerfile 是一種簡易的文件檔,裡面包含了建立新映像檔所需的指令。

Dockerfile 語法主要由 Command(命令)和 Argument (參數選擇)兩大元素組成。以下是一個簡易的 Docker file 示意圖:

命令式語法+選擇參數(Command + Argument)

dockerfile

以這張圖來說 From 是命令式,而 nginx 是選擇參數

Image (映像檔)

Docker 映像檔是創建容器的模板,我們能將它想像為一種虛擬機快照(snapshot),映像檔包含了開發者需要部署的應用程式、作業系統和編譯環境。開發者能透過映像檔建置不同的容器,在容器中,每個應用程式都是獨立運行的,彼此互不影響。

image

圖片來源

Container (容器)

容器是映像檔建立出來的實例(Instance),我們能將它比喻為一個輕量級的沙盒,Docker 利用容器運行和隔離應用程式,能夠在容器中將應用程式啟動、開始、停止、刪除。由於映像檔是唯讀(Read Only)的模板,因此容器在運行後映像檔的上層會增加一個能夠修改的讀寫層(Read and Write),而映像檔本身則不變。 

docker-inside-container

Repository(倉庫)

Repository 是儲存映像檔的地方,使用者可以將自己完成的映像檔上傳至倉庫上儲存,倉庫上也有許多現成的映像檔供用戶存取,倉儲的種類被分為公開與私人兩種,目前官方最大的公開倉庫是 Docker Hub。在上面儲存了超過 15,000 個映像檔供使用者下載。

docker-flow

Docker 的運作流程

步驟一、撰寫 Dockerfile,步驟二、將 Dockerfile 建立為 Image,步驟三、將 Image 運行為容器。透過這三個簡單的步驟,就能創建自己的 Docker 容器囉!

創建運行 Docekr

圖片來源

結語

看完這篇文章後,相信大家現在對 Docker 有一些基本的認識,想了解更多 Docker 的相關知識,可以參考 Docker – 迅速建立最自由容器的管理工具,如果想要下載 Docker 或認識 Docker 的語法,可以參考 Docker 安裝 和 Docker 指令


歐立威科技致力於成為全方位開源軟體解決方案與資料分析專業建置商,透過不斷尋找及引進更具競爭優勢的產品,提供企業環境的部署、整合、客製化、教育訓練與技術支援服務,滿足客戶及合作夥伴對於開源軟體的資訊需求。如果想要獲得更多資訊,歡迎與我們聯繫



相關文章