Docker 是個運用了虛擬化技術的套件,讓不同電腦上可以正常執行同樣的電腦程式。之所以有這項需求的產生,是由於每台電腦的作業系統、硬體配置、甚至是操作套件的版本都會有所差異。
虛擬機器和容器的不同
虛擬機器
虛擬機器是將應用程式所應用的作業系統環境整個打包起來,建立一個獨立的映像檔,這樣一來只要搬動這個檔案就可以運作。(例如:Mac 上的 Parallel Desktop)
容器
虛擬機器的缺點就是要安裝一個非常大檔案的作業系統(OS),而且也會耗費較多的記憶體。而 Docker 所建立的就是容器 (Container) 的概念,它不必先行完整安裝獨立的作業系統,花費的硬碟和記憶體空間也比較少。
映像檔、容器和倉庫
映像檔 Image
你可以把它當成一個模擬出來的執行環境,而彼此映像檔之間不會互相影響。當然,你不需要從頭造車。你可以從公開的倉庫(Repository)上取得像是 node.js 環境、mongoDB 服務…..等。不過就如名稱,映像檔是唯獨的。如果你有經歷過光碟片的時代,跟那個唯獨映像檔是一樣的概念。
容器 Container
用映像檔建立出來的實體(Instance)。彼此之間互相獨立,可以個別啟動、開始、停止、刪除。
倉庫 Repository
集中存放映像檔的地方
安裝 Docker 並建立 Demo 專案
1. 點選此連結,到 Docker 的官方網站進行下載。
2. 安裝完畢後,先確定 docker 有常駐運行
3. 用 Vue Cli 新增一個 Demo 專案,先確定用 localhost:8080 開的起來
1 2 3 4 |
// 先行安裝 Vue Cli vue create demo-docker-vue cd demo-docker-vue npm run serve |
4. 在專案的根目錄新增一個 Dockerfile 的檔案
5. 在 Dockerfile 裡面輸入以下內容後儲存:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 基底的映像檔,這邊以精簡版最新的 node.js 為範例 FROM node:lts-alpine // 建立簡易的 http-server 環境 RUN npm i -g http-server // 指定工作目錄 WORKDIR /app // 複製原有專案的 package.json COPY package*.json ./ // 在此容器下,以 production 的環境安裝所有依賴 RUN npm i --production // 在此環境下,copy 原有專案的檔案和資料夾進來 COPY . . // 若你有發現 node-sass 的版本不符時,你可以多新增指令來讓 docker 操作 RUN npm rebuild node-sass // 一切就緒後,執行 build RUN npm run build // 確定後端的對外連接口為 80 EXPOSE 80 // 運用 node.js 的 http-server 套件,並讀取 npm run build 後的靜態檔案(預設是 /dist) CMD ["http-server","dist"] |
6. 邏輯上是先用 Docker 會依照 Dockerfile 的指令,將環境打包成一個映像檔(Image),然後你在根據這個生成的映像檔,來 run 出一個 Container
7. 輸入以下指令
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// 1. 先確認 docker 環境是否啟動,如果檢查 docker 底下的 images 無法顯示,那表示服務未啟動 docker images // 2. 由專案根目錄下的 Dockefile 建立新的映像檔(ex: demo-docker-vue) docker build . -t demo-docker-vue // 3. 再由新建立好的 image 來建立新的 container // -p 8080:8080 為 將主機的 port 8080 對接到 container 的 port 8080 // 因為 vue-cli 本身 build 的預設接口為 8080,和 container 本身對外的 80 是不同的 docker run -p 8080:8080 -d demo-docker-vue // 4. 確認 container 是否啟動成功 docker container ls |
參考資料
1. Docker 基礎教學與介紹 101
2. 全面易懂的Docker指令大全
3. Vue – 使用 Docker 佈署