استرداد صورة Docker موجودة وتوزيعها محلياً

مكتمل

Docker هي تكنولوجيا تمكِّنك من توزيع التطبيقات والخدمات بسرعة وسهولة. يتم تشغيل تطبيق Docker باستخدام صورة Docker. صورة Docker هي بيئة يتم تحزيمها مسبقاً وتحتوي على التعليمات البرمجية للتطبيق والبيئة التي يتم فيها تنفيذ هذه التعليمات البرمجية.

في سيناريو الشركة الموضح سابقاً، تحتاج إلى التحقق من جدوى التحزيم وتشغيل تطبيق باستخدام Docker. وتقرر إنشاء وتوزيع صورة Docker التي تشغِّل تطبيق ويب اختباري.

في هذه الوحدة، ستتعرف على المفاهيم والعمليات الأساسية التي ينطوي عليها تشغيل تطبيق تتم تعبئته في حاوية وتخزينه في صورة Docker.

نظرة عامة على Docker

Docker هي أداة لتشغيل التطبيقات التي تتم تعبئتها في حاوية. يشتمل التطبيق الذي تتم تعبئته في حاوية على التطبيق ونظام الملفات الذي يشكل البيئة التي يعمل بها. على سبيل المثال، يمكن أن يتكون التطبيق الذي تتم تعبئته في حاوية من قاعدة بيانات ومعلومات أخرى مرتبطة بالبرامج والتكوين اللازمة لتشغيل التطبيق.

وعادة ما يحتوي التطبيق الذي يتم تعبئته في حاوية على بصمة أصغر بكثير من جهاز ظاهري تم تكوينه لتشغيل التطبيق نفسه. وسبب هذه البصمة الأصغر هو أنه يتعين على الجهاز الظاهري توفير نظام التشغيل بأكمله والبيئة الداعمة المرتبطة به. ولا تحتوي حاوية Docker على هذا الحمل لأن Docker تستخدم نواة نظام التشغيل للكمبيوتر المضيف لتشغيل الحاوية. وعادةً ما يكون تنزيل صورة Docker وبدء تشغيلها أسرع وأكثر كفاءة في استخدام المساحة من تنزيل وتشغيل جهاز ظاهري يوفر وظائف مشابهة.

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

هام

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

يمكنك تشغيل Docker على جهاز سطح المكتب أو الكمبيوتر المحمول في حالة التطوير والاختبار محلياً. بالنسبة لأنظمة الإنتاج، تتوفر Docker لبيئات الخادم، بما في ذلك العديد من متغيرات Linux و Microsoft Windows Server 2016. يدعم العديد من المورِّدين أداة Docker في السحابة أيضاً. على سبيل المثال، يمكنك تخزين صور Docker في Azure Container Registry وتشغيل الحاويات باستخدام Azure Container Instance.

في هذه الوحدة، ستستخدم Docker محليًا لإنشاء صورة وتشغيلها. بعد ذلك، ستقوم بتحميل الصورة إلى Azure Container Registry وتشغيلها في مثيل حاوية Azure. هذا الإصدار من Docker مناسب للتطوير والاختبار المحليين لصور Docker.

صور Docker في Linux وWindows

تم تطوير Docker في البداية لنظام Linux وتم توسيعه منذ ذلك الحين لدعم Windows. يمكن أن توجد صور Docker الفردية في Windows أو Linux، وليس في كليهما في آن واحد. يحدد نظام تشغيل الصورة نوع بيئة نظام التشغيل المستخدمة داخل الحاوية.

يمكن لمؤلفي صور Docker، الذين يرغبون في تقديم وظائف مماثلة في الصور الموجودة في Linux وWindows معاً، إنشاء تلك الصور بشكل منفصل. على سبيل المثال، تقدم Microsoft صور Windows وLinux Docker التي تحتوي على بيئة ASP.NET Core يمكنك استخدامها كأساس لتطبيقات ASP.NET Core المضمنة في حاويات.

يمكن لأجهزة كمبيوتر Linux المثبَّت بها Docker تشغيل حاويات Docker فقط. بينما يمكن لأجهزة كمبيوتر Windows المثبَّت بها Docker تشغيل كلا النوعين من الحاويات. يشغّل Windows ذلك باستخدام جهاز ظاهري لتشغيل نظام Linux ويستخدم نظام Linux الظاهري لتشغيل حاويات Linux.

في هذه الوحدة، ستقوم بإنشاء وتشغيل صورة مستندة إلى Linux.

سجلات Docker وDocker Hub

يتم تخزين صور Docker وتوفيرها في السجلات. والسجل هو خدمة ويب يمكن أن تتصل Docker بها لتنزيل وتحميل صور الحاويات. وأشهر سجل هو Docker Hub، وهو سجل عام. وينشر العديد من الأفراد والمؤسسات الصور في Docker Hub، ويمكنك تنزيل وتشغيل هذه الصور باستخدام Docker التي تعمل على جهاز كمبيوتر سطح المكتب، أو على خادم، أو في سحابة. يمكنك إنشاء حساب على Docker Hub وتحميل صورك عليه مجاناً.

ويتم تنظيم السجل كسلسلة من المستودعات. يحتوي كل مستودع على صور Docker متعددة تتشارك في اسم شائع والغرض والوظائف نفسها بصفة عامة. عادة ما تحتوي هذه الصور على إصدارات مختلفة، محددة بعلامة. تمكِّنك هذه الآلية من نشر إصدارات متعددة من الصور والاحتفاظ بها لأسباب تتعلق بالتوافق. عند تنزيل صورة وتشغيلها، يجب تحديد السجل والمستودع وعلامة الإصدار للصورة. والعلامات هي تسميات نصية، ويمكنك استخدام نظام ترقيم الإصدارات (v1.0 وv1.1 وv1.2 وv2.0 وهكذا).

لنفترض أنك تريد استخدام صورة Docker لـ ASP.NET Core Runtime. تتوفر هذه الصورة في إصدارين:

  • mcr.microsoft.com/dotnet/core/aspnet:2.2
  • mcr.microsoft.com/dotnet/core/aspnet:2.1

الآن، فلنفترض أنك تريد استخدام صور Docker لعينات ‎.NET Core هنا لدينا أربعة إصدارات متاحة للاختيار منها:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp

إشعار

يمكن أن يكون للصورة الواحدة علامات متعددة معينة لها. حسب الاصطلاح، يتم تعيين أحدث إصدار من الصورة لأحدث علامة بالإضافة إلى علامة تصف رقم إصدارها. عند طرح إصدار جديد من الصورة، يمكنك إعادة تعيين علامة latest للإشارة إلى الصورة الجديدة.

يمثل المستودع أيضاً وحدة خصوصية الصورة. فإذا كنت لا ترغب في مشاركة صورة، يمكنك جعل المستودع خاصاً. يمكنك منح حق الوصول لمستخدمين آخرين ترغب في مشاركة الصورة معهم.

استعراض Docker Hub وسحب صورة

إشعار

لا تحتاج إلى إكمال أي من الأمثلة أو تشغيل أي من التعليمات البرمجية في الأقسام التالية. وستقوم بذلك في الوحدة التالية.

غالبًا ما تجد صورة في Docker Hub تتطابق بشكل وثيق مع نوع التطبيق الذي تريد تعبئته في حاوية. يمكنك تنزيل هذه الصورة وتوسيعها باستخدام التعليمات البرمجية للتطبيق.

تحتوي Docker Hub على عدة آلاف من الصور. يمكنك البحث في سجل واستعراضه باستخدام Docker من سطر الأوامر أو موقع Docker Hub على الويب. يسمح لك موقع الويب بالبحث عن الصور وتصفيتها وتحديدها حسب النوع والناشر. يوضح الشكل أدناه مثالاً لصفحة البحث.

لقطة شاشة لصفحة بحث Docker Hub التي تسرد صور حاوية متنوعة.

يمكنك استخدام أمر docker pull مع اسم الصورة لاسترداد صورة. بشكل افتراضي، ستقوم Docker بتنزيل الصورة بالعلامة latest من ذلك المستودع على Docker Hub إذا حددت اسم المستودع فقط. واعلم أنه يمكنك تعديل الأمر لسحب علامات مختلفة، ومن مستودعات مختلفة. يساعد هذا المثال في إحضار الصورة بالعلامة aspnetapp من مستودع mcr.microsoft.com/dotnet/core/samples:aspnetapp. تحتوي هذه الصورة على تطبيق ASP.NET Core بسيط على الويب.

إشعار

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

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

عند إحضار صورة، تخزنها Docker محلياً وتوفرها لتشغيل الحاويات. يمكنك عرض الصور في السجل المحلي بأمر docker image list.

docker image list

تبدو المخرجات مثل المثال التالي:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

يمكنك استخدام معرف اسم الصورة للإشارة إلى الصورة في العديد من أوامر Docker الأخرى.

تشغيل حاوية Docker

استخدم أمر docker run لبدء تشغيل حاوية. حدد الصورة المطلوب تشغيلها باسمها أو معرفها. إذا لم تكن قد أجريت docker pull للصورة بالفعل، فستفعل Docker ذلك نيابةً عنك.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

في هذا المثال، يستجيب الأمر بالرسالة التالية:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

تحتوي هذه الصورة على تطبيق ويب، لذلك، فهي تستمع الآن للطلبات التي تصل إلى منفذ HTTP‏ 80. ومع ذلك، إذا فتحت مستعرض ويب وانتقلت إلى http://localhost:80، فلن ترى التطبيق.

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

بالإضافة إلى ذلك، لا يُقصد من تطبيق الويب في هذه الصورة استخدامه بشكل تفاعلي من سطر الأوامر. عندما نبدأ تشغيله، نريد من Docker بدء تشغيله في الخلفية ثم السماح بتشغيله. استخدم إشارة -d لإعطاء Docker تعليمات ببدء تشغيل تطبيق الويب في الخلفية.

اضغط على Ctrl+C لإيقاف الصورة ثم أعد تشغيلها كما هو موضح في المثال التالي:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

يعمل الأمر على تعيين المنفذ 80 في الحاوية إلى المنفذ 8080 بالكمبيوتر. إذا زرت الصفحة http://localhost:8080 في مستعرض، فسترى نموذج تطبيق الويب.

لقطة شاشة تعرض نموذج تطبيق الويب قيد التشغيل في مستعرض.

الحاويات والملفات

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

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

ومن أفضل الممارسات تجنب الحاجة إلى إجراء تغييرات على نظام ملفات الصور بالنسبة للتطبيقات التي تم نشرها باستخدام Docker. استخدمه فقط مع الملفات المؤقتة التي يمكن تحمُّل فقدانها.

إدارة حاويات Docker

يمكنك عرض الحاويات النشطة باستخدام أمر docker ps.

docker ps

يتضمن الإخراج حالة الحاوية - لأعلى إذا كانت قيد التشغيل، وإنهاء إذا تم إنهاؤها - من بين قيم أخرى مثل علامات سطر الأوامر المحددة عند بدء تشغيل الصورة ومعلومات إضافية. تتيح لك Docker تشغيل حاويات متعددة من الصورة نفسها في آن واحد، لذلك، يتم تعيين معرف فريد لكل حاوية بالإضافة إلى اسم فريد يمكن قراءته بالعين. يمكن لمعظم أوامر Docker المستخدمة لإدارة الحاويات الفردية استخدام المعرف أو الاسم للإشارة إلى حاوية محددة.

في المخرجات التالية، يمكنك رؤية حاويتين. يوضح الحقل PORTS أن الحاوية بالمعرف elegant_ramanujan هي الصورة قيد التشغيل مع المنفذ 80 على مضيف Docker الذي تم تعيينه إلى المنفذ 8080 على جهاز الكمبيوتر. ويكون مثيل youthful_heisenbergهو حاوية التشغيل السابق للصورة. يوضح الحقل COMMAND الأمر الذي تم تشغيله بواسطة الحاوية لبدء تشغيل التطبيق في الصورة. في هذه الحالة، بالنسبة لكلتا الحاويتين، يكون الأمر هو aspnetapp.dlldotnet. معرف الصورة للحاويتين متماثل أيضًا لأن كلتا الحاويتين تنفذان الصورة نفسها.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

إشعار

يكون docker ps اختصاراً لـ docker container ls. تستند أسماء هذه الأوامر إلى أداتي Linux المساعدتين ps وlsاللتين تسردان العمليات والملفات قيد التشغيل، على التوالي.

يمكنك إيقاف حاوية نشطة docker stop باستخدام الأمر ، وتحديد معرف الحاوية.

docker stop elegant_ramanujan

إذا قمت بتشغيل docker ps مرة أخرى، سترى أن حاوية elegant_ramanujan لم تعد موجودة في المخرجات. لا تزال الحاوية موجودة، ولكنها لم تعد تستضيف عملية قيد التشغيل. يمكنك تضمين الحاويات المتوقفة في مخرجات docker ps من خلال تضمين إشارة -a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

يمكنك إعادة تشغيل حاوية متوقفة باستخدام أمر docker start. بدأت العملية الرئيسية للحاوية من جديد.

docker start elegant_ramanujan

بمجرد إيقاف حاوية، يجب إزالتها أيضاً في المعتاد. يؤدي إزالة حاوية إلى تنظيف أي موارد تتركها وراءها. بمجرد إزالة حاوية، يتم فقدان أية تغييرات تم إجراؤها داخل نظام ملفات الصور نهائياً.

docker rm elegant_ramanujan

لا يمكنك إزالة حاوية قيد التشغيل، ولكن يمكنك فرض إيقاف حاوية وإزالتها باستخدام العلامة -f إلى docker rm الأمر . وهذه طريقة سريعة لإيقاف وإزالة حاوية، لكن يجب استخدامها فقط إذا كان التطبيق داخل الحاوية لا يحتاج إلى إجراء إيقاف تشغيل آمن.

docker container rm -f elegant_ramanujan

إزالة صور Docker

يمكنك إزالة صورة من الكمبيوتر المحلي باستخدام أمر docker image rm. حدد معرف الصورة التي تريد إزالتها. يساعد المثال التالي في إزالة الصورة الخاصة بنموذج تطبيق الويب.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

يجب إنهاء الحاويات التي تشغِّل الصورة قبل إزالتها. إذا كانت الصورة ما تزال قيد الاستخدام من حاوية، فستتلقى رسالة خطأ مثل الرسالة التالية. في هذا المثال، يحدث الخطأ لأن الحاوية youthful_hesienburg لا تزال تستخدم الصورة.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe