不得不說,在商智中心開發專案還有教學的這些日子中,我覺得「在我的電腦上明明可以跑!」這句話應該可以榮登大家最常講的話前10名。各式各樣的錯誤因為 Python / Node.js 版本不同、少裝了套件、資料庫沒設定好而產生。

Docker 把「程式+執行環境+設定」一起打包,在任何裝了 Docker 的電腦上,都能用一樣的方式跑起來,大幅減少因為環境相異而產生的錯誤,讓大家可以把時間留在討論業務邏輯等核心問題上。

<aside> 🐋

Docker就像是港口的集裝箱,不管裡面裝的是 Flask、Next.js 還是 MySQL,集裝箱的外型都一樣,港口只要會搬貨櫃,就能把它放上船、開起來,不用知道裡面怎麼組裝。

</aside>

事情是這樣子的

這學期規劃第一次前端工程師考核時,我不希望大家只練習 UI 切版和基礎應用,而是想看看每個人面對完整專案時,能不能用前端工程師的角度看全局。所以這次的題目,是一份 PM 開完會後整理的需求文件:大家要根據需求,搭配現有的後端完成前端;如果發現後端設計不好,也要提出修改建議。

這時我遇到一個問題:怎麼讓每個人都有自己的後端?原本想讓三個人連同一個後端,但大家同時連線、又同時修改,衝突會非常多。於是我想到了 Docker。其實我之前就接觸過,寒假研習時也教過學生用 Docker 在本地部署 Flask,但老實說,那時的我也沒有領悟到Docker真正的精髓。

Docker本地部屬Flask

這個Notion 將以 115 BIRC 前端工程師測驗用的後端(Next.js Route Handler + MySQL)爲例。把後端與資料庫做成 Docker 映像檔,讓每位考生在自己的電腦上一鍵啟動一份;資料搞壞了,重跑一行指令就恢復初始狀態解決以下問題:

核心名詞

名詞 意思 比喻
映像檔(Image) 打包好的程式與執行環境,唯讀,可以複製給別人 食譜+已備好的食材包
容器(Container) 用映像檔「跑起來」的實體,可以同時跑很多個 照食譜做出來的一道菜
Dockerfile 描述「怎麼做出映像檔」的文字檔 食譜本身
Registry(映像檔倉庫) 存放與分享映像檔的地方,例如 Docker Hub、GitHub Container Registry(GHCR) 食譜分享網站
Volume(資料卷) 容器之外、會保留下來的資料空間,例如資料庫檔案 冰箱,菜吃完了冰箱裡的東西還在

<aside> 🐋

容器和虛擬機器(VM)很像,但更輕量:容器共用主機的系統核心,不需要每個都裝一整套作業系統,所以幾秒就能啟動,一台電腦也能同時跑很多個。

</aside>

除錯工具


未來優化


安裝 Docker 與第一個容器

  1. 到 Docker Desktop 下載並安裝(Windows、macOS;Linux 也可以安裝 Docker Engine)
  1. 打開 Docker Desktop,等左下角顯示 Engine running
  2. 打開終端機,確認版本