Docker to Serverless (Google Cloud Platform)

Công Nghệ
Docker to Serverless (Google Cloud Platform)
Bài viết được sự cho phép của tác giả Nguyễn Hữu Đồng Hi xin chào các bạn sau chuỗi ngày dài trốn dịch thì mình đã quay trở lại, chợ bị yêu cầu đống cửa, chả buôn bán được gì nên mình lại có thời gian rảnh để mà vọc vạch, tình cờ nghe ông anh nói qua serverless đồ các kiểu thì mình cũng thấy hứng thú, trong bài viết này mình sẽ chia sẻ những thứ mà mình đã vọc vạch trong ngày vừa qua. Deploy application từ docker image Ý tưởng đơn giản là bạn s ẽ đống gói ứng dụng thành docker image rồi upload lên docker image repository nào đó như gcloud container registry sau đó sử dụng một dịch vụ hỗ trợ chạy container từ docker image như google cloud run . Không auto Deploy khi push code lên GitHub(auto Deploy nằm ở phần dưới) Build ứng dụng ra Docker Image Trong ví dụ này mình sẽ dùng blog của mình làm ví dụ. Project này sử dụng nextjs , mỗi khi mình viết một bài mới thì mình sẽ build code rồi export ra static file , mình không cần phải làm phức tạp, vì với blog này chỉ cần static file là đủ. git clone https://github.com/dongnguyenltqb/dongnguyen.dev.git cd dongnguyen.dev yarn install # Để build project yarn build # Để export ra static file yarn export Và sau khi export thì mình có toàn bộ static file trong thư mục out ➜ dongnguyen.dev git:(master) ✗ ll total 864 -rw-r--r-- 1 gopher staff 25B Apr 4 23:57 404.html -rw-r--r-- 1 gopher staff 155B Apr 5 11:41 Dockerfile -rw-r--r-- 1 gopher staff 1.1K Mar 14 13:29 LICENSE -rw-r--r-- 1 gopher staff 870B Apr 5 11:45 cloudbuild.yaml -rw-r--r-- 1 gopher staff 667B Mar 14 13:29 next.config.js -rw-r--r--...

Bài viết được sự cho phép của tác giả Nguyễn Hữu Đồng

Hi xin chào các bạn sau chuỗi ngày dài trốn dịch thì mình đã quay trở lại, chợ bị yêu cầu đống cửa, chả buôn bán được gì nên mình lại có thời gian rảnh để mà vọc vạch, tình cờ nghe ông anh nói qua serverless đồ các kiểu thì mình cũng thấy hứng thú, trong bài viết này mình sẽ chia sẻ những thứ mà mình đã vọc vạch trong ngày vừa qua.

Deploy application từ docker image

Ý tưởng đơn giản là bạn s đống gói ứng dụng thành docker image rồi upload lên docker image repository nào đó như gcloud container registry sau đó sử dụng một dịch vụ hỗ trợ chạy container từ docker image như google cloud run.

Không auto Deploy khi push code lên GitHub(auto Deploy nằm ở phần dưới)

  1. Build ứng dụng ra Docker Image

Trong ví dụ này mình sẽ dùng blog của mình làm ví dụ. Project này sử dụng nextjs, mỗi khi mình viết một bài mới thì mình sẽ build code rồi export ra static file, mình không cần phải làm phức tạp, vì với blog này chỉ cần static file là đủ.

git clone https://github.com/dongnguyenltqb/dongnguyen.dev.git
cd dongnguyen.dev
yarn install# Để build project
yarn build
# Để export ra static file
yarn export

Và sau khi export thì mình có toàn bộ static file trong thư mục out

➜  dongnguyen.dev git:(master) ✗ ll
total 864
-rw-r--r--    1 gopher  staff    25B Apr  4 23:57 404.html
-rw-r--r--    1 gopher  staff   155B Apr  5 11:41 Dockerfile
-rw-r--r--    1 gopher  staff   1.1K Mar 14 13:29 LICENSE
-rw-r--r--    1 gopher  staff   870B Apr  5 11:45 cloudbuild.yaml
-rw-r--r--    1 gopher  staff   667B Mar 14 13:29 next.config.js
-rw-r--r--    1 gopher  staff   174B Apr  4 23:57 nginx.conf
drwxr-xr-x  854 gopher  staff    27K Apr  4 20:13 node_modules
drwxr-xr-x   44 gopher  staff   1.4K Apr  4 20:15 out
-rw-r--r--    1 gopher  staff   1.5K Apr  4 20:12 package.json
-rw-r--r--    1 gopher  staff   506B Mar 14 13:29 postcss.config.js
drwxr-xr-x   37 gopher  staff   1.2K Mar 16 10:02 public
drwxr-xr-x    8 gopher  staff   256B Mar 16 10:02 src
-rw-r--r--    1 gopher  staff   867B Mar 14 13:29 tailwind.config.js
-rw-r--r--    1 gopher  staff   394K Apr  4 20:12 yarn.lock
➜  dongnguyen.dev git:(master) ✗

Các bạn để ý thì thấy mình có sử dụng nginx để serve static file

Nginx sẽ lắng nghe request, dựa vào path mà xem có file nào match không, không thì nó sẽ gửi file index.htmlvà nếu không thấy fileindex.html nữa thì trả về 404

server {
    listen 80;
    listen [::]:80;root /usr/share/nginx/html;
    error_page 404 /404.html;location / {
        try_files $uri /index.html =404;
    }
}

Và đây là nội dung của Dockerfile

FROM nginx:1.14WORKDIR /usr/share/nginx/htmlCOPY out  /usr/share/nginx/html/
COPY 404.html .
COPY nginx.conf /etc/nginx/conf.d/default.confEXPOSE 80

Khi build image thì mình sẽ copy tất cả file trong thư mục out vào /usr/share/nginx/html/ Sau đó copy file nginx.conf vào /etc/nginx/conf.d/default.conf để nginx dùng cho việc tạo server serve static file.

➜  dongnguyen.dev git:(master) ✗ sudo docker build .
Password:
Sending build context to Docker daemon    312MB
Step 1/6 : FROM nginx:1.14
 ---> 295c7be07902
Step 2/6 : WORKDIR /usr/share/nginx/html
 ---> Running in b3833b65516a
Removing intermediate container b3833b65516a
 ---> 88cb20f7c71e
Step 3/6 : COPY out  /usr/share/nginx/html/
 ---> 6baffa267a2e
Step 4/6 : COPY 404.html .
 ---> ccc50836cbf4
Step 5/6 : COPY nginx.conf /etc/nginx/conf.d/default.conf
 ---> af5a5d05ce44
Step 6/6 : EXPOSE 80
 ---> Running in d5c64c94d39e
Removing intermediate container d5c64c94d39e
 ---> 45bbe32cd01c
Successfully built 45bbe32cd01c
➜  dongnguyen.dev git:(master) ✗

Kết quả image nặng 138MB

➜  dongnguyen.dev git:(master) ✗ docker image ls
REPOSITORY   TAG     IMAGE ID     CREATED            SIZE
<none>       <none>  45bbe32cd01c  32 seconds ago      138MB

2. Đưa image lên Google Container Registry

container registry là nơi mà ta sẽ lưu trữ image, để push được image lên đây thì docker của các bạn cần phải được config để có quyền. Ở đây mình dùng gcloud cli để cấp quyền cho docker và nếu các bạn chưa cài gcloud cli thì có thể xem hướng dẫn cài đặt, cài đặt tài khoản cho cli tại đây.

➜  dongnguyen.dev git:(master) ✗ sudo gcloud auth configure-docker
Password:
WARNING: Your config file at [/Users/gopher/.docker/config.json] contains these credential helper entries:{
  "credHelpers": {
    "asia.gcr.io": "gcloud",
    "staging-k8s.gcr.io": "gcloud",
    "us.gcr.io": "gcloud",
    "gcr.io": "gcloud",
    "marketplace.gcr.io": "gcloud",
    "eu.gcr.io": "gcloud"
  }
}
Adding credentials for all GCR repositories.
WARNING: A long list of credential helpers may cause delays running 'docker build'. We recommend passing the registry name to configure only the registry you are using.
gcloud credential helpers already registered correctly.Updates are available for some Cloud SDK components.  To install them,
please run:
  $ gcloud components update➜  dongnguyen.dev git:(master) ✗

Vậy là xong việc cấp quyền, việc tiếp theo là đánh tag cho nó và upload lên.

➜  dongnguyen.dev git:(master) ✗ sudo docker push asia.gcr.io/tough-racer-272817/blog:v0.69
The push refers to repository [asia.gcr.io/tough-racer-272817/blog]
518883fbeafc: Pushed
39fdf81e18fd: Pushed
070d58aabef7: Pushed
82ae01d5004e: Layer already exists
b8f18c3b860b: Layer already exists
5dacd731af1b: Layer already exists
v0.69: digest: sha256:965753d697100fa539efaf0730de6856db0d52a0f3db7557a87a18f5467f7fcd size: 1573
➜  dongnguyen.dev git:(master) ✗

Và ở trên container registry

Docker to Serverless (Google Cloud Platform)Docker to Serverless (Google Cloud Platform)

Và để deploy lên cloud run các bạn chỉ cần

sudo gcloud 
beta 
run 
deploy 
--region asia-east1 
--image asia.gcr.io/tough-racer-272817/blog:v0.69 
--max-instances 1 
--platform managed 
--port 80 
--allow-unauthenticated 
blog

Kết quả

➜  dongnguyen.dev git:(master) ✗ 

Deploying container to Cloud Run service [blog] in project [tough-racer-272817] region [asia-east1]
✓ Deploying... Done.
  ✓ Creating Revision...
  ✓ Routing traffic...
  ✓ Setting IAM Policy...
Done.
Service [blog] revision [blog-00014-dax] has been deployed and is serving 100 percent of traffic at https://blog-k3ndrinnqq-de.a.run.app
➜  dongnguyen.dev git:(master) ✗

Và xong ứng dụng của mình đã được deploy tại https://blog-k3ndrinnqq-de.a.run.app

Auto deploy khi push code lên GitHub

Để tự động hóa quá trình build và deploy thì mình dùng đến dịch vụ google cloud build, trình tự sẽ như thế này, kết nối GitHub repository với cloud build, tạo một triggerđến một event từ githubví dụ như là khi push to a branchpush new tag

Docker to Serverless (Google Cloud Platform)Docker to Serverless (Google Cloud Platform)

Ví dụ như trong hình mình setup một trigger cứ mỗi khi mình push code lên branch master thì cloud buildsẽ tiến hành làm những công việc mình đã định nghĩa trong file cloudbuild.yaml

Sau khi tạo xong trigger

Docker to Serverless (Google Cloud Platform)Docker to Serverless (Google Cloud Platform)

Nội dung file cloudbuild.yamltrong gitHub repository

steps:
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA', '.']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA']
- name: 'gcr.io/cloud-builders/docker'
  args: ['tag', 'asia.gcr.io/tough-racer-272817/blog:$SHORT_SHA', 'asia.gcr.io/tough-racer-272817/blog:latest']
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'asia.gcr.io/tough-racer-272817/blog:latest']
- name: 'gcr.io/cloud-builders/gcloud'
  args:
    - beta
    - run
    - deploy
    - --region=asia-east1
    - --image=asia.gcr.io/tough-racer-272817/blog:latest
    - --cpu=1
    - --memory=128Mi
    - --max-instances=1
    - --platform=managed
    - --port=80
    - --concurrency=100
    - --allow-unauthenticated
    - blog
images:
  - 'asia.gcr.io/tough-racer-272817/blog:latest'

Trình tự các bước mà cloud run sẽ làm

  1. Build image và đánh tagcho nó.
  2. Đẩy image đã build lên container registry
  3. Đánh thêm tag latest nữa cho image
  4. Đẩy image với tag latest lên container registry
  5. Chạy lệnh để deploylên cloud run với image có tag latest

Nhưng trước tiên, bạn phải setup kết nối gitHub repository và cấp quyền cho cloud build với thêm hai role Cloud Run Admin vàCloud Run Service Agent là trong cài đăt IAM

Docker to Serverless (Google Cloud Platform)Docker to Serverless (Google Cloud Platform)

Và bây giờ mọi thứ đã có thể diễn ra tự động rồi, mình sẽ commit code và push lên branch master, và đây là kết quả

Docker to Serverless (Google Cloud Platform)Docker to Serverless (Google Cloud Platform)

Thực ra thì cái gì cũng có hạn chế, serverless (Google cloud Platform) cũng vậy, đây là một vài issue đang tồn tại của Cloud Run nhưng so với nhau cầu serve static file hay là host một web api của mình thì cái này cũng đủ rồi.

Bài viết gốc được đăng tải tại medium.com

Có thể bạn quan tâm:

Xem thêm các việc làm Developer hấp dẫn tại Station D

Bài viết liên quan

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bộ cài đặt Laravel Installer đã hỗ trợ tích hợp Jetstream

Bài viết được sự cho phép của tác giả Chung Nguyễn Hôm nay, nhóm Laravel đã phát hành một phiên bản chính mới của “ laravel/installer ” bao gồm hỗ trợ khởi động nhanh các dự án Jetstream. Với phiên bản mới này khi bạn chạy laravel new project-name , bạn sẽ nhận được các tùy chọn Jetstream. Ví dụ: API Authentication trong Laravel-Vue SPA sử dụng Jwt-auth Cách sử dụng Laravel với Socket.IO laravel new foo --jet --dev Sau đó, nó sẽ hỏi bạn thích stack Jetstream nào hơn: Which Jetstream stack do you prefer? [0] Livewire [1] inertia > livewire Will your application use teams? (yes/no) [no]: ... Nếu bạn đã cài bộ Laravel Installer, để nâng cấp lên phiên bản mới bạn chạy lệnh: composer global update Một số trường hợp cập nhật bị thất bại, bạn hãy thử, gỡ đi và cài đặt lại nha composer global remove laravel/installer composer global require laravel/installer Bài viết gốc được đăng tải tại chungnguyen.xyz Có thể bạn quan tâm: Cài đặt Laravel Làm thế nào để chạy Sql Server Installation Center sau khi đã cài đặt xong Sql Server? Quản lý các Laravel route gọn hơn và dễ dàng hơn Xem thêm Tuyển dụng lập trình Laravel hấp dẫn trên Station D

By stationd
Principle thiết kế của các sản phẩm nổi tiếng

Principle thiết kế của các sản phẩm nổi tiếng

Tác giả: Lưu Bình An Phù hợp cho các bạn thiết kế nào ko muốn làm code dạo, design dạo nữa, bạn muốn cái gì đó cao hơn ở tầng khái niệm Nếu lập trình chúng ta có các nguyên tắc chung khi viết code như KISS , DRY , thì trong thiết kế cũng có những nguyên tắc chính khi làm việc. Những nguyên tắc này sẽ là kim chỉ nam, nếu có tranh cãi giữa các member trong team, thì cứ đè nguyên tắc này ra mà giải quyết (nghe hơi có mùi cứng nhắc, mình thì thích tùy cơ ứng biến hơn) Tìm các vị trí tuyển dụng designer lương cao cho bạn Nguyên tắc thiết kế của GOV.UK Đây là danh sách của trang GOV.UK Bắt đầu với thứ user cần Làm ít hơn Thiết kế với dữ liệu Làm mọi thứ thật dễ dàng Lặp. Rồi lặp lại lần nữa Dành cho tất cả mọi người Hiểu ngữ cảnh hiện tại Làm dịch vụ digital, không phải làm website Nhất quán, nhưng không hòa tan (phải có chất riêng với thằng khác) Cởi mở, mọi thứ tốt hơn Bao trừu tượng luôn các bạn, trang Gov.uk này cũng có câu tổng quát rất hay Thiết kế tốt là thiết kế có thể sử dụng. Phục vụ cho nhiều đối tượng sử dụng, dễ đọc nhất nhất có thể. Nếu phải từ bỏ đẹp tinh tế – thì cứ bỏ luôn . Chúng ta tạo sản phẩm cho nhu cầu sử dụng, không phải cho người hâm mộ . Chúng ta thiết kế để cả nước sử dụng, không phải những người đã từng sử dụng web. Những người cần dịch vụ của chúng ta nhất là những người đang cảm thấy khó sử dụng dịch...

By stationd
Hiểu về trình duyệt – How browsers work

Hiểu về trình duyệt – How browsers work

Bài viết được sự cho phép của vntesters.com Khi nhìn từ bên ngoài, trình duyệt web giống như một ứng dụng hiển thị những thông tin và tài nguyên từ server lên màn hình người sử dụng, nhưng để làm được công việc hiển thị đó đòi hỏi trình duyệt phải xử lý rất nhiều thông tin và nhiều tầng phía bên dưới. Việc chúng ta (Developers, Testers) tìm hiểu càng sâu tầng bên dưới để nắm được nguyên tắc hoạt động và xử lý của trình duyệt sẽ rất hữu ích trong công việc viết code, sử dụng các tài nguyên cũng như kiểm thử ứng dụng của mình. Cách để npm packages chạy trong browser Câu hỏi phỏng vấn mẹo về React: Component hay element được render trong browser? Khi hiểu được cách thức hoạt động của trình duyệt chúng ta có thể trả lời được rất nhiều câu hỏi như: Tại sao cùng một trang web lại hiển thị khác nhau trên hai trình duyệt? Tại sao chức năng này đang chạy tốt trên trình duyệt Firefox nhưng qua trình duyệt khác lại bị lỗi? Làm sao để trang web hiển thị nội dung nhanh và tối ưu hơn một chút?… Hy vọng sau bài này sẽ giúp các bạn có một cái nhìn rõ hơn cũng như giúp ích được trong công việc hiện tại. 1. Cấu trúc của một trình duyệt Trước tiên chúng ta đi qua cấu trúc, thành phần chung và cơ bản nhất của một trình duyệt web hiện đại, nó sẽ gồm các thành phần (tầng) như sau: Thành phần nằm phía trên là những thành phần gần với tương tác của người dùng, càng phía dưới thì càng sâu và nặng về xử lý dữ liệu hơn tương tác. Nhiệm...

By stationd
Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Thị trường EdTech Vietnam- Nhiều tiềm năng nhưng còn bị bỏ ngỏ tại Việt Nam

Lĩnh vực EdTech (ứng dụng công nghệ vào các sản phẩm giáo dục) trên toàn cầu hiện nay đã tương đối phong phú với nhiều tên tuổi lớn phân phối đều trên các hạng mục như Broad Online Learning Platforms (nền tảng cung cấp khóa học online đại chúng – tiêu biểu như Coursera, Udemy, KhanAcademy,…) Learning Management Systems (hệ thống quản lý lớp học – tiêu biểu như Schoology, Edmodo, ClassDojo,…) Next-Gen Study Tools (công cụ hỗ trợ học tập – tiểu biểu như Kahoot!, Lumosity, Curriculet,…) Tech Learning (đào tạo công nghệ – tiêu biểu như Udacity, Codecademy, PluralSight,…), Enterprise Learning (đào tạo trong doanh nghiệp – tiêu biểu như Edcast, ExecOnline, Grovo,..),… Hiện nay thị trường EdTech tại Việt Nam đã đón nhận khoảng đầu tư khoảng 55 triệu đô cho lĩnh vực này nhiều đơn vị nước ngoài đang quan tâm mạnh đến thị trường này ngày càng nhiều hơn. Là một trong những xu hướng phát triển tốt, và có doanh nghiệp đã hoạt động khá lâu trong ngành nêu tại infographic như Topica, nhưng EdTech vẫn chỉ đang trong giai đoạn sơ khai tại Việt Nam. Tại Việt Nam, hệ sinh thái EdTech trong nước vẫn còn rất non trẻ và thiếu vắng nhiều tên tuổi trong các hạng mục như Enterprise Learning (mới chỉ có MANA), School Administration (hệ thống quản lý trường học) hay Search (tìm kiếm, so sánh trường và khóa học),… Với chỉ dưới 5% số dân công sở có sử dụng một trong các dịch vụ giáo dục online, EdTech cho thấy vẫn còn một thị trường rộng lớn đang chờ được khai phá. *** Vừa qua Station D đã công bố Báo cáo Vietnam IT Landscape 2019 đem đến cái nhìn toàn cảnh về các ứng dụng công...

By stationd