專案 Docker 容器化
接著我們會把整個專案使用 Docker 來將服務容器化,也會在 MongoDB 設定身份驗證機制
如果對 Docker 不熟的話必須先去了解,才有辦法進行。或是直接跳過這個章節 交給熱心的攤主處理
在這邊我們會用到三個容器
- nginx 伺服器:處理 Vue 框架實現的前端靜態頁面
- api:運行我們使用 Express 建立的 API 服務
- db:就是一個運行 MongoDB 資料庫的容器
流程會變成
資料進來由 nginx 分派,如果是前端或是靜態資源就直接從 nginx 回傳。若是 API 類型的請求則轉交給 API 容器處理後再回傳資料。
這種架構有以下優勢
- 透過 nginx 過濾非法請求
- 解決前後端跨域問題,因為兩者間都透過相同端點訪問
- 可以輕鬆擴增伺服器大小,並且使用 Nginx 做負載平衡
前端容器化
首先容器化的是先前用 Vue 寫的前端專案,將專案打包成靜態頁面
npm run build
接著增加 nginx 設定檔 client/config/nginx.conf
server {
listen 80;
root /www;
index index.html;
sendfile on;
sendfile_max_chunk 1M;
tcp_nopush on;
gzip_static on;
location /api/v1 {
proxy_pass http://api:3000;
}
location / {
try_files $uri $uri/ /index.html;
}
}
其中要特別注意的是 location
規則
- 請求目標如果是
/api/v1
,那就把請求傳到api
容器裡 - 請求目標
/
,則直接回傳靜態頁面index.html
然後要回頭稍微修改一下前端訪問後端的網址,打開client/src/store/actions.js
修改API_BASE
成
const API_BASE = '/api/v1';
這樣改了之後前端在對 API 發起請求時就是取決於當前頁面的網址,而不是固定的 http://localhost:3000/api/v1
接著就是要撰寫 Docker 相關設定
首先建立 client/src/Dockerfile
FROM nginx:1.13
# 刪除預設的 Nginc 設定
RUN rm /etc/nginx/conf.d/default.conf
# 加入自己定義的 Nginx 設定檔
COPY config/nginx.conf /etc/nginx/conf.d/
# 將前端靜態檔案映射到容器的 /www 目錄下
COPY dist /www
接著建立 client/.dockerignore
,裡面只有短短一行
node_modules
代表不 mount 進 docker 的資料夾
留言
張貼留言