هذا مجرد عرض توضيحي بسيط للحصول على فهم أساسي لكيفية عمل Docker أثناء العمل خطوة بخطوة. لقد تعلمت عامل إرساء مثل هذا وأنشأت هذا الريبو لحل بعض المشكلات التي واجهتها أثناء تجربة التعلم الخاصة بي حتى تساعد المبتدئين الآخرين. آمل أن تستمتع بالتعلم. إذا كنت ترغب في ذلك، قم بإعطائها على GitHub ودعم عملي.
هام: - من خلال رؤية حجم الملف التمهيدي، قد يكون لديك أفكار أخرى، ولكن بصراحة، إذا كنت تعمل من البداية فلن تواجه أي مشكلة وستتعلم على طول الطريق.
تُعرّف ويكيبيديا Docker بأنه
عبارة عن مجموعة من منتجات النظام الأساسي كخدمة (PaaS) التي تستخدم المحاكاة الافتراضية على مستوى نظام التشغيل لتقديم البرامج في حزم تسمى الحاويات. يتم عزل الحاويات عن بعضها البعض وتجميع برامجها ومكتباتها وملفات التكوين الخاصة بها؛ يمكنهم التواصل مع بعضهم البعض من خلال قنوات محددة جيدًا. يتم تشغيل جميع الحاويات بواسطة نواة نظام تشغيل واحدة، وبالتالي تستخدم موارد أقل من الأجهزة الافتراضية.
يساعدك Docker في نشر تطبيقاتك بشكل أكثر كفاءة في وضع الحماية (يسمى الحاويات) للتشغيل على نظام التشغيل المضيف، أي Mac. الميزة الرئيسية لـ docker هي أنه يسمح لك بتجميع البرامج بكل تبعياتها في وحدة موحدة واحدة.
تعد الحاوية حلاً لكيفية تشغيل البرنامج دون أي مشاكل عند نقله من بيئة حوسبة إلى أخرى. يمكن أن يكون ذلك من بيئة التدريج إلى الإنتاج أو ربما من كمبيوتر محمول إلى كمبيوتر محمول مختلف مزود بنظام تشغيل آخر.
توفر الحاويات آلية تعبئة منطقية يمكن من خلالها استخلاص تطبيقاتك من البيئة التي تعمل فيها. والفرق الرئيسي هو أن كل حاوية لا تتطلب نظام التشغيل الكامل الخاص بها. جميع الحاويات الموجودة على مضيف واحد تشترك في نظام تشغيل واحد. يساعد هذا في تحرير كميات هائلة من موارد النظام مثل وحدة المعالجة المركزية وذاكرة الوصول العشوائي.
بمجرد الانتهاء من تثبيت Docker، اختبر تثبيت Docker الخاص بك عن طريق تشغيل ما يلي:
docker run hello-world
Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Dockerfile
هو مستند نصي يحتوي على جميع الأوامر التي يمكنك استدعاؤها في سطر الأوامر لإنشاء صورة. قم بإنشاء ملف hello.js
وانسخ هذا الرمز فيه. لقد كتبنا هنا رمز JS بسيطًا لإظهار Hello World على localhost:8888
. var http = require( " http " ) ;
http.createServer(function (request, response) {
response.writeHead(200, { ' Content-Type ' : ' text/plain ' }) ;
response.end( ' Hello Worldn ' ) ;
}).listen(8888) ;
// Console will print the message
console.log( ' Server running at http://127.0.0.1:8888/ ' ) ;
Dockerfile
وانسخ هذا الرمز فيه. FROM node:8
LABEL maintainer= " [email protected] "
RUN npm install
ADD hello.js /hello.js
EXPOSE 8888
ENTRYPOINT [ " node " , " hello.js " ]
حتى لو كان هذا هو ملف Dockerfile الأول الذي تراه على الإطلاق، أود أن أقول إنه يمكن أن يكون لديك تخمين جيد لما يحدث هنا. تعليمات Dockerfile هي FROM وENV وLABEL وRUN وADD وEXPOSE وENTRYPOINT؛ إنهم في العواصم ولكن هذه اتفاقية وليست شرطًا.
على مستوى عالٍ، يقدم ملف Dockerfile هذا تعليمات مثل البدء بصورة العقدة، وإضافة “[email protected]”
كمشرف، وتشغيل npm install
لتثبيت التبعيات، ونسخ الملف في رمز التطبيق، وتوثيق منفذ شبكة التطبيق، وقم بتعيين hello.js كالتطبيق الافتراضي للتشغيل.
سنقوم الآن بإنشاء صورة عامل إرساء في أجهزتنا المحلية. افتح جهازك الطرفي في مجلد المشروع الحالي وقم بتشغيله
docker build -t helloworld .
أنت هنا تطلب من Docker إنشاء صورة تسمى helloworld
استنادًا إلى محتويات الدليل الحالي (لاحظ النقطة (.) في نهاية أمر الإنشاء). سيبحث Docker عن ملف Dockerfile في الدليل وسينشئ الصورة بناءً على التعليمات الموجودة في الملف.
بعد إنشاء صورة عامل الإرساء، ستكون الخطوة التالية هي تشغيل الصورة ومعرفة ما إذا كانت تعمل أم لا:
docker run -p 8888:8888 helloworld
استخدم الأمر الذي قمنا بتشغيله للتو المنفذ 8888 للخادم داخل الحاوية وعرضه خارجيًا على المنفذ 8888. انتقل إلى عنوان URL باستخدام المنفذ 8888:
تهاني! لقد نجحت في إنشاء أول صورة لعامل الإرساء.
تشبه صور Docker قوالب الجهاز الظاهري وتُستخدم لبدء الحاويات. تحت الغطاء، تتكون من طبقة واحدة أو أكثر للقراءة فقط، والتي عند تجميعها معًا، تشكل الصورة العامة. يعتني Docker بتكديس هذه الطبقات وتمثيلها ككائن واحد موحد. ملاحظة: صور Docker غير قابلة للتغيير مما يعني أنه لا يمكن تغيير صور Docker على الإطلاق. بمجرد إنشاء واحدة، يمكنك حذفها، ولكن لا يمكنك تعديلها.
تحتوي صورة Docker على جميع الملفات التي قمت بتعبئتها، والتي تصبح نظام ملفات الحاوية - كما تحتوي أيضًا على الكثير من البيانات الوصفية حول الصورة نفسها. يتضمن ذلك تاريخًا موجزًا لكيفية بناء الصورة. يمكنك استخدام ذلك لرؤية كل طبقة من الصورة والأمر الذي أنشأ الطبقة. يمكنك التحقق من تاريخ صورة helloworld
باستخدام:
docker image history helloworld
IMAGE CREATED CREATED BY COMMENT
cb84eb33ca20 58 seconds ago /bin/sh -c # (nop) ENTRYPOINT ["node" "hello…
7d652a817a9f 58 seconds ago /bin/sh -c # (nop) EXPOSE 8888
334575e947c9 59 seconds ago /bin/sh -c # (nop) ADD file:b9606ef53b832e66e…
أوامر CREATED BY
هي تعليمات Dockerfile - هناك علاقة رأس برأس، لذلك يقوم كل سطر في Dockerfile بإنشاء طبقة صورة.
أولاً، تحتاج إلى تسجيل الدخول باستخدام حساب dockerhub الخاص بك عن طريق
docker login --username $dockerId
الآن بعد أن قمت بتسجيل الدخول، يمكنك إرسال الصور إلى حسابك أو إلى أي مؤسسة يمكنك الوصول إليها. إذا لم تكن عضوًا في أي منظمة، فيمكنك فقط دفع الصور إلى المستودعات الموجودة في حسابك.
قمنا ببناء صورة Docker تسمى helloworld
. لا يحتوي مرجع الصورة هذا على اسم حساب، لذا لا يمكننا دفعه إلى أي سجلات. لا نحتاج إلى إعادة بناء الصورة لإعطائها مرجعًا جديدًا، رغم ذلك، يمكن أن تحتوي الصور على عدة مراجع. ضع علامة على صورتك بهذا الشكل:
docker image tag helloworld $dockerId /helloworld:v1
لدينا الآن مرجع صورة مع معرف Docker الخاص بنا في اسم الحساب، وقمنا بتسجيل الدخول إلى Docker Hub حتى نكون مستعدين لمشاركة صورتنا! أمر docker image Push هو النظير لأمر pull، فهو يقوم بتحميل طبقات الصور المحلية إلى السجل:
docker image push championshuttler/helloworld:v1
The push refers to a repository [docker.io/championshuttler/helloworld]
9519a21ac374: Pushed
يمكننا وضع أي سلسلة في علامة صورة Docker، وكما رأينا بالفعل، يمكنك الحصول على علامات متعددة لنفس الصورة. سنستخدم ذلك لإصدار البرنامج في صورنا والسماح للمستخدمين باتخاذ اختيارات مستنيرة لما لن يستخدموه - ولتحديد خياراتنا المدروسة عندما نستخدم صور أشخاص آخرين.
تستخدم العديد من مشاريع البرامج نظام إصدار رقمي بنقاط عشرية للإشارة إلى مدى التغيير بين الإصدارات، ويمكنك متابعة ذلك باستخدام علامات الصور الخاصة بك. الفكرة الأساسية هي شيء مثل [الرئيسية].[الثانوية].[التصحيح]، والتي لديها بعض الضمانات الضمنية. قد يحتوي الإصدار الذي يزيد رقم التصحيح فقط على إصلاحات للأخطاء ولكن يجب أن يحتوي على نفس ميزات الإصدار الأخير؛ قد يضيف الإصدار الذي يزيد من الإصدار الثانوي ميزات ولكن لا ينبغي أن يزيل أيًا منها؛ يمكن أن يحتوي الإصدار الرئيسي على ميزات مختلفة تمامًا.
لا تعمل معظم التطبيقات في مكون واحد. حتى التطبيقات القديمة الكبيرة يتم تصميمها عادةً كمكونات أمامية وخلفية، وهي عبارة عن طبقات منطقية منفصلة تعمل في مكونات موزعة فعليًا. يعد Docker مناسبًا بشكل مثالي لتشغيل التطبيقات الموزعة - بدءًا من الوحدات المتراصة ذات الطبقة n وحتى الخدمات الصغيرة الحديثة. يعمل كل مكون في حاويته خفيفة الوزن، ويقوم Docker بتوصيلها معًا باستخدام بروتوكولات الشبكة القياسية. يمكنك تحديد وإدارة التطبيقات متعددة الحاويات مثل هذه باستخدام Docker Compose. Docker Compose هي أداة لتحديد وتشغيل تطبيقات Docker متعددة الحاويات. باستخدام Compose، يمكنك استخدام ملف YAML
لتكوين خدمات التطبيق الخاص بك. وبعد ذلك، باستخدام أمر واحد، نقوم بإنشاء جميع الخدمات وبدء تشغيلها من التكوين الخاص بك.
يصف ملف Docker Compose الحالة المطلوبة لتطبيقك - الشكل الذي يجب أن يبدو عليه عند تشغيل كل شيء. إنه تنسيق ملف بسيط حيث يمكنك التقاط جميع الخيارات التي قد تضعها في أوامر تشغيل حاوية الإرساء الخاصة بك في ملف الإنشاء. ثم تستخدم أداة Docker Compose لتشغيل التطبيق. فهو يحدد موارد Docker التي يحتاجها - والتي يمكن أن تكون حاويات أو شبكات أو وحدات تخزين - ويرسل الطلبات إلى Docker API لإنشائها. الاسم الافتراضي لملف Compose YAML هو docker-compose.yml
. ومع ذلك، يمكننا استخدام العلامة -f لتحديد أسماء الملفات المخصصة.
دعونا نبدأ.
يظهر أسفل الكود ملف Docker Compose
بسيط جدًا يحدد تطبيق Flask صغيرًا مع خدمتين (web-frontend وredis). التطبيق عبارة عن خادم ويب بسيط يحسب عدد الزيارات ويخزن القيمة في Redis.
version: " 3.5 "
services:
web-frontend:
build: .
command: python app.py
ports:
- target: 8888
published: 8888
networks:
- counter-net
volumes:
- type: volume
source: counter-vol
target: /code
redis:
image: " redis:alpine "
networks:
counter-net:
networks:
counter-net:
volumes:
counter-vol:
مفتاح version
ضروري، ويجب أن يكون دائمًا السطر الأول من الملف. يوضح هذا إصدار تنسيق Compose file
(واجهة برمجة التطبيقات (API) بشكل أساسي).
مفتاح services
ذات المستوى الأعلى هو المكان الذي نحدد فيه خدمات التطبيقات المختلفة. المثال الذي نستخدمه يحدد خدمتين؛ واجهة أمامية للويب تسمى web-frontend
، وقاعدة بيانات في الذاكرة تسمى Redis. سيقوم Compose بنشر كل من هذه الخدمات كحاوية خاصة به.
يخبر مفتاح networks
ذات المستوى الأعلى Docker بإنشاء شبكات جديدة. افتراضيًا، سيقوم Compose بإنشاء شبكات جسرية. هذه شبكات ذات مضيف واحد يمكنها فقط توصيل الحاويات الموجودة على نفس المضيف.
ضمن تعريف خدمة واجهة الويب، نعطي Docker التعليمات التالية:
سنقوم بنشر التطبيق المحدد في ملف الإنشاء من القسم السابق. للقيام بذلك، ستحتاج إلى الملفات الأربعة التالية من https://github.com/championshuttler/counter-app:
استنساخ Git repo محليًا.
git clone https://github.com/championshuttler/counter-app.git
دعونا نصف بسرعة كل ملف:
app.py
هو رمز التطبيق (تطبيق Python Flask).docker-compose.yml
هو ملف Docker Compose الذي يصف كيفية قيام Docker بنشر التطبيق.Dockerfile
كيفية إنشاء الصورة لخدمة الواجهة الأمامية للويب.requirements.txt
حزم Python المطلوبة للتطبيق. دعونا نستخدم Compose لإظهار التطبيق. يجب عليك تشغيل جميع هذه الأوامر التالية من داخل دليل counter-app
:
docker-compose up &
سيستغرق ظهور التطبيق بضع ثوانٍ، ويمكن أن يكون الإخراج مطولًا تمامًا.
بعد نشر التطبيق بنجاح، يمكنك توجيه متصفح الويب إلى مضيف Docker الخاص بك على port 5000
ورؤية التطبيق بكل مجده.
هل وجدت أن البرنامج التعليمي عبارة عن فوضى كاملة أم أنك استمتعت وتعلمت شيئًا ما؟ أرسل أفكارك إلي مباشرة أو قم فقط بإنشاء مشكلة. ابحث عني على تويتر أيضًا، فلا تتردد في طرح أي شكوك لديك.
أحب أن أسمع عن تجربتك مع هذا البرنامج التعليمي. آمل أن تستمتع بالتعلم. إذا أعجبك من فضلك قم بإعطائه على GitHub ودعم عملي.