1. نظرة عامة
Docker هي منصة مفتوحة لتطوير التطبيقات وشحنها وتشغيلها. باستخدام Docker، يمكنك فصل تطبيقاتك عن بنيتك الأساسية والتعامل مع بنيتك الأساسية كتطبيق مُدار. تساعدك Docker في إرسال الرموز البرمجية بشكل أسرع، وإجراء الاختبارات بشكل أسرع، ونشر التطبيقات بشكل أسرع، وتقصير المدة بين كتابة الرموز البرمجية وتشغيلها.
تتيح Docker ذلك من خلال الجمع بين ميزات إنشاء الحاويات في النواة وسير العمل والأدوات التي تساعدك في إدارة تطبيقاتك ونشرها.
يمكن استخدام حاويات Docker مباشرةً في Kubernetes، ما يتيح تشغيلها بسهولة في Kubernetes Engine. بعد تعلُّم أساسيات Docker، ستكتسب المهارات اللازمة لبدء تطوير تطبيقات Kubernetes والتطبيقات التي تعمل في حاويات.
أهداف الدورة التعليمية
في هذه الميزة الاختبارية، ستتعرّف على كيفية تنفيذ ما يلي:
- إنشاء ملف Dockerfile لتطبيق نموذجي
- إنشاء صورة
- تشغيل الصورة كحاوية على الجهاز
- تغيير سلوك الحاوية
- إرسال الصورة إلى Artifact Registry
المتطلبات الأساسية
هذا مختبر للمستوى التمهيدي. يتم افتراض عدم توفّر خبرة سابقة في Docker والحاويات أو توفّر خبرة قليلة. يُنصح بالاطّلاع على Cloud Shell وواجهة سطر الأوامر، ولكن ليس ذلك شرطًا.
إعداد البيئة بوتيرة ذاتية
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة من الأحرف لا تستخدمها Google APIs، ويمكنك تعديلها في أي وقت.
- يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud، كما أنّه غير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس الترميز، عليك الرجوع إلى رقم تعريف المشروع (ويتم تحديده عادةً على أنّه
PROJECT_ID)، لذا إذا لم يعجبك، يمكنك إنشاء رقم آخر عشوائي، أو يمكنك تجربة رقمك الخاص ومعرفة ما إذا كان متاحًا. ثم يتم "تجميده" بعد إنشاء المشروع. - هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا الدرس التطبيقي حول الترميز، اتّبِع أي تعليمات "تنظيف" واردة في نهاية الدرس. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
2. تطبيق نموذجي
تم توفير نموذج تطبيق لتسهيل هذا الدرس التطبيقي. في هذا القسم، ستسترجع رمز المصدر وتنشئ التطبيق في شكله الأصلي قبل الانتقال إلى عملية إنشاء الحاويات.
رمز المصدر
يتوفّر رمز المصدر الخاص بهذا المختبر في مستودع GoogleCloudPlatform/container-developer-workshop مع مستندات التطبيق النموذجي.
ضبط git
git config --global user.name ${USER}
git config --global user.email ${USER}@qwiklabs.net
إنشاء نسخة طبق الأصل من مستودع Cloud Source Repositories لتطبيق العيّنة
gcloud source repos clone sample-app ${HOME}/sample-app &&
cd ${HOME}/sample-app &&
git checkout main
الناتج
Cloning into '/home/student_03_49720296e995/sample-app'... remote: Finding sources: 100% (16/16) remote: Total 16 (delta 0), reused 16 (delta 0) Receiving objects: 100% (16/16), 47.23 KiB | 681.00 KiB/s, done. warning: remote HEAD refers to nonexistent ref, unable to checkout. Project [qwiklabs-gcp-02-4327c4e03d82] repository [sample-app] was cloned to [/home/student_03_49720296e995/sample-app]. Branch 'main' set up to track remote branch 'main' from 'origin'. Switched to a new branch 'main'
إنشاء تطبيق العيّنة
cd ${HOME}/sample-app
./mvnw compile
الناتج
[INFO] Scanning for projects... ... [INFO] Compiling 1 source file to /home/student_03_49720296e995/sample-app/target/classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10.080 s [INFO] Finished at: 2022-02-23T17:14:30Z [INFO] ------------------------------------------------------------------------
تشغيل التطبيق النموذجي
cd ${HOME}/sample-app
./mvnw exec:java
الناتج
[INFO] Scanning for projects... ... Listening at http://localhost:8080
معاينة التطبيق قيد التشغيل
- انقر على زر "معاينة الويب" في Cloud Shell
- انقر على "معاينة" على المنفذ 8080
عند الانتهاء
- اضغط على CTRL + c في Cloud Shell لإيقاف التطبيق قيد التشغيل
3- ملف شامل
تضمين التطبيق في حاوية باستخدام ملف Dockerfile
إحدى طرق تجميع تطبيق في حاوية هي استخدام Dockerfile. يشبه Dockerfile نصًا برمجيًا يوجّه البرنامج الخفي إلى كيفية تجميع صورة الحاوية. لمزيد من المعلومات، يُرجى الاطّلاع على المستندات المرجعية الخاصة بملف Dockerfile.
أنشئ ملف Dockerfile فارغًا في مستودع التطبيق النموذجي.
touch ${HOME}/sample-app/Dockerfile
افتح ملف Dockerfile في المحرّر الذي تختاره.
vi ${HOME}/sample-app/Dockerfile
اختيار صورة أولية
يتطلّب استخدام طريقة Dockerfile لإنشاء حاوية معرفة مباشرة بالتطبيق من أجل تجميع الحاوية. تتمثّل الخطوة الأولى لإنشاء Dockerfile في اختيار صورة سيتم استخدامها كأساس لصورتك.يجب أن تكون هذه الصورة صورة رئيسية أو أساسية يتم صيانتها ونشرها من قِبل مصدر موثوق به، وعادةً ما يكون شركتك.
تعمل التعليمات FROM على بدء مرحلة إنشاء جديدة وتحديد الصورة الأساسية للأوامر المتسلسلة اللاحقة. وبالتالي، فإنّ التعليمات FROM هي عادةً التعليمات الأولى في ملف Dockerfile ولا يمكن أن يسبقها سوى تعليمات ARG اختيارية لدعم المتغيرات.
البنية: FROM <image>[:<tag> | @<digest>] [AS <name>]
يكون تنسيق الصورة <image>:<tag> أو <image>@<digest>. إذا لم يتم تحديد علامة أو ملخّص، سيتم تلقائيًا استخدام العلامة :latest. يختلف تنسيق <image> استنادًا إلى سجلّ الصور المستخدَم لتخزين الصورة. بالنسبة إلى Artifact Registry، يكون التنسيق <image> هو <region>-docker.pkg.dev/<project ID>/<repository name>/<image name>:<image tag>.
بالنسبة إلى هذه الميزة الاختبارية، نستخدم صورة openjdk:11.0-jdk العامة، ونضيف السطر التالي إلى ملف Dockerfile
FROM openjdk:11.0-jdk
ضبط دليل العمل
تضبط مجموعة التعليمات WORKDIR دليل العمل لأي تعليمات متسلسلة تليها في Dockerfile. لمزيد من المعلومات، يُرجى الاطّلاع على قسم WORKDIR في المستندات المرجعية الخاصة بملف Dockerfile.
البنية: WORKDIR <path>
في هذا الدرس التطبيقي، سنستخدم الدليل /app كـ WORKDIR، لذا أضِف السطر التالي إلى أسفل ملف Dockerfile
WORKDIR /app
نسخ ملفات التطبيق
تنسخ التعليمات COPY الأدلة أو الملفات من الموقع <source> إلى المسار <destination> لنظام ملفات الصور. يمكن تحديد عدّة موارد <source>، وكلها تكون مرتبطة بسياق الإنشاء. سيتم تناول سياق الإنشاء بمزيد من التفصيل في قسم "الإنشاء". لمزيد من المعلومات، يُرجى الاطّلاع على قسم COPY في المستندات المرجعية الخاصة بملف Dockerfile.
البنية: COPY <source>... <destination>
في هذا المختبر، سننسخ جميع الملفات في المستودع إلى نظام ملفات الصورة، ونضيف السطر التالي إلى أسفل ملف Dockerfile
COPY . /app
تجميع التطبيق
ينفّذ الأمر RUN الأوامر في طبقة صورة جديدة فوق الصورة الحالية ويحفظ النتائج. سيتم استخدام الصورة التي تم إنشاؤها في الخطوات المتسلسلة في Dockerfile. لمزيد من المعلومات، يُرجى الاطّلاع على قسم RUN في المستندات المرجعية الخاصة بملف Dockerfile.
البنية: RUN <command>
في هذا الدرس التطبيقي، سنستخدم Maven لتجميع التطبيق في ملف JAR، لذا أضِف السطر التالي إلى أسفل ملف Dockerfile
RUN ./mvnw compile assembly:single
بدء التطبيق
تقدّم التعليمات CMD الأمر التلقائي لحاوية قيد التشغيل. لا يمكن أن يكون هناك سوى تعليمات CMD واحدة في Dockerfile، وإذا تم تحديد أكثر من CMD، سيتم تنفيذ آخر تعليمات CMD فقط. تتوفّر وظائف أكثر تقدّمًا باستخدام كلّ من تعليمات CMD وENTRYPOINT، ولكن لم يتم التطرّق إليها في هذا الدرس التطبيقي. لمزيد من المعلومات، يُرجى الاطّلاع على قسم CMD في المستندات المرجعية الخاصة بملف Dockerfile.
البنية: CMD ["executable","param1","param2"]
في هذا الدرس التطبيقي، سنشغّل ملف JAR الذي تم تجميعه، لذا أضِف السطر التالي إلى أسفل ملف Dockerfile
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
ملف Dockerfile النهائي
سيكون ملف Dockerfile النهائي كما يلي:
FROM openjdk:11.0-jdk
WORKDIR /app
COPY . /app
RUN ./mvnw compile assembly:single
CMD ["java","-jar","/app/target/sample-app-1.0.0-jar-with-dependencies.jar"]
تنفيذ Dockerfile محليًا
cd ${HOME}/sample-app
git add Dockerfile
git commit -m "Added Dockerfile"
4. إنشاء
سننشئ الآن الصورة من Dockerfile باستخدام الأمر docker build. يطلب هذا الأمر من برنامج Docker الخفي إنشاء الصورة باستخدام التعليمات الواردة في ملف Dockerfile. يمكنك الاطّلاع على المستندات المرجعية الخاصة بأداة إنشاء Docker للحصول على مزيد من المعلومات.
إنشاء الصورة
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker build --tag sample-app:${IMAGE_TAG} .
الناتج
Sending build context to Docker daemon 221.2kB Step 1/4 : FROM openjdk:11.0-jdk 11.0-jdk: Pulling from library/openjdk 0c6b8ff8c37e: Pull complete 412caad352a3: Pull complete e6d3e61f7a50: Pull complete 461bb1d8c517: Pull complete e442ee9d8dd9: Pull complete 542c9fe4a7ba: Pull complete 41de18d1833d: Pull complete Digest: sha256:d72b1b9e94e07278649d91c635e34737ae8f181c191b771bde6816f9bb4bd08a Status: Downloaded newer image for openjdk:11.0-jdk ---> 2924126f1829 Step 2/4 : WORKDIR /app ---> Running in ea037abb273d Removing intermediate container ea037abb273d ---> bd9b6d078082 Step 3/4 : COPY . /app ---> b9aec2b5de51 Step 4/4 : RUN ./mvnw compile jar:jar ---> Running in 3f5ff737b7fd [INFO] Scanning for projects... ... [INFO] Building jar: /app/target/sample-app-1.0.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 22.952 s [INFO] Finished at: 2022-02-23T18:09:08Z [INFO] ------------------------------------------------------------------------ Removing intermediate container 331443caebd3 ---> 152f65cc441e Step 5/5 : CMD ["java", "-jar", "/app/target/sample-app-1.0.0.jar"] ---> Running in 3d595a72231c Removing intermediate container 3d595a72231c ---> 0e40d7548cab Successfully built 0e40d7548cab Successfully tagged sample-app:aaa8895
5- تشغيل
بعد إنشاء صورة الحاوية بنجاح، يمكننا الآن تشغيل تطبيقنا والتأكّد من أنّه يعمل على النحو المتوقّع باستخدام الأمر docker run. سيؤدي هذا الأمر إلى تشغيل الحاوية في المقدّمة من موجّه الأوامر لاختبارها أو تصحيح أخطائها. يمكنك الاطّلاع على المستندات المرجعية الخاصة بأمر docker run للحصول على مزيد من المعلومات.
تشغيل حاوية باستخدام الصورة
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG}
الناتج
Listening at http://localhost:8080
معاينة التطبيق الذي يتم تشغيله في حاوية
- انقر على زر "معاينة الويب" في Cloud Shell
- انقر على "معاينة" على المنفذ 8080
- اضغط على CTRL + c في Cloud Shell لإيقاف الحاويات
تغيير سلوك الحاوية
يؤدي تنفيذ Docker Run إلى استخدام الإعدادات التلقائية في Dockerfile. يمكن إضافة تعليمات ومَعلمات إضافية لتعديل هذا السلوك.
تفعيل تسجيل TRACE
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-p 8080:8080 \
sample-app:${IMAGE_TAG} \
java -Dorg.slf4j.simpleLogger.defaultLogLevel=trace -jar /app/target/sample-app-1.0.0-jar-with-dependencies.jar
معاينة التطبيق الذي يتم تشغيله في حاوية
- انقر على زر "معاينة الويب" في Cloud Shell
- انقر على "معاينة" على المنفذ 8080
- انتقِل إلى علامة التبويب Cloud Shell واطّلِع على التسجيل الإضافي
- اضغط على CTRL + c في Cloud Shell لإيقاف الحاوية
تغيير المنفذ
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
docker run \
--rm \
-e PORT=8081 \
-p 8081:8081 \
sample-app:${IMAGE_TAG}
معاينة التطبيق الذي يتم تشغيله في حاوية
- انقر على زر "معاينة الويب" في Cloud Shell
- انقر على "تغيير المنفذ".
- أدخِل 8081
- انقر على "تغيير ومعاينة"
- اضغط على CTRL + c في Cloud Shell لإيقاف الحاوية
6. بث
بعد التأكّد من أنّ صورة الحاوية تعمل بشكلٍ سليم وأردنا إتاحة هذه الحاوية للتشغيل في بيئات أخرى و/أو من قِبل مستخدمين آخرين، علينا إرسال الصورة إلى مستودع مشترك. من المفترض أن يحدث ذلك كجزء من عملية إنشاء مبرمَجة، ولكن في بيئة الاختبار لدينا، تمّ إعداد مستودع بالفعل ويمكننا إرسال الصورة يدويًا.
إرسال عملية تثبيت Dockerfile إلى مستودع sample-app
cd ${HOME}/sample-app
export IMAGE_TAG=$(git rev-parse --short HEAD)
git push
تصنيف الصورة في Artifact Registry
docker tag sample-app:${IMAGE_TAG} \
us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
ضبط بيانات الاعتماد في Artifact Registry
gcloud auth configure-docker us-central1-docker.pkg.dev
عندما يُطلب منك ذلك، Do you want to continue (Y/n)? أجب y واضغط على Enter
إرسال الصورة إلى Artifact Registry
docker push us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/apps/sample-app:${IMAGE_TAG}
الناتج
The push refers to repository [us-central1-docker.pkg.dev/qwiklabs-gcp-04-b47ced695a3c/apps/sample-app] 453b97f86449: Pushed e86791aa0382: Pushed d404c7ee0850: Pushed fe4f44af763d: Pushed 7c072cee6a29: Pushed 1e5fdc3d671c: Pushed 613ab28cf833: Pushed bed676ceab7a: Pushed 6398d5cccd2c: Pushed 0b0f2f2f5279: Pushed aaa8895: digest: sha256:459de00f86f159cc63f98687f7c9563fd65a2eb9bcc71c23dda3351baf13607a size: 2424
7. تهانينا!
تهانينا، لقد أكملت درس البرمجة.
المواضيع التي تناولناها
- تم إنشاء ملف Dockerfile لتطبيق نموذجي
- إنشاء صورة
- تشغيل الصورة كحاوية على الجهاز
- تغيير سلوك الحاوية
- تم إرسال الصورة إلى Artifact Registry