نشر حاوية وتشغيلها باستخدام تشغيل السحابة الإلكترونية على Node.js

1. قبل البدء

6a5cf23c8e20491f.png

Cloud Run هي منصة حوسبة مُدارة تتيح لك تشغيل حاويات لا تتضمّن حالة ويمكن استدعاؤها من خلال طلبات HTTP. ‫Cloud Run هي خدمة بدون خادم، فهي تلغي الحاجة إلى إدارة البنية الأساسية، ما يتيح لك التركيز على الأهم، وهو إنشاء تطبيقات رائعة. تم إنشاء هذه الخدمة باستخدام Knative، ما يتيح لك اختيار تشغيل الحاويات باستخدام Cloud Run (المدارة بالكامل) أو Cloud Run for Anthos. الهدف من هذا الدرس التطبيقي حول الترميز هو إنشاء صورة حاوية ونشرها على Cloud Run.

المتطلبات الأساسية

لا ينطبق

2. الإعداد والمتطلبات

إعداد البيئة بالسرعة التي تناسبك

  1. سجِّل الدخول إلى Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. (إذا لم يكن لديك حساب على Gmail أو G Suite، عليك إنشاء حساب).

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

تذكَّر رقم تعريف المشروع، وهو اسم فريد في جميع مشاريع Google Cloud (الاسم أعلاه مستخدَم حاليًا ولن يكون متاحًا لك، نأسف لذلك). سيتم الإشارة إليه لاحقًا في هذا الدرس العملي باسم PROJECT_ID.

  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد Google Cloud.

لن تكلفك تجربة هذا الدرس التطبيقي حول الترميز الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. احرص على اتّباع أي تعليمات في قسم "التنظيف" الذي ينصحك بكيفية إيقاف الموارد حتى لا تتحمّل رسومًا تتجاوز هذا البرنامج التعليمي. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

Cloud Shell

يمكنك تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ولكنك ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud.

يتم تحميل هذا الجهاز الافتراضي المستند إلى Debian بجميع أدوات التطوير التي تحتاج إليها. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. وهذا يعني أنّ كل ما تحتاجه لهذا الدرس التطبيقي حول الترميز هو متصفّح (نعم، يمكن استخدامه على جهاز Chromebook).

  1. لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (يستغرق توفير البيئة والاتصال بها بضع لحظات فقط).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Screen Shot 2017-06-14 at 10.13.43 PM.png

بعد الاتصال بـ Cloud Shell، من المفترض أن يظهر لك أنّه تمّت المصادقة عليك وأنّ المشروع تمّ ضبطه مسبقًا على PROJECT_ID.

gcloud auth list

ناتج الأمر

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

ناتج الأمر

[core]
project = <PROJECT_ID>

إذا لم يتم ضبط المشروع لسبب ما، ما عليك سوى تنفيذ الأمر التالي:

gcloud config set project <PROJECT_ID>

هل تبحث عن PROJECT_ID؟ يمكنك الاطّلاع على المعرّف الذي استخدمته في خطوات الإعداد أو البحث عنه في لوحة بيانات Cloud Console:

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

يضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، ما قد يكون مفيدًا عند تنفيذ الأوامر المستقبلية.

echo $GOOGLE_CLOUD_PROJECT

ناتج الأمر

<PROJECT_ID>
  1. أخيرًا، اضبط المنطقة التلقائية وإعدادات المشروع.
gcloud config set compute/zone us-central1-f

يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. لمزيد من المعلومات، يُرجى الاطّلاع على الأقاليم والمناطق.

تفعيل Cloud Run API

من Cloud Shell، فعِّل Cloud Run API.

gcloud services enable run.googleapis.com

من المفترض أن يؤدي ذلك إلى ظهور رسالة نجاح مشابهة لما يلي:

Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.

3- كتابة نموذج التطبيق

ستنشئ تطبيقًا بسيطًا يستند إلى Express.js ويعمل على Node.js ويستجيب لطلبات HTTP.

لإنشاء تطبيقك، استخدِم Cloud Shell لإنشاء دليل جديد باسم helloworld-nodejs وتغيير الدليل إلى هذا الدليل.

mkdir helloworld-nodejs
cd helloworld-nodejs

أنشِئ ملف package.json يتضمّن المحتوى التالي:

{
  "name": "cloudrun-helloworld",
  "version": "1.0.0",
  "description": "Simple hello world sample in Node",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "author": "",
  "license": "Apache-2.0",
  "dependencies": {
    "express": "^4.17.1"
  }
}

والأهم من ذلك، يحتوي الملف أعلاه على أمر نصي لبدء التشغيل وعلى تبعية لإطار عمل تطبيق الويب Express.

بعد ذلك، في الدليل نفسه، أنشئ ملف index.js وانسخ المحتوى التالي إليه:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log('Hello world received a request.');

  const target = process.env.TARGET || 'World';
  res.send(`Hello ${target}!`);
});

const port = process.env.PORT || 8080;
app.listen(port, () => {
  console.log('Hello world listening on port', port);
});

تنشئ هذه التعليمات البرمجية خادم ويب أساسيًا يستمع إلى المنفذ المحدّد بواسطة متغيّر البيئة PORT. أصبح تطبيقك الآن جاهزًا ليتم وضعه في حاوية واختباره وتحميله إلى Container Registry.

4. تضمين تطبيقك في حاوية وتحميله إلى Container Registry

لإنشاء حاوية للتطبيق النموذجي، أنشئ ملفًا جديدًا باسم Dockerfile في الدليل نفسه الذي توجد فيه ملفات المصدر، وانسخ المحتوى التالي إليه:

# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

الآن، أنشئ صورة الحاوية باستخدام Cloud Build من خلال تنفيذ الأمر التالي من الدليل الذي يحتوي على Dockerfile:

gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

$GOOGLE_CLOUD_PROJECT هو متغيّر بيئة يحتوي على رقم تعريف مشروعك على Google Cloud عند التشغيل في Cloud Shell. يمكنك أيضًا الحصول عليه من خلال تنفيذ gcloud config get-value project.

بعد إرسال الصورة إلى السجلّ، ستظهر لك SUCCESS رسالة تحتوي على اسم الصورة (gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld). يتم تخزين الصورة في Container Registry ويمكن إعادة استخدامها إذا أردت ذلك.

يمكنك إدراج جميع صور الحاويات المرتبطة بمشروعك الحالي باستخدام الأمر التالي:

gcloud container images list

إذا أردت تشغيل التطبيق واختباره محليًا من Cloud Shell، يمكنك بدء تشغيله باستخدام الأمر العادي docker التالي:

docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

في Cloud Shell، انقر على معاينة الويب 170b7a95be8c6296.png واختَر المعاينة على المنفذ 8080.

3618ca3a4a135570.png

سيؤدي ذلك إلى فتح نافذة متصفّح تعرض الرسالة Hello World!‎

a0307f34cacf9e6a.png

يمكنك أيضًا استخدام curl localhost:8080 ببساطة.

5- النشر على Cloud Run

يتم نشر تطبيقك الذي يعمل في حاوية على Cloud Run باستخدام الأمر التالي (احرص على تعديله ليناسب اسم الصورة الصحيح للتطبيق الذي أنشأته أو استخدِم الصورة الجاهزة gcr.io/cloudrun/hello):

gcloud run deploy helloworld \
  --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \
  --platform managed \
  --region us-central1 \
  --allow-unauthenticated

يتيح لك خيار النشر --allow-unauthenticated الوصول إلى التطبيق بدون مصادقة. يعني خيار النشر --platform managed \ أنّك تطلب بيئة مُدارة بالكامل (وليس بنية Kubernetes الأساسية من خلال Anthos).

انتظِر بضع لحظات حتى يكتمل النشر. عند الانتهاء، يعرض سطر الأوامر عنوان URL الخاص بالخدمة.

Service [helloworld] revision [helloworld-00001] has been deployed
and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app

يمكنك الآن الانتقال إلى الحاوية التي تم نشرها من خلال فتح عنوان URL الخاص بالخدمة في متصفّح ويب:

63260b4d3aee42b8.png

يزيد Cloud Run تلقائيًا وبشكل أفقي من حجم صورة الحاوية للتعامل مع الطلبات المستلَمة، ثم يقلّل من حجمها عند انخفاض الطلب. لن تدفع إلا مقابل وحدة المعالجة المركزية والذاكرة والشبكة المستخدَمة أثناء معالجة الطلب.

6. تَنظيم

على الرغم من أنّ Cloud Run لا تفرض رسومًا عندما لا تكون الخدمة قيد الاستخدام، قد يتم تحصيل رسوم منك مقابل تخزين صورة الحاوية التي تم إنشاؤها.

يمكنك إما حذف مشروعك على Google Cloud لتجنُّب تحمّل الرسوم، ما سيؤدي إلى إيقاف الفوترة لجميع الموارد المستخدَمة في هذا المشروع، أو يمكنك ببساطة حذف صورة helloworld باستخدام الأمر التالي:

gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld

لحذف خدمة Cloud Run، استخدِم الأمر التالي:

gcloud run services delete helloworld \
  --platform managed \
  --region us-central1

7. تهانينا

تهانينا! لقد نشرت تطبيقًا مضمّنًا في صورة حاوية على Cloud Run.

مزيد من المعلومات

يمكنك الاطّلاع على البدء السريع: النشر على Cloud Run for Anthos على Google Cloud.

لمزيد من المعلومات حول إنشاء حاوية HTTP لا يتم تسجيل بياناتها ومناسبة لأداة Cloud Run من مصدر الرمز البرمجي ونقلها إلى Container Registry، يُرجى الاطّلاع على المراجع التالية:

لمزيد من المعلومات حول Knative، وهو مشروع مفتوح المصدر أساسي، يُرجى الاطّلاع على Knative.