تطوير الحاويات باستخدام ملفات Dockerfiles

1. نظرة عامة

‫Docker هي منصة مفتوحة لتطوير التطبيقات وشحنها وتشغيلها. باستخدام Docker، يمكنك فصل تطبيقاتك عن بنيتك الأساسية والتعامل مع بنيتك الأساسية كتطبيق مُدار. تساعدك Docker في إرسال الرموز البرمجية بشكل أسرع، وإجراء الاختبارات بشكل أسرع، ونشر التطبيقات بشكل أسرع، وتقصير المدة بين كتابة الرموز البرمجية وتشغيلها.

تتيح Docker ذلك من خلال الجمع بين ميزات إنشاء الحاويات في النواة وسير العمل والأدوات التي تساعدك في إدارة تطبيقاتك ونشرها.

يمكن استخدام حاويات Docker مباشرةً في Kubernetes، ما يتيح تشغيلها بسهولة في Kubernetes Engine. بعد تعلُّم أساسيات Docker، ستكتسب المهارات اللازمة لبدء تطوير تطبيقات Kubernetes والتطبيقات التي تعمل في حاويات.

أهداف الدورة التعليمية

في هذه الميزة الاختبارية، ستتعرّف على كيفية تنفيذ ما يلي:

  • إنشاء ملف Dockerfile لتطبيق نموذجي
  • إنشاء صورة
  • تشغيل الصورة كحاوية على الجهاز
  • تغيير سلوك الحاوية
  • إرسال الصورة إلى Artifact Registry

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

هذا مختبر للمستوى التمهيدي. يتم افتراض عدم توفّر خبرة سابقة في Docker والحاويات أو توفّر خبرة قليلة. يُنصح بالاطّلاع على Cloud Shell وواجهة سطر الأوامر، ولكن ليس ذلك شرطًا.

إعداد البيئة بوتيرة ذاتية

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة من الأحرف لا تستخدمها Google APIs، ويمكنك تعديلها في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud، كما أنّه غير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس الترميز، عليك الرجوع إلى رقم تعريف المشروع (ويتم تحديده عادةً على أنّه PROJECT_ID)، لذا إذا لم يعجبك، يمكنك إنشاء رقم آخر عشوائي، أو يمكنك تجربة رقمك الخاص ومعرفة ما إذا كان متاحًا. ثم يتم "تجميده" بعد إنشاء المشروع.
  • هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في 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