認識 Docker
高效能輕量級虛擬化工具
前言
在大三修作業系統時學習到虛擬化技術,其中教授提過 Type1 跟 Type2。為什麼我們需要這樣的虛擬化技術,原因在於現行已經有相關的技術可以藉由軟體的技術,虛擬出一個與底層硬體功能一模一樣的介面,簡單來講是透過軟體技術模擬出一個硬體的環境。
這樣的好處是什麼,透過使用虛擬機,我們便可允許一台實體主機同時執行多個作業系統,如果有使用過 VirtualBox 或是VMware、 Windows Parallels ,你可以看到我們使用一台實體主機,打開這些軟體內後,在實體主機資源還可承受的情況下,透過軟體執行多個虛擬主機,其中每一個虛擬主機既可以互相用線路連線、也可以獨立運作互不干涉。
從上面來看,我們在佔用面積、耗電量、空調、維護人事成本上(都只需要管理或維護一台主機),都減少了許多。
Docker 的概念
Docker 是一個應用平台,它是一種全新的應用程式的運行方式,一切都發生在一個封閉的、精簡的單元裡,此單元我們稱之為容器(containers)。
容器是一種非常經濟的應用程式運行方式,它們可以在數秒之內啟動,且不會對應用程式的記憶體和運算經濟需求帶來額外的負擔。
你可以透過 Docker 執行 Node.js 的程式之外,也可以啟動另外一個容器運行已存在好幾年的 asp.net MVC 的網頁程式。
Docker、Dockerfile 與 Container 等關係
要了解並學習 Docker 前,我們先來看一下映像檔(Images)、登入所(registries)、容器、以及 Dockerfile 等關係,並透過我所製作的下圖來理解 Docker 的運作方式。
Containers
容器是一個源自映像檔的應用程式執行個體。當運行一個容器時,Docker 會根據 Image 的內容來做該做的事情。我們透過下達
>docker container run
來啟動應用程式。
Images
一個 Docker 映像檔,其實就是一個完整的應用程式封裝。一個 Images 裡面包含了應用程式以及它運行所需的所有相關成分,包括底層作業系統,語言執行平台以及應用程式。如圖所示:
我們可以透過下達
>docker image build
就可以建立客製化的映像檔。我們須提供 Dockerfile 本身以及任何相關資訊如需封裝在映像檔內的資源(例如 WebApp)來建構此映像檔。
Docker 映像檔如同應用程式在某個版本狀態時的檔案系統快照。
Dockerfile
Dokcerfile 即指令稿,它可以用以客製化整個 Image 要用什麼 OS,要準備好什麼樣的環境,透過使用 docker build
的指令就可以建構起 Docker Image,未來要使用此 image 就直接 Run 此 Image。
以下一個 Dockerfile 的內容範例是來自於 ASP.NET Core 2.2 的範例:
registries
登錄我們公有或自有的映像檔的地方。只要你有權使用該映像檔,就可以透過指令
> docker image push
上傳映像檔,或用
> docker image pull
下載映像檔。
總結
Docker 是一種容器,企業機構之所以走向 Docker,主要是為了效率、安全以及可攜性。