docker 是一套輕量級的虛擬化工具。
通常我們會把部署後的產物稱之為:
既然有容器就一定會有可以填滿這個容器的東西
用來填滿這個容器的東西稱之為:
在 docker 還沒有盛行之前,我們都會利用 virtual machine 來模擬 linux 的環境。
常見的 virtual machine 有這些:
virtual machine 簡單來說就是在現有的作業系統中再建立一個新的虛擬的作業系統,並利用這個虛擬的作業系統來處理事情。
既然要運行一套新的作業系統,所以也需要 CPU 、 RAM 等等硬體空間
所以可想而知使用 virtual machine 的下場就是:
而 virtual machine 整體架構上就會長得像這樣:
docker 最主要的功能就是在虛擬化「應用程式及其相對應的環境」
也就是說我不用像 virtual machine 一樣產生一套專屬於該應用程式的虛擬作業系統,就可以直接進行應用程式的部署。
有了 docker 之後就不用像 virtual machine 一樣吃那麼多硬體資源了。
而 docker 整體架構上就會長得像這樣:
從上面的架構圖可以發現,其實 docker 有個非常大的好處:
可以隔離各個容器
在開始正式進入 docker 的教學之前先來講講 Docker Hub 這個網站。
不曉得為什麼工程師特別喜歡用 Hub 這個名詞來代表某一項事物的集合。
像是 Git 有 GitHub
docker 有 Docker Hub
還有另一個流量最大的 xxxxHub 是什麼就不好說了XD
Docker Hub 是用來存放所有 docker 會用到的映像檔的大型倉庫,
透過 Docker Hub 我們就可以順利地引用這些映像檔來達到虛擬化「應用程式及其相對應的環境」
所以我們之後要利用的映像檔都會從 Docker Hub 這邊 抓取喔!
接下來就正式進入重點內容,到底 docker 該如何使用
通常我們會撰寫一個叫 Dockerfile 的檔案來進行應用程式的環境部署。
Dockerfile 的寫法簡單來說分為四個階段:
所以整體寫法就會長得像這樣:
當然還有更進階的用法,這邊以前端為例子
情境是:利用 webpack 或 gulp 將檔案 build 成靜態檔並利用 nginx 進行 serve static files 的動作
這邊會用到 multi-stage build 的觀念,要使用 multi-stage build 也很簡單,只要用到 as 這個關鍵字就好
as 後面會接一個代稱,目的是為了將這個映像檔包裝成 as 設定好的代稱
透過 as 就可以把這個映像檔的內容快速地提供給該 Dockerfile 下的其他映像檔使用
最終整體寫法就會長得像這樣:
學會了怎麼撰寫 DockerFile 後接下來講講 docker 指令集
有了指令才能順利地產出 docker 容器
可以發現在 build 的過程中不斷的在 using cache
所以我們可以知道想要把 Dockerfile 寫得好,就要善用 cache
因為 docker 在進行 build 的動作時都會把過程存到 cache
以便於下次在 build 的過程中可以利用 cache 進行快速建置
這是份不合格的 Dockerfile
接下來我們改變一下專案的隨便一個檔案再來重 build 看看會發生什麼事
可以發現每次更改檔案都進行 npm i 這個過程
明明我只是改檔案沒有改到 package.json
但全部都重新安裝一次了
這個 Dockerfile 就是個很不好的 Dockerfile
最簡單的方法就是把 package.json 這種比較不會一直更動的檔案先進行 COPY ,這樣就可以確保套件不會一直重新安裝,因為有 cache 的存在
但其實剛剛那份 Dockerfile 還有一個非常大的問題
我們 nginx 需要做的事只有 serve static files 而已
但這邊卻把整個專案包括套件都傳入 nginx 所以 nginx 的映像檔就會非常肥
所以我們可以在把靜態檔傳到 nginx 的映像檔中時先把套件移除
這樣就會讓 nginx 的映像檔變小了
最終的 Dockerfile 就會長得像這樣:
下次的分享會主題是更進階的 docker:docker-compose
謝謝大家