Overview

一般從 Docker Hub 中下載的映象檔 (Image) 來建立 Container,這些映像檔可能是軟體開方商所釋出的,或是第三方人士加值過的版本,這種方法的缺點是映像檔所包含的功能、工具或版本無法滿足自己的需求,此時可以利用 Dockerfile 客製化一個符合需求的映像檔,就是一個很好的解決方案。

什麼是 Dockerfile

Dockerfile 的組成

基本上 Dockerfile 是由一行一行的指令列所組成,一行指令對 Image 來說就是一層的資料層 (Layer),一個 Image 就是靠這樣一層一層的資料累加上去,最後才編譯出自己想要的映像檔,就像蓋房子一樣。

實際案例

Image 堆疊

雖然理論上一個映像檔裡可以放多個程式與服務,但 Docker 團隊建議,一個映像檔裡面只裝一個程式,再把映像檔一層一層疊起來以提供一個完整服務。

運用蛋糕的比喻,假設我們今天要做一個 Docker 吉祥物形狀的蛋糕如上。首先我們要先用專門做蛋糕底座的模具烤出蛋糕底座,然後在這個出爐的基底上,再用鯨魚模具烤出鯨魚形狀的蛋糕。現在我們有了一個新鮮的蛋糕有堅固的底座與一隻鯨魚躺在上面,最後我們在這個蛋糕上面放上一個貨櫃模具,烤出 Docker 蛋糕。

由於映像檔是唯讀的,所以我們每次要在映像檔上面再疊一層時,都需要先將他建立成容器實體(烤成蛋糕本人)。然後運用容器啟動時會在最上面建立可寫層的特性,我們就可以在容器裡在透過另外一個映像檔建立容器實體,最後把這個容器疊上容器的碗糕轉換成映像檔(Dockerize),我們就完成了映像檔堆疊。

用 Docker 堆疊出一個網頁環境

現在我們要做出一個 Docker 映像檔,讓我們執行網頁與其後端伺服器,假設我們需要 Alpine OS、Apache Server、MySQL Database、我們要如何把他們疊起來呢?

首先我們要先釐清一個概念,為何 Docker 裡面還需要一個作業系統?

事實上在容器的世界裡,這個作業系統我們稱為 Base OS。我們可以把它想像成一個超級精簡版的作業系統(像我們這邊使用的 Apline 就只要 5 MB),因為容器事實上是使用 Host OS 上的 Kernel,所以這個 Base OS 就只要裝最必要的一些執行檔,如:安裝網路套件的工具等。

疊疊樂的第一步就是從 DockerHub 上下載 Alpine 映像檔,用 Docker 執行映像檔產生容器後,在產生好的容器內在安裝 Apache,等待安裝完成後把整個容器打包成另一個新的映像檔。