1. قبل البدء
قد يكون تشغيل المواقع الإلكترونية أمرًا صعبًا بسبب كل النفقات العامة لإنشاء وإدارة مثيلات الأجهزة الافتراضية والمجموعات ووحدات Pod والخدمات وغير ذلك. هذا مناسب للتطبيقات الأكبر حجمًا والمتعددة المستويات، ولكن إذا كنت تحاول فقط نشر موقعك الإلكتروني وإتاحته للجميع، فإنّ ذلك يتطلّب الكثير من الجهد.
باستخدام Cloud Run، وهي خدمة تنفيذ Knative على Google Cloud، يمكنك إدارة موقعك الإلكتروني ونشره بدون أي تكاليف إضافية تحتاج إليها لعمليات النشر المستندة إلى الأجهزة الافتراضية أو Kubernetes. وهذه الطريقة ليست أسهل من ناحية الإدارة فحسب، بل تتيح لك أيضًا إمكانية التوسّع إلى الصفر عندما لا تصل أي طلبات إلى موقعك الإلكتروني.
في هذا الدرس التطبيقي حول الترميز، ستبدأ بصورة Docker تم إنشاؤها من خلال Cloud Build، والتي يمكنك تشغيلها في Cloud Shell. بعد ذلك، يمكنك نشر هذه الصورة على Cloud Run باستخدام أمر في Cloud Shell.
المتطلبات الأساسية
- معرفة عامة بـ Docker (راجِع قسم البدء في الموقع الإلكتروني لـ Docker)
أهداف الدورة التعليمية
- كيفية إنشاء صورة Docker باستخدام Cloud Build وتحميلها إلى gcr.io
- كيفية نشر صور Docker على Cloud Run
- كيفية إدارة عمليات نشر Cloud Run
- كيفية إعداد نقطة نهاية لتطبيق على Cloud Run
ما ستنشئه
- موقع إلكتروني ثابت يعمل داخل حاوية Docker
- إصدار من هذه الحاوية متوفّر في Container Registry
- عملية نشر Cloud Run لموقعك الإلكتروني الثابت
المتطلبات
- حساب Google لديه إذن وصول إداري لإنشاء مشاريع أو مشروع لديه دور مالك المشروع
2. إعداد البيئة
إعداد البيئة بوتيرة ذاتية
إذا لم يكن لديك حساب على Google، عليك إنشاء حساب. بعد ذلك، سجِّل الدخول إلى Google Cloud Console وانقر على المشروع > إنشاء مشروع.


تذكَّر رقم تعريف المشروع الذي تتم تعبئته تلقائيًا تحت اسم مشروعك. رقم تعريف المشروع هو اسم فريد في جميع مشاريع Google Cloud، لذا تم استخدام الاسم الوارد في لقطة الشاشة من قبل ولن يكون متاحًا لك. سيُشار إليه لاحقًا باسم PROJECT_ID.
بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد Google Cloud وتفعيل Cloud Run API.
تفعيل Cloud Run API
انقر على قائمة التنقّل ☰ > واجهات برمجة التطبيقات والخدمات > لوحة البيانات > تفعيل واجهات برمجة التطبيقات والخدمات. .

ابحث عن "Cloud Run API"، ثم انقر على Cloud Run API > تفعيل.

لن تكلفك تجربة هذا الدرس البرمجي أكثر من بضعة دولارات، ولكن قد تكون التكلفة أعلى إذا قررت استخدام المزيد من الموارد أو إذا تركتها قيد التشغيل (راجِع قسم التنظيف في النهاية). لمزيد من المعلومات، اطّلِع على الأسعار.
يمكن لمستخدمي Google Cloud الجدد الاستفادة من فترة تجريبية مجانية بقيمة 300 دولار أمريكي.
Cloud Shell
على الرغم من إمكانية تشغيل Google Cloud وCloud Run عن بُعد من الكمبيوتر المحمول، ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud. تمّت تهيئة البيئة مسبقًا باستخدام جميع مكتبات وبرامج العميل التي تحتاج إليها.
يتم تحميل هذا الجهاز الافتراضي المستند إلى Debian بجميع أدوات التطوير التي تحتاج إليها. توفّر هذه الخدمة دليلًا رئيسيًا دائمًا بسعة 5 غيغابايت وتعمل في Google Cloud، ما يؤدي إلى تحسين أداء الشبكة والمصادقة بشكل كبير. وهذا يعني أنّ كل ما تحتاجه لهذا الدرس التطبيقي حول الترميز هو متصفّح (نعم، يمكن استخدامه على جهاز Chromebook).
- لتفعيل Cloud Shell من Cloud Console، ما عليك سوى النقر على تفعيل Cloud Shell
(يستغرق توفير البيئة والاتصال بها بضع لحظات فقط).
بعد الاتصال بـ 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:
يضبط Cloud Shell أيضًا بعض متغيرات البيئة تلقائيًا، ما قد يكون مفيدًا عند تنفيذ الأوامر المستقبلية.
echo $GOOGLE_CLOUD_PROJECT
ناتج الأمر
<PROJECT_ID>
- أخيرًا، اضبط المنطقة التلقائية وإعدادات المشروع.
gcloud config set compute/zone us-central1-f
يمكنك اختيار مجموعة متنوعة من المناطق المختلفة. لمزيد من المعلومات، يُرجى الاطّلاع على الأقاليم والمناطق.
3- إنشاء نسخة طبق الأصل من مستودع المصدر
بما أنّك ستنشر موقعًا إلكترونيًا حاليًا، ما عليك سوى استنساخ المصدر من المستودع، ما يتيح لك التركيز على إنشاء صور Docker ونشرها على Cloud Run.
نفِّذ الأوامر التالية لاستنساخ المستودع إلى مثيل Cloud Shell والانتقال إلى الدليل المناسب. ستثبّت أيضًا تبعيات Node.js لتتمكّن من اختبار تطبيقك قبل نشره.
cd ~ git clone https://github.com/googlecodelabs/monolith-to-microservices.git cd ~/monolith-to-microservices ./setup.sh
سيؤدي ذلك إلى استنساخ المستودع وتغيير الدليل وتثبيت التبعيات اللازمة لتشغيل تطبيقك محليًا. وقد يستغرق تشغيل النص البرمجي بضع دقائق.
عليك بذل العناية الواجبة واختبار تطبيقك. شغِّل الأمر التالي لبدء تشغيل خادم الويب:
cd ~/monolith-to-microservices/monolith npm start
إخراج:
Monolith listening on port 8080!
يمكنك معاينة تطبيقك من خلال النقر على معاينة الويب
واختيار معاينة على المنفذ 8080.

سيؤدي ذلك إلى فتح نافذة جديدة يمكنك فيها رؤية متجرك على Fancy وهو يعمل.

يمكنك إغلاق هذه النافذة بعد الاطّلاع على الموقع الإلكتروني. لإيقاف عملية خادم الويب، اضغط على CONTROL+C (Command+C على جهاز Macintosh) في نافذة الوحدة الطرفية.
4. إنشاء حاوية Docker باستخدام Cloud Build
بعد أن أصبحت ملفات المصدر جاهزة، حان الوقت لإنشاء حاوية Docker لتطبيقك.
في العادة، عليك اتّخاذ خطوتين، وهما إنشاء حاوية Docker ونقلها إلى سجل لتخزين الصورة التي يمكن لـ GKE استردادها منه. ومع ذلك، يمكنك تسهيل الأمر باستخدام Cloud Build لإنشاء حاوية Docker ووضع الصورة في Container Registry باستخدام أمر واحد. للاطّلاع على العملية اليدوية لإنشاء Dockerfile ونشره، يُرجى الاطّلاع على البدء السريع في Container Registry.
تضغط Cloud Build الملفات من الدليل وتنقلها إلى حزمة Cloud Storage. بعد ذلك، تأخذ عملية التصميم جميع الملفات من الحزمة وتستخدم ملف Dockerfile المتوفّر في الدليل نفسه لتشغيل عملية إنشاء Docker. بما أنّك حدّدت العلامة --tag مع المضيف gcr.io لصورة Docker، سيتم إرسال صورة Docker الناتجة إلى Container Registry.
أولاً، عليك التأكّد من تفعيل Cloud Build API. نفِّذ الأمر التالي لتفعيله:
gcloud services enable cloudbuild.googleapis.com
بعد تفعيل واجهة برمجة التطبيقات، نفِّذ الأمر التالي في Cloud Shell لبدء عملية الإنشاء:
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 .
تستغرق هذه العملية بضع دقائق، ولكن بعد اكتمالها، ستظهر في الوحدة الطرفية نتيجة مشابهة لما يلي:
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ID CREATE_TIME DURATION SOURCE IMAGES STATUS 1ae295d9-63cb-482c-959b-bc52e9644d53 2019-08-29T01:56:35+00:00 33S gs://<PROJECT_ID>_cloudbuild/source/1567043793.94-abfd382011724422bf49af1558b894aa.tgz gcr.io/<PROJECT_ID>/monolith:1.0.0 SUCCESS
لعرض سجلّ الإنشاء أو مشاهدة العملية في الوقت الفعلي، يمكنك الانتقال إلى Cloud Console، ثم النقر على قائمة التنقّل ☰ > Cloud Build > السجلّ. ستظهر لك قائمة بجميع الإصدارات السابقة، ولكن من المفترض أن يظهر الإصدار الذي أنشأته فقط.

إذا نقرت على رقم التعريف الخاص بالإصدار، يمكنك الاطّلاع على جميع تفاصيل هذا الإصدار، بما في ذلك ناتج السجلّ. يمكنك عرض صورة الحاوية التي تم إنشاؤها من خلال النقر على الرابط بجانب الصورة.

5- نشر الحاوية على Cloud Run
بعد إنشاء حاوية لموقعك الإلكتروني ونقلها إلى Container Registry، حان وقت نشرها على Cloud Run.
هناك طريقتان للنشر على Cloud Run:
- Cloud Run (مُدارة بالكامل) هو نموذج خدمة تأجير المنصات (PaaS) الذي تتم فيه إدارة دورة حياة الحاوية بأكملها. سنستخدم هذا الأسلوب في هذا الدرس التطبيقي.
- Cloud Run for Anthos هي خدمة Cloud Run مع طبقة تحكّم إضافية، ما يتيح لك نقل المجموعات ووحدات Pod من GKE. لمزيد من المعلومات، يُرجى الاطّلاع على إعداد Cloud Run for Anthos على Google Cloud.
ستكون أمثلة سطر الأوامر في Cloud Shell باستخدام متغيرات البيئة التي أعددتها سابقًا.
سطر الأوامر
نفِّذ الأمر التالي لنشر تطبيقك:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed
سيُطلب منك تحديد المنطقة التي تريد عرض الإعلانات فيها. اختَر المنطقة الأقرب إليك، ثم اقبل اسم الخدمة التلقائي المقترَح (monolith).

لأغراض الاختبار، اسمح بطلبات غير مصادَق عليها إلى التطبيق. أدخِل y عند ظهور الطلب.

التحقّق من عملية النشر
للتحقّق من إنشاء عملية النشر بنجاح، شغِّل الأمر التالي. قد يستغرق Pod status بعض الوقت حتى يصبح Running:
gcloud run services list
اختَر [1] Cloud Run (إدارة كاملة).
إخراج:
SERVICE REGION URL LAST DEPLOYED BY LAST DEPLOYED AT ✔ monolith us-east1 <your url> <your email> 2019-09-16T21:07:38.267Z
يعرض الناتج عدة معلومات. يمكنك الاطّلاع على عملية النشر، بالإضافة إلى المستخدم الذي نفّذها (عنوان بريدك الإلكتروني) وعنوان URL الذي يمكنك استخدامه للوصول إلى التطبيق. يبدو أنّه تم إنشاء كل شيء بنجاح.
افتح عنوان URL المقدَّم في قائمة الخدمات في متصفّح الويب، وسيظهر لك الموقع الإلكتروني نفسه الذي عاينته محليًا.
6. إنشاء مراجعة جديدة بتزامن أقل
الآن، أعِد نشر تطبيقك، ولكن عدِّل إحدى المَعلمات هذه المرة.
تلقائيًا، سيكون لتطبيق Cloud Run قيمة تزامن تبلغ 80، ما يعني أنّ كل مثيل حاوية سيعالج ما يصل إلى 80 طلبًا في المرة الواحدة. وهذا يختلف كثيرًا عن نموذج الوظائف كخدمة (FaaS)، حيث يتعامل مثيل واحد مع طلب واحد في كل مرة.
أعِد نشر صورة الحاوية نفسها بقيمة تزامن تبلغ 1 (لأغراض الاختبار فقط) واطّلِع على النتيجة.
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 1
أجِب عن الأسئلة اللاحقة بالطريقة نفسها التي أجبت بها عن السؤال الأول. بعد نجاح الأمر، راجِع Cloud Console للاطّلاع على النتيجة.
من لوحة بيانات Cloud Run، انقر على خدمة monolith للاطّلاع على التفاصيل.

انقر على علامة التبويب التعديلات. من المفترض أن ترى نسختَين معدَّلتَين تم إنشاؤهما. انقر على monolith-00002 وراجِع التفاصيل. يجب أن تلاحظ انخفاض قيمة التزامن إلى 1.
]

على الرغم من أنّ هذا الإعداد يكفي للاختبار، إلا أنّه في معظم سيناريوهات الإنتاج، ستتوفّر حاويات تتيح معالجة طلبات متزامنة متعددة.
الآن، استعِدّ التزامن الأصلي بدون إعادة النشر. يمكنك ضبط قيمة الاستخدام المتزامن على القيمة التلقائية البالغة 80 أو 0، ما سيؤدي إلى إزالة أي قيود على الاستخدام المتزامن وضبطها على الحد الأقصى التلقائي (الذي يبلغ 80 في وقت كتابة هذا المقال).
نفِّذ الأمر التالي في Cloud Shell لتعديل المراجعة الحالية:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --platform managed --concurrency 80
لاحظ أنّه تم إنشاء مراجعة أخرى، وأنّه تمت إعادة توجيه عدد الزيارات، وأنّ التزامن عاد إلى 80.
7. إجراء تغييرات على الموقع الإلكتروني
طلب منك فريق التسويق تغيير الصفحة الرئيسية لموقع شركتك الإلكتروني. ويرى أنّها يجب أن تكون أكثر إفادةً بشأن طبيعة الشركة والمنتجات التي تبيعها. في هذا القسم، ستضيف بعض النصوص إلى الصفحة الرئيسية لإرضاء فريق التسويق.
يبدو أنّ أحد المطوّرين قد أجرى التغييرات باستخدام اسم الملف index.js.new. يمكنك ببساطة نسخ هذا الملف إلى index.js، ومن المفترض أن تظهر التغييرات. اتّبِع التعليمات لإجراء التغييرات المناسبة.
نفِّذ الأوامر التالية، وانسخ الملف المعدَّل إلى اسم الملف الصحيح، واطبع محتواه للتحقّق من التغييرات:
cd ~/monolith-to-microservices/react-app/src/pages/Home mv index.js.new index.js cat ~/monolith-to-microservices/react-app/src/pages/Home/index.js
يجب أن تبدو التعليمة البرمجية الناتجة على النحو التالي:
/*
Copyright 2019 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
import React from "react";
import { makeStyles } from "@material-ui/core/styles";
import Paper from "@material-ui/core/Paper";
import Typography from "@material-ui/core/Typography";
const useStyles = makeStyles(theme => ({
root: {
flexGrow: 1
},
paper: {
width: "800px",
margin: "0 auto",
padding: theme.spacing(3, 2)
}
}));
export default function Home() {
const classes = useStyles();
return (
<div className={classes.root}>
<Paper className={classes.paper}>
<Typography variant="h5">
Fancy Fashion & Style Online
</Typography>
<br />
<Typography variant="body1">
Tired of mainstream fashion ideas, popular trends and societal norms?
This line of lifestyle products will help you catch up with the Fancy trend and express your personal style.
Start shopping Fancy items now!
</Typography>
</Paper>
</div>
);
}
لقد عدّلت مكوّنات React، ولكن عليك إنشاء تطبيق React لإنشاء الملفات الثابتة. نفِّذ الأمر التالي لإنشاء تطبيق React ونسخه إلى الدليل العام المتكامل:
cd ~/monolith-to-microservices/react-app npm run build:monolith
بعد تعديل الرمز، عليك إعادة إنشاء حاوية Docker ونشرها في Container Registry. يمكنك استخدام الأمر نفسه كما في السابق، ولكن هذه المرة ستعدّل تصنيف الإصدار.
نفِّذ الأمر التالي لتفعيل إصدار جديد من Cloud Build يتضمّن إصدارًا معدَّلاً من الصورة هو 2.0.0:
cd ~/monolith-to-microservices/monolith
#Feel free to test your application
npm start
gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 .
في القسم التالي، ستستخدم هذه الصورة لتعديل تطبيقك بدون أي وقت تعطل.
8. تعديل الموقع الإلكتروني بدون توقّف
اكتملت التغييرات، وفريق التسويق راضٍ عن التعديلات التي أجريتها. حان الوقت لتعديل الموقع الإلكتروني بدون مقاطعة المستخدمين.
يتعامل Cloud Run مع كل عملية نشر على أنّها إصدار جديد، وسيتم إتاحة هذا الإصدار على الإنترنت ثم إعادة توجيه الزيارات إليه.
اتّبِع مجموعات التعليمات التالية لتعديل موقعك الإلكتروني.
سطر الأوامر
من سطر الأوامر، يمكنك إعادة نشر الخدمة لتعديل الصورة إلى إصدار جديد باستخدام الأمر التالي:
gcloud run deploy --image=gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --platform managed
التحقّق من عملية النشر
تحقَّق من صحة تعديل عملية النشر من خلال تنفيذ الأمر التالي:
gcloud run services describe monolith --platform managed
تظهر النتيجة على النحو التالي:
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
annotations:
client.knative.dev/user-image: gcr.io/my-cloudrun-codelab/monolith:2.0.0
...
سيظهر لك أنّ خدمتك تستخدم الآن أحدث إصدار من صورتك التي تم نشرها في مراجعة جديدة.
للتحقّق من التغييرات، انتقِل إلى عنوان URL الخارجي لخدمة Cloud Run مرة أخرى ولاحظ أنّه تم تعديل عنوان تطبيقك.
نفِّذ الأمر التالي لإدراج الخدمات وعرض عنوان IP إذا نسيته:
gcloud run services list
من المفترض أن يعرض موقعك الإلكتروني الآن النص الذي أضفته إلى مكوّن الصفحة الرئيسية.

9- تَنظيم
حذف صور Container Registry
# Delete the container image for version 1.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:1.0.0 --quiet
# Delete the container image for version 2.0.0 of our monolith
gcloud container images delete gcr.io/${GOOGLE_CLOUD_PROJECT}/monolith:2.0.0 --quiet
حذف عناصر Cloud Build من Cloud Storage
# The following command will take all source archives from all builds and delete them from cloud storage
# Run this command to print all sources:
# gcloud builds list | awk 'NR > 1 {print $4}'
gcloud builds list | awk 'NR > 1 {print $4}' | while read line; do gsutil rm $line; done
حذف خدمة Cloud Run
gcloud run services delete monolith --platform managed
10. تهانينا
لقد نشرت موقعك الإلكتروني وعدّلت حجمه وعدّلته باستخدام Cloud Run.