# 如何在 GCP 上以 k8s 部屬 nodejs 的 docker (Ubuntu) ## 新建一個 google cloud 專案 先到 [google cloud](https://cloud.google.com/) 中申請一個新的專案如附圖,專案名稱可以自己取沒關係,我們這裡假設我們專案的名子叫 `my-project` ![](https://i.imgur.com/k4kkT66.png) ## 將 nodejs 專案 dockerize ### prerequest * [docker 安裝](https://docs.docker.com/install/) 根據自己 OS 安裝 docker ### step 1 撰寫 Dockerfile 假設你現在的專案目錄為以下 ``` my-node-project/ ├── node_module/ ├── src/ ├── package.json └── server.js ``` 1. 新增一個名為 Dockerfile 的檔案到 my-node-project 下面 ``` my-node-project/ ├── node_module/ ├── src/ │ ├── myclass.js ├── Dockerfile ├── package.json └── server.js ``` 2. 編輯這個 Dockerfile,將所有需要的程式拷貝到 app 底下 ```dockerfile= FROM node:9.2.0 #指定我們的環境為 node 9.2.0 版本 COPY package.json server.js /app/ #拷貝檔案到 app 這個工作目錄下面(app這個名子可以自己取沒關係) COPY src /app/server #資料夾的拷貝會比較特別,以下會說明 WORKDIR /app #進入工作資料夾 RUN npm install && npm cache clean --force #安裝 node_module CMD node server.js #執行主程式 ``` 特別提及一下,如果把寫法改成 ```dockerfile= COPY src /app ``` 到時候在 app 底下就會變成 ``` app/ ├── myclass.js ``` 但如果把寫法是 ```dockerfile= COPY src /app/src ``` 則不會破壞原本的資料夾結構。 ``` app/ ├── src/ │ ├── myclass.js ``` 撰寫 Dockfile 時這部份要特別小心 ### step2 docker build 這步驟我們會把 nodejs build 成一個 image,image 在這邊指的就是一個還沒有執行的docker。 先進入專案路徑<path/to/my-node-project>,在 cmd 中下 ``` $ sudo docker build -t gcr.io/<project_id>/<project_name>:latest . ``` 其中 `project_id` 要填入你一開始申請的 google cloud 專案的名稱,在這邊是 `my-project` `project_name` 則是你希望這個專案的名稱,在這邊是 `my-node-project`,所以最後會像是 ``` $ sudo docker build -t gcr.io/my-project/my-node-project:latest . ``` 接著我們下 ``` $ sudo docker images ``` 應該會列出你剛剛編譯好的 docker image 如以下 ``` REPOSITORY TAG IMAGE ID CREATED SIZE gcr.io/my-project/my-node-project latest 7db2431eb5c1 3 seconds ago 691MB ``` 到這邊我們就完成我們自己的 docker file 了。 ## 將 docker 部屬到 GCP ### step1 取得 google cloud 功能的權限 因為在你還沒有開啟任何權限以前,google 都會預設你沒有權限使用這些服務,因此為了等一下的過程不要出錯,要先取得一些服務的權限。 [官方文件](https://cloud.google.com/service-usage/docs/enable-disable?hl=zh-tw) 1. 先到 [這裡](https://cloud.google.com/service-usage/docs/enable-disable?hl=zh-tw) 按下下面這個藍色的按鈕 ![](https://i.imgur.com/SzmSAhi.png) 2. 選擇我們的專案(這邊是 my-project) 3. 然後會跳出以下頁面 ![](https://i.imgur.com/4h9k4kw.png) 4. 搜尋我們要 enable 的功能 * 搜尋 Kubernetes Engine API 然後啟用它 * 搜尋 Google Container Registry API 啟用它 * 搜尋 Google Cloud APIs 啟用它 ### step2 Google SDK 1. 先到 [這裡](https://cloud.google.com/sdk/docs/downloads-apt-get?hl=zh-tw) 安裝 google sdk 2. 開啟你的 cmd ``` $ gcloud auth configure-docker $ gcloud auth application-default login ``` 應該會跳出一個 google 登入的畫面,然後請你登入。 3. 推送 docker 到你的 gcp ``` $ sudo docker -- push gcr.io/my-project/my-node-project:latest ``` ### step3 在 GCP 上創建 Kubernetes cluster 1. 先到google cloud 主控版找到 Kubernetes進入 ![](https://i.imgur.com/PmrLPeT.png) 2. 點擊建立叢集 ![](https://i.imgur.com/Isnmxe9.png) 3. 新增完叢集後,點擊部屬 ![](https://i.imgur.com/Isnmxe9.png) 4. 先選擇剛剛上傳的 docker 檔案 ![](https://i.imgur.com/QoP2c82.png) 5. 這裡要自己幫應程式取一個名稱 ![](https://i.imgur.com/L6zy0rP.png) 6. 完成後等一下它應該會跳出這個頁面(如果沒有他在 Kubernetes > 工作負載)選擇公開 ![](https://i.imgur.com/Nq1GECd.png) 7. 填入目標通訊阜,這邊為你當初設定你 app 在 `localhost` 跑的 port,這邊的意思是它會把 docker 執行時,`localhost:port` 的結果 render 到外部的 80 port,到這邊就成功部屬完成了。 ![](https://i.imgur.com/b9Z3WQa.png) ## 成果 你可以在 Kubernetes > 工作負載 中找到以下資訊 ![](https://i.imgur.com/aRl4WfL.png) 端點的 IP 就是你網站的位子了。 附註: 圖片中專案名稱與本文章專案名稱不一樣,請不要介意,不影響結果。 ## 錯誤回報區 如果我有錯誤的地方請指正我謝謝。 > 錯誤 or 問題回報區 > Q: example [name=Zames-Chang]