สำหรับนักพัฒนาไม่ว่าจะเป็น Front-end หรือ Back-end หลังจากพัฒนาบนเครื่องเราเสร็จแล้ว ถ้าอยากนำระบบขึ้น Online จริงให้คนอื่นได้เข้าถึงโดยผ่านโดเมนจริง และมี SSL ให้ใช้งานด้วย ผมขอแนะนำ Google cloud run ครับ
Cloud run คือ Serverless platform ที่จะนำ Docker image มา deploy ให้เราบน Knative ของ google ซึ่งเราไม่จำเป็นต้องรู้เรื่องพวก Knative เลย เราเพียงทำหน้าที่พัฒนาระบบก็พอ แล้วตอน deploy ให้ Cloud run จัดการ เราก็จะสามารถเข้าถึงแอพพิลเคขั่นของเราแบบ online ได้เลยทันที
เนื่องจาก Cloud run ใช้งานอยู่บน Knative ทำให้เราจะได้ความสามารถของระบบ K8S มาด้วย สิ่งที่เราจะเป็นประโยชน์กับเราเริ่มต้นคือ
แค่นี้ก็ cool แล้ว
เราจะมาลองนำเว็บที่พัฒนาด้วย Reactjs โดยใช้ Nginx มาไว้บน Cloud run กัน และบทความนี้ผมจะถือว่า ทุกคนมีความรู้พื้นฐานของ gcloud และ Docker กันมาแล้วนะครับ
เริ่มต้นเราต้องเปิด api ใน cloud console ก่อน
สร้างไฟล์ default.conf
ของ nginx เราจะให้มันใช้งานที่ port 8080 โดยไว้ใน nginx/default.conf
ของ root project
server {
listen 8080 default_server;
listen [::]:8080 default_server;
root /usr/share/nginx/html;
index index.html;
server_name _;
gzip on;
gzip_vary on;
gzip_min_length 10240;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
gzip_disable "MSIE [1-6]\.";
location / {
try_files $uri $uri/ @rewrites;
}
location @rewrites {
rewrite ^(.+)$ /index.html last;
}
location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
# Some basic cache-control for static files to be sent to the browser
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
}
สร้าง Dockerfile
ไว้ที่ root project
# build environment
FROM node:12-alpine as react-build
WORKDIR /app
COPY . ./
RUN yarn
RUN yarn build
# server environment
FROM nginx:1.13-alpine
RUN apk add --update tzdata && \
cp /usr/share/zoneinfo/Asia/Bangkok /etc/localtime && \
apk del tzdata
COPY --from=react-build /app/build /usr/share/nginx/html
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
WORKDIR /usr/share/nginx/html
EXPOSE 8080
ทำการ Build docker image ด้วยคำสั่งด้านล่าง
$ docker build -t asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] .
$ docker push asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG]
[YOUR_PROJECT_ID]
เป็น google project id ของเราเอง ใครไม่รู้ก็ลองใช้คำสั่ง gcloud projects list
ดูเอา[IMAGE]
ชื่ออิมเมจที่ต้องการ[TAG]
แท็กของอิมเมจหากใครไม่สามารถ push image ไปยัง google cloud registry ได้ให้เราทำการ authen ก่อนโดยใช้คำสั่ง
$ gcloud auth configure-docker
จากนั้นทำการ deploy cloud run ด้วยคำสั่ง
$ gcloud run deploy [SERVICE_NAME] --image asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] \
--platform managed \
--region=asia-southeast1 \
--allow-unauthenticated
[SEVICE_NAME]
ชื่อ service ของระบบเรา--image
กำหนดอิมเมจที่ต้องการ pull ลงมา--tag
กำหนด tag ที่ต้องการ pull ลงมา--platform
เลือก platform ของ cloud run ที่เราจะใช้งาน--region
กำหนด region ในการ deploy ของผมจะเลือกเป็น asia-southeast1 นั้นก็คือสิงคโปร์นั้นเอง--allow-unauthenticated
ให้สามารถเข้า url มาได้เลยเพียงเท่านี้เมื่อเราไปดูใน cloud console ก็จะเจอกับ service ของเราพร้อมด้วย url แบบมี ssl มาให้ใช้งานทันที
หากเรามีการแก้ไขโค็ดแล้วต้องการ deploy ขึ้น cloud run ใหม่ก็ให้ทำขั้นตอนดังนี้
$ docker build -t asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] .
$ docker push asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG]
$ gcloud run deploy [SERVICE_NAME] --image asia.gcr.io/[YOUR_PROJECT_ID]/[IMAGE]:[TAG] \
--platform managed \
--region=asia-southeast1 \
--allow-unauthenticated
เราสามารถอัพเดทโค็ด แล้วใช้ tag เดิมได้นะ เช่น image:lasted
แล้วพอ deploy ขึ้น cloud run ใหม่มันจะ pull ล่าสุดมาเอง
อันนี้เป็นเพียงตัวอย่างการใช้งานเริ่มต้นสำหรับ cloud run เท่านั้น ซึ่งด้วยตัวระบบแล้วมันสามารถนำไปใช้งาน Production ได้เลย เพราะว่ามันสามารถกำหนด spec cpu หรือ ram ให้กับ container ได้ จากนั้นก็กำหนดการขยาย max หรือ min จำนวน container ได้อีกทำให้รองรับโหลดสูงๆ ได้ แถมคิดราคาตามการใช้งานจริงด้วย
อีกหนึ่ง case ที่เหมาะสมคือหากเรามี api ตัวไหนโหลดสูงๆ แบบแค่บ้างช่วงเวลาก็อาจโยนมาให้ cloud run ทำงานแทนได้
หากใครเป็นสาย AWS ให้นึกว่า Cloud run จะเปรียบเสมือนกับ AWS ECS
📌สนใจติดต่อ📌
💻 twinsynergy.co.th
📱 063-789-9059
Thanks:
https://cloud.google.com/container-registry/docs/advanced-authentication#gcloud-helper
https://cloud.google.com/container-registry/docs/pushing-and-pulling
https://cloud.google.com/community/tutorials/deploy-react-nginx-cloud-run
https://cloud.google.com/run/docs/deploying#command-line