rich840213 / hexschool-GCP-demo

For hexschool class demo

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

動手搞定GCP部署工作

📆 Updated Date: 2020-05-13

🏤 Author: YiChun Sung

📧 ycsung.r@elk-tree.studio

Elk Tree Studio

現在的開發長什麼樣子?

專案架構

  • 從MVC到前後端分離

  • 漸漸地把前端和後端分開,當然現在組織越大的開發團隊有越多的分工角色,專案也分開,各自在專案中的專業技術也越來越複雜。

  • 舉例:

ex1

ex2

ex3

我們在什麼位置?

前端開發者需要了解部署的重要性

  • 情境一:管Server的人非常好,也非常嚴謹,所有更新他必定是親自來,前端、API開發人員的更新都交給他統一上去。

  • 情境二:管Server的人同時要管好幾個服務,即便他定義了很多嚴謹的規範,但是他沒辦法每次都及時幫忙開發人員提交更新。

  • 情境三:根本沒有Server人員,只有一台機器各自表述。

  • 你應該要多瞭解一些他們的事情!

關於Linux

linux_list

GCP常用資源介紹

  • 新增一個你自己的專案吧!

  • Google App Engine (GAE)

    • Google Slogan: 全代管的無伺服器應用程式平台

    • App Engine

  • Google Compute Engine (GCE)

  • Google Container Registry (GCR)

  • Google Kubernetes Engine (GKE)

  • Google SQL

  • Google Storage

  • gcloud SDK (Google Cloud SDK)

For Example: Linux & macOS:

curl https://sdk.cloud.google.com | bash

gcloud SDK image1

gcloud SDK image2

exec -l $SHELL
gcloud init

接著會需要登入你的google帳號跟選擇你的GCP專案。

你可以輸入指令看一下當前的專案選擇和你現在的登入帳號

gcloud config list

在GCE實戰開一台機器

在Google Compute Engine (GCE)中設定一台機器

  • 開一開新的vm,選擇OS (我用Ubuntu做範例,大家可以選擇自己熟悉的)

  • 進去vm的方式有很多,有最簡單的利用瀏覽器進去,也可以利用ssh直接連線或是用gcloud SDK連線ssh進去。

用 gcloud SDK進去的方式:

gcloud beta compute ssh --zone "YOUR_ZONE" "VM_NAME" --project "PROJECT_ID"
  • 先安裝必要的東西 - 複雜版
  1. 先更新 apt
sudo apt-get update
  1. 安裝node.js/npm
curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -

sudo apt-get install nodejs

node --version
  1. 安裝其他你想安裝的環境 例如 NGINX 等等
sudo apt-get install nginx -y
  1. 把你的專案拉下來吧!
git clone "https://github.com/ElkTreeStudio/hexschool-GCP-demo"

靜態IP設定

VPC 網路 > 外部IP位址 > 開啟靜態IP

防火牆設定

設定 port 3000

firewall

其實要從頭設定好一個完整的環境有時候很麻煩,運氣好的話你可以從頭到尾的安裝和運行都很順暢,然後快樂地啟用已經開發好的專案,但常常事與願違....

Docker 化你的專案

為什麼建議Docker化?

  1. 更快速的交付和部署
  2. 更輕鬆的遷移和擴展
  3. 更簡單的管理
  1. 實作:
  • 寫一個Dockerfile
FROM node:10-alpine

# Create app directory
WORKDIR /usr/src/app

# Install app dependencies
COPY package*.json ./
RUN apk --no-cache add --virtual builds-deps build-base python
RUN npm install

# Bundle app source
COPY . .

EXPOSE 3000
CMD [ "node", "index.js" ]
  • 建立一個Docker image
docker build -t gcr.io/[your_gcp_project_id]/[your_image_name]:[tag_name] $PWD

例如:

docker build -t gcr.io/elk-tree-studio/hexschool_demo:0.1.0 $PWD
  • 在本機端測試一下是否可以正確執行
docker run -p 3000:3000 --name hexschool_app -d gcr.io/elk-tree-studio/hexschool_demo:0.1.0

使用GCR 管理Docker Image

推上 GCP

gcloud docker -- push DOCKER_IMAGE_NAME:TAG

例如:

gcloud docker -- push gcr.io/elk-tree-studio/hexschool_demo:0.1.0

在GCE中簡易地使用Docker

安裝Docker

  • 從docker.io 安裝 docker
sudo apt-get install docker.io

從 Google Container Registry (GCR) 把 docker image 拉進來

Authentication methods

gcloud auth configure-docker

使用gcloud 指令將GCR的image 拉進來

gcloud docker -- pull gcr.io/elk-tree-studio/hexschool_demo:0.1.0

執行:

docker run -p 3000:3000 --name hexschool_app -d gcr.io/elk-tree-studio/hexschool_demo:0.1.0

nginx 部署

  1. 為什麼要使用nginx

  2. 安裝 nginx

sudo apt-get install nginx -y
  1. 確認nginx 狀態
ps auwx | grep nginx
  1. nginx指向設定,修改設定檔
sudo vi /etc/nginx/sites-available/default
  1. 修改設定如下:
server_name yourdomain.com www.yourdomain.com;

location / {
    proxy_pass http://localhost:5000; #whatever port your app runs on
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
}
  1. 確認nginx config
sudo nginx -t
  1. Restart nginx
sudo service nginx restart
  1. Stop nginx
service nginx stop
  1. Start nginx
service nginx start

網域的設定

  • 以godaddy來示範

在Docker中使用git去做版本控制

進入docker container操作

docker exec -it {docker container name} bash

In Alpine linux like pm2-container

  • Alpine uses ash and not bash.
docker exec -it {docker container name} ash

還可以怎麼精進自己?

About

For hexschool class demo


Languages

Language:Dockerfile 53.3%Language:JavaScript 46.7%