Hi,大家好,轉眼間已經到最後一天了,今天來說一下環境佈署的方法吧。目前我習慣採用的機制,若是自建環境的話,會準備一台 linux 主機,並安裝好 docker 就行了,之後把要用到的資料庫、報表元件、執行環境都以 docker image 的方式掛載上 docker 即可。若是使用付費空間,個人是推蠻薦使用 heroku 的空間的,上面提供了資料庫可供使用。那麼今天簡單的說明一下 docker 的使用吧。
docker 是一個容器化的開源專案,簡單的說,它可以在作業系統環境中,建置許多的虛擬作業系統,這個虛擬的作業系統,稱作容器,可以把容器當成虛擬機器看,但是又沒有那麼的吃資源,根據我自己的經驗,是一個可以快速佈署程式的平台。且因為 docker 的各容器彼此獨立的特性,萬一進行環境昇版時,也是針對新的環境需求,再建置一個新的容器,如果今天主機上有很多不同的服務在執行時,A容器的升版,是不會影響到B容器的,不用像以前一樣,升級個 java 執行環境,要提心吊膽的檢查是不是有什麼舊程式會出狀況,可以做到A容器用 java 8、B容器用 java 10的架構。
docker 的安裝因為不是本篇的重點,我簡單的說明一下,另外因為我的 docker 環境通常是習慣使用 linux 版,所以以下的指令全部都是 linux 指令
首先我們要先準備一台 linux 主機,進入 terminal ,輸入安裝的指令
# 在 centOS 中
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 在 ubuntu 中
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
這樣子就完成 docker 的安裝了
就像燒錄光碟一樣,docker容器的根基是所謂的映象檔(image),需要什麼環境的映像檔,可以去 docker hub 上找,例如說我們需要有一個 postgreSQL 資料庫,可以去 docker hub 上找 postgreSQL 的映像檔下來安裝,指令輸入後,就有一個頭好壯壯的資料庫了,是一個很方便的東西(說實話,開始用 docker 之後,我發現我的安裝環境的技術有很明顯的退步@@),為了執行我們的專案,必需先安裝2個環境,一樣在終端機上輸入安裝指令即可
sudo docker run --name postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -d --restart always postgres
sudo docker run --name jsreport -p 5488:5488 -d --restart always jsreport/jsreport
這樣子就把我們會用到的報表伺服器與資料都的安裝完了,指令雖然很長,但是內容很單純
--name 容器名稱,可不設定,但是我都會設定,這樣子在下指令比較簡單
-e 環境變數,通常是看容器本身的安裝文件,不一定會有,上述的範例就是設定資料庫的預設密碼,實際操作時需更換
-p 環境使用的 tcp port,:的左邊是宿主機用的 port,右邊是容器用的,所以上述的指令是要將主機上的 5432 對應到 postgres 容器中的 5432、5433 對應到 jsreport 容器中的 5488,達成開放使用服務的效果
PS. 這個做法很常見,但是必須開放服務 PORT,有時候需要加設防火牆,同時也會造成資安的風險,有進階做法可以不開放 PORT,以達到更安全的效果,不過此處不另外說明
-d 背景運作,如果不設定的話,指令下完之後,就等於是在容器中了,按下 ctrl+c後會中斷容器,不是我們要的效果
--restart always 重開機時自動重啟容器,很重要,一定要設定
指令的最後一個參數就是使用的映象檔名稱,docker 很聰明,會先看本機中的映像檔儲存庫有沒有指定要的映像檔,沒有的話就去 docker hub 下載下來(可透過設定方式變更下載位置)
上面的做法是用現成的檔案,在安裝環境時很省事,但是我們現在要建置的是自己的專案,總不能指望 docker hub 上會有自己的專案的映像檔,因此我們要自己做映像檔出來,再把映像檔掛載成為容器,這個時候,我們就會需要 dockerfile,dockerfile 可以說是映像檔的設計藍圖,寫完之後,docker 就會按圖施工,生出我們要的映像檔,那麼就來編寫吧。
首先開啟 vscode ,打開專案,並在 app.js 的所在路徑中,新增 Dockerfile (需注意大小寫),並貼上下方程式碼後存檔
FROM node
RUN mkdir -p /projects/saf
COPY . /projects/saf
WORKDIR /projects/saf
RUN npm i pm2 -g
RUN npm i
EXPOSE 3000
CMD ["pm2-runtime", "bin/www"]
說明:
第1行:告訴docker,這個容器的基礎容器是什麼,我們使用的是 node.js的官方最新版官方容器
第2行:執行建立資料夾的指令,因為是 linux base,所以 RUN 之後的指令為 linux 的指令
第3行:將現在資料夾的檔案複製到映像檔中上一步建立的資料夾中
第4行:指定工作路徑為步驟2建立的資料夾,以便之後執行服務
第5、6行:下載 pm2 套件,並將專案用到的所有第3方元件下載下來
第7行:指定服務 port 為 3000(因 node.js 的預設服務 PORT 為 3000,所以這裡設定3000,要以實際使用的 PORT 為主)
第8行:以 pm2 啟動服務
Dockerfile 編輯完成後,回到終端機上,輸入下列指令,即完成程式容器的建置
sudo docker build -t saf/saf /projects/saf
sudo docker run --name saf -p 80:3000 -d --restart always saf/saf
說明:
第1行是依照 dockerfile 建立一個叫 saf/saf 的映像檔(這裡是假設我們系統的程式碼位於 /projects/saf
這樣子就完成了環境建置了,此時輸入 http://主機ip/saf 就可以看到我們的專案了
30天的時間,真的很快就過去了,這次的鐵人賽,說實話寫的不怎麼好,畢竟想寫的東西很多,很多東西也是邊 try 邊寫的,不過對我來說是一個整理自己的體驗,關於 vue.js,還有很多可以寫的,畢竟剛學,每次看文章都有新的體悟,關於後端的 node.js部份,也還有很多可以加上去的功能,像是檔案處理、header的處理,公開api…等。有機會再補上囉。
劣文傷眼,如果有幸看到的人,謝謝您的觀看囉!
ご視聴ありがとうございます