الشروع في العمل مع Docker: تبسيط DevOps
نشرت: 2022-03-11إذا كنت تحب الحيتان ، أو كنت مهتمًا ببساطة بالتوصيل السريع وغير المؤلم لبرنامجك إلى الإنتاج ، فأنا أدعوك لقراءة هذا البرنامج التعليمي التمهيدي Docker. يبدو أن كل شيء يشير إلى أن حاويات البرامج هي مستقبل تكنولوجيا المعلومات ، لذلك دعونا نذهب للغطس السريع مع الحيتان الحاوية Moby Dock و Molly.
Docker ، الذي يمثله شعار بحوت ودود المظهر ، هو مشروع مفتوح المصدر يسهل نشر التطبيقات داخل حاويات البرامج. يتم تمكين وظائفها الأساسية من خلال ميزات عزل الموارد في Linux kernel ، ولكنها توفر واجهة برمجة تطبيقات سهلة الاستخدام فوقها. تم إصدار الإصدار الأول في عام 2013 ، ومنذ ذلك الحين أصبح شائعًا للغاية ويستخدم على نطاق واسع من قبل العديد من اللاعبين الكبار مثل eBay و Spotify و Baidu والمزيد. في جولة التمويل الأخيرة ، حصلت Docker على 95 مليون دولار ، وهي في طريقها لتصبح عنصرًا أساسيًا في خدمات DevOps.
قياس نقل البضائع
يمكن توضيح الفلسفة الكامنة وراء Docker من خلال تشبيه بسيط. في صناعة النقل الدولي ، يجب نقل البضائع بوسائل مختلفة مثل الرافعات الشوكية والشاحنات والقطارات والرافعات والسفن. تأتي هذه البضائع بأشكال وأحجام مختلفة ولها متطلبات تخزين مختلفة: أكياس السكر وعلب الحليب والنباتات وما إلى ذلك. تاريخيًا ، كانت عملية مؤلمة اعتمادًا على التدخل اليدوي في كل نقطة عبور للتحميل والتفريغ.
كل شيء تغير مع امتصاص الحاويات متعددة الوسائط. نظرًا لأنها تأتي بأحجام قياسية ويتم تصنيعها مع وضع النقل في الاعتبار ، يمكن تصميم جميع الآليات ذات الصلة للتعامل معها بأقل قدر من التدخل البشري. تتمثل الفائدة الإضافية للحاويات محكمة الغلق في قدرتها على الحفاظ على البيئة الداخلية مثل درجة الحرارة والرطوبة للبضائع الحساسة. نتيجة لذلك ، يمكن أن تتوقف صناعة النقل عن القلق بشأن البضائع نفسها والتركيز على نقلها من أ إلى ب.
وهنا يأتي دور Docker ويجلب فوائد مماثلة لصناعة البرمجيات.
كيف تختلف عن الأجهزة الافتراضية؟
بنظرة سريعة ، قد تبدو الأجهزة الافتراضية وحاويات Docker متشابهة. ومع ذلك ، ستظهر اختلافاتهم الرئيسية عند إلقاء نظرة على الرسم التخطيطي التالي:
تتطلب التطبيقات التي تعمل في الأجهزة الافتراضية ، بصرف النظر عن برنامج Hypervisor ، نسخة كاملة من نظام التشغيل وأي مكتبات داعمة. من ناحية أخرى ، تشارك الحاويات نظام التشغيل مع المضيف. Hypervisor قابل للمقارنة مع محرك الحاوية (يتم تمثيله كـ Docker على الصورة) بمعنى أنه يدير دورة حياة الحاويات. يتمثل الاختلاف المهم في أن العمليات التي تعمل داخل الحاويات تشبه تمامًا العمليات الأصلية على المضيف ، ولا تقدم أي نفقات عامة مرتبطة بتنفيذ برنامج Hypervisor. بالإضافة إلى ذلك ، يمكن للتطبيقات إعادة استخدام المكتبات ومشاركة البيانات بين الحاويات.
نظرًا لأن كلا التقنيتين لهما نقاط قوة مختلفة ، فمن الشائع العثور على أنظمة تجمع بين الأجهزة والحاويات الافتراضية. وخير مثال على ذلك أداة تسمى Boot2Docker موصوفة في قسم تثبيت Docker.
العمارة عامل الميناء
توجد سجلات في الجزء العلوي من الرسم التخطيطي للهندسة المعمارية. بشكل افتراضي ، السجل الرئيسي هو Docker Hub الذي يستضيف الصور العامة والرسمية. يمكن للمنظمات أيضًا استضافة سجلاتها الخاصة إذا رغبت في ذلك.
على الجانب الأيمن لدينا صور وحاويات. يمكن تنزيل الصور من السجلات بشكل صريح ( docker pull imageName
) أو ضمنيًا عند بدء تشغيل حاوية. بمجرد تنزيل الصورة ، يتم تخزينها مؤقتًا محليًا.
الحاويات هي أمثلة للصور - إنها الكائنات الحية. يمكن أن يكون هناك عدة حاويات تعمل بناءً على نفس الصورة.
في المركز ، يوجد Docker daemon المسؤول عن إنشاء الحاويات وتشغيلها ومراقبتها. كما أنها تهتم ببناء الصور وتخزينها. أخيرًا ، يوجد على الجانب الأيسر عميل Docker. يتحدث إلى البرنامج الخفي عبر HTTP. تُستخدم مآخذ Unix عندما تكون على نفس الجهاز ، ولكن الإدارة عن بُعد ممكنة عبر واجهة برمجة التطبيقات المعتمدة على HTTP.
تثبيت Docker
للحصول على أحدث التعليمات ، يجب عليك دائمًا الرجوع إلى الوثائق الرسمية.
يعمل Docker في الأصل على Linux ، لذلك اعتمادًا على التوزيع المستهدف ، قد يكون الأمر سهلاً مثل sudo apt-get install docker.io
. الرجوع إلى الوثائق للحصول على التفاصيل. عادةً في Linux ، تقوم بربط أوامر Docker مسبقًا بـ sudo
، لكننا سنتخطى الأمر في هذه المقالة للتوضيح.
نظرًا لأن Docker daemon يستخدم ميزات kernel الخاصة بـ Linux ، فلا يمكن تشغيل Docker محليًا في Mac OS أو Windows. بدلاً من ذلك ، يجب عليك تثبيت تطبيق يسمى Boot2Docker. يتكون التطبيق من VirtualBox Virtual Machine و Docker نفسه وأدوات إدارة Boot2Docker. يمكنك اتباع إرشادات التثبيت الرسمية لنظامي التشغيل MacOS و Windows لتثبيت Docker على هذه الأنظمة الأساسية.
باستخدام Docker
لنبدأ هذا القسم بمثال سريع:
docker run phusion/baseimage echo "Hello Moby Dock. Hello Molly."
يجب أن نرى هذا الناتج:
Hello Moby Dock. Hello Molly.
ومع ذلك ، فقد حدث الكثير خلف الكواليس أكثر مما قد تعتقد:
- تم تنزيل الصورة "phusion / baseimage" من Docker Hub (إذا لم تكن موجودة بالفعل في ذاكرة التخزين المؤقت المحلية)
- بدأت حاوية على أساس هذه الصورة
- تم تنفيذ الأمر صدى داخل الحاوية
- تم إيقاف الحاوية عند خروج الأمر
عند التشغيل لأول مرة ، قد تلاحظ تأخيرًا قبل طباعة النص على الشاشة. إذا تم تخزين الصورة مؤقتًا محليًا ، فسيستغرق كل شيء جزءًا من الثانية. يمكن استرداد تفاصيل الحاوية الأخيرة عن طريق تشغيل docker ps -l
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES af14bec37930 phusion/baseimage:latest "echo 'Hello Moby Do 2 minutes ago Exited (0) 3 seconds ago stoic_bardeen
أخذ الغوص التالي
كما يمكنك أن تقول ، فإن تشغيل أمر بسيط داخل Docker سهل مثل تشغيله مباشرة على محطة قياسية. لتوضيح حالة استخدام أكثر عملية ، خلال الجزء المتبقي من هذه المقالة ، سنرى كيف يمكننا استخدام Docker لنشر تطبيق خادم ويب بسيط. لتبسيط الأمور ، سنكتب برنامج Java يتعامل مع طلبات HTTP GET إلى "/ ping" ويستجيب بالسلسلة "pong \ n".
import java.io.IOException; import java.io.OutputStream; import java.net.InetSocketAddress; import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; public class PingPong { public static void main(String[] args) throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0); server.createContext("/ping", new MyHandler()); server.setExecutor(null); server.start(); } static class MyHandler implements HttpHandler { @Override public void handle(HttpExchange t) throws IOException { String response = "pong\n"; t.sendResponseHeaders(200, response.length()); OutputStream os = t.getResponseBody(); os.write(response.getBytes()); os.close(); } } }
ملف Dockerfile
قبل القفز إلى صورة Docker الخاصة بك وبناءها ، من الجيد التحقق أولاً مما إذا كانت هناك صورة موجودة في Docker Hub أو أي سجلات خاصة يمكنك الوصول إليها. على سبيل المثال ، بدلاً من تثبيت Java بأنفسنا ، سنستخدم صورة رسمية: java:8
.
لبناء صورة ، نحتاج أولاً إلى تحديد الصورة الأساسية التي سنستخدمها. يتم الإشارة إليه من خلال التعليمات. هنا ، إنها صورة رسمية لـ Java 8 من Docker Hub. سنقوم بنسخه في ملف Java الخاص بنا عن طريق إصدار تعليمات COPY . بعد ذلك ، سنقوم بتجميعها باستخدام RUN . تشير تعليمات EXPOSE إلى أن الصورة ستوفر خدمة على منفذ معين. ENTRYPOINT هي تعليمات نريد تنفيذها عند بدء تشغيل حاوية تستند إلى هذه الصورة ويشير CMD إلى المعلمات الافتراضية التي سنمررها إليها.

FROM java:8 COPY PingPong.java / RUN javac PingPong.java EXPOSE 8080 ENTRYPOINT ["java"] CMD ["PingPong"]
بعد حفظ هذه التعليمات في ملف يسمى "Dockerfile" ، يمكننا بناء صورة Docker المقابلة عن طريق تنفيذ:
docker build -t toptal/pingpong .
يحتوي التوثيق الرسمي لـ Docker على قسم مخصص لأفضل الممارسات المتعلقة بكتابة Dockerfile.
تشغيل الحاويات
عندما يتم إنشاء الصورة ، يمكننا إعادتها إلى الحياة كحاوية. هناك عدة طرق يمكننا من خلالها تشغيل الحاويات ، ولكن لنبدأ بطريقة بسيطة:
docker run -d -p 8080:8080 toptal/pingpong
حيث -p [port-on-the-host]: يشير [port-in-the-container] إلى تعيين المنافذ على المضيف والحاوية على التوالي. علاوة على ذلك ، فإننا نطلب من Docker تشغيل الحاوية كعملية خفية في الخلفية بتحديد -d . يمكنك اختبار ما إذا كان تطبيق خادم الويب قيد التشغيل بمحاولة الوصول إلى "http: // localhost: 8080 / ping". لاحظ أنه في الأنظمة الأساسية التي يتم فيها استخدام Boot2docker ، ستحتاج إلى استبدال "localhost" بعنوان IP الخاص بالجهاز الظاهري حيث يتم تشغيل Docker.
على نظام Linux:
curl http://localhost:8080/ping
على الأنظمة الأساسية التي تتطلب Boot2Docker:
curl $(boot2docker ip):8080/ping
إذا سارت الأمور على ما يرام ، يجب أن ترى الرد:
pong
حسنًا ، أول حاوية Docker مخصصة لدينا على قيد الحياة وتسبح! يمكننا أيضًا بدء تشغيل الحاوية في الوضع التفاعلي -i -t . في حالتنا ، سوف نتجاوز أمر نقطة الدخول حتى يتم تقديم bash Terminal لنا. يمكننا الآن تنفيذ أي أوامر نريد ، لكن الخروج من الحاوية سيوقفها:
docker run -i -t --entrypoint="bash" toptal/pingpong
هناك العديد من الخيارات المتاحة لاستخدامها في بدء تشغيل الحاويات. دعونا نغطي أكثر من ذلك بقليل. على سبيل المثال ، إذا أردنا الاحتفاظ بالبيانات خارج الحاوية ، فيمكننا مشاركة نظام ملفات المضيف مع الحاوية باستخدام -v . بشكل افتراضي ، يكون وضع الوصول للقراءة والكتابة ، ولكن يمكن تغييره إلى وضع القراءة فقط عن طريق إلحاق :ro
بمسار وحدة التخزين داخل الحاوية. تعتبر وحدات التخزين مهمة بشكل خاص عندما نحتاج إلى استخدام أي معلومات أمنية مثل بيانات الاعتماد والمفاتيح الخاصة داخل الحاويات ، والتي لا ينبغي تخزينها على الصورة. بالإضافة إلى ذلك ، يمكن أن يمنع أيضًا تكرار البيانات ، على سبيل المثال عن طريق تعيين مستودع Maven المحلي الخاص بك إلى الحاوية لحمايتك من تنزيل الإنترنت مرتين.
لدى Docker أيضًا القدرة على ربط الحاويات معًا. يمكن للحاويات المرتبطة التحدث مع بعضها البعض حتى لو لم يتم كشف أي من المنافذ. يمكن تحقيق ذلك مع - ربط اسم حاوية أخرى . فيما يلي مثال يجمع بين المعلمات المذكورة أعلاه:
docker run -p 9999:8080 --link otherContainerA --link otherContainerB -v /Users/$USER/.m2/repository:/home/user/.m2/repository toptal/pingpong
عمليات أخرى للحاويات والصور
ليس من المستغرب أن قائمة العمليات التي يمكن للمرء أن يطبقها على الحاويات والصور طويلة نوعًا ما. للإيجاز ، دعونا نلقي نظرة على القليل منها:
- توقف - توقف الحاوية قيد التشغيل.
- بدء - يبدأ حاوية متوقفة.
- الالتزام - ينشئ صورة جديدة من تغييرات الحاوية.
- rm - يزيل حاوية واحدة أو أكثر.
- rmi - يزيل صورة واحدة أو أكثر.
- ps - قوائم الحاويات.
- الصور - قوائم الصور.
- exec - يقوم بتشغيل أمر في حاوية قيد التشغيل.
قد يكون الأمر الأخير مفيدًا بشكل خاص لأغراض تصحيح الأخطاء ، حيث يتيح لك الاتصال بمحطة طرفية لحاوية قيد التشغيل:
docker exec -i -t <container-id> bash
Docker يؤلف لعالم الخدمات المصغرة
إذا كان لديك أكثر من مجرد حاويتين مترابطتين ، فمن المنطقي استخدام أداة مثل docker-compose. في ملف التكوين ، تصف كيفية بدء تشغيل الحاويات وكيف يجب ربطها ببعضها البعض. بصرف النظر عن كمية الحاويات المعنية وتبعياتها ، يمكنك تشغيلها جميعًا بأمر واحد: docker-compose up
.
عامل ميناء في البرية
دعونا نلقي نظرة على ثلاث مراحل من دورة حياة المشروع ونرى كيف يمكن أن يساعد حوتنا الودود.
التطور
يساعدك Docker في الحفاظ على بيئة التطوير المحلية نظيفة. بدلاً من تثبيت إصدارات متعددة من الخدمات المختلفة مثل Java و Kafka و Spark و Cassandra وما إلى ذلك ، يمكنك فقط بدء تشغيل الحاوية المطلوبة وإيقافها عند الضرورة. يمكنك أخذ الأمور خطوة إلى الأمام وتشغيل العديد من حزم البرامج جنبًا إلى جنب لتجنب اختلاط إصدارات التبعية.
باستخدام Docker ، يمكنك توفير الوقت والجهد والمال. إذا كان إعداد مشروعك معقدًا للغاية ، فقم "بتثبيته". انتقل إلى معاناة إنشاء صورة Docker مرة واحدة ، ومن هذه النقطة يمكن للجميع بدء حاوية في لمح البصر.
يمكنك أيضًا تشغيل "بيئة تكامل" محليًا (أو على CI) واستبدالها بخدمات حقيقية تعمل في حاويات Docker.
الاختبار / التكامل المستمر
باستخدام Dockerfile ، من السهل تحقيق إنشاءات قابلة للتكرار. يمكن تكوين Jenkins أو حلول CI الأخرى لإنشاء صورة Docker لكل بناء. يمكنك تخزين بعض الصور أو كلها في سجل Docker خاص للرجوع إليها في المستقبل.
باستخدام Docker ، يمكنك فقط اختبار ما يجب اختباره وإخراج البيئة من المعادلة. يمكن أن يساعد إجراء الاختبارات على حاوية جارية في جعل الأمور أكثر قابلية للتنبؤ.
ميزة أخرى مثيرة للاهتمام لامتلاك حاويات البرامج هي أنه من السهل إخراج آلات الرقيق مع إعداد التطوير المماثل. يمكن أن يكون مفيدًا بشكل خاص لاختبار الحمل لعمليات النشر العنقودية.
إنتاج
يمكن أن يكون Docker واجهة مشتركة بين المطورين وموظفي العمليات للقضاء على مصدر الاحتكاك. كما يشجع على استخدام نفس الصورة / الثنائيات في كل خطوة من خط الأنابيب. علاوة على ذلك ، تساعد القدرة على نشر حاوية تم اختبارها بالكامل دون وجود اختلافات في البيئة على ضمان عدم حدوث أخطاء في عملية الإنشاء.
يمكنك بسهولة ترحيل التطبيقات إلى الإنتاج. يمكن أن يكون الشيء الذي كان في يوم من الأيام عملية مملة وغير مستقر الآن بسيطًا مثل:
docker stop container-id; docker run new-image
وإذا حدث خطأ ما عند نشر إصدار جديد ، فيمكنك دائمًا التراجع سريعًا أو التغيير إلى حاوية أخرى:
docker stop container-id; docker start other-container-id
... يضمن عدم ترك أي فوضى أو ترك الأشياء في حالة غير متسقة.
ملخص
تم تضمين ملخص جيد لما يفعله Docker في شعاره الخاص: Build، Ship، Run.
- يتيح لك Build - Docker إنشاء تطبيقك من الخدمات المصغرة ، دون القلق بشأن التناقضات بين بيئات التطوير والإنتاج ، ودون التقيد بأي نظام أساسي أو لغة.
- يتيح لك Ship - Docker تصميم الدورة الكاملة لتطوير التطبيقات واختبارها وتوزيعها وإدارتها بواجهة مستخدم متسقة.
- يوفر لك Run - Docker القدرة على نشر خدمات قابلة للتطوير بشكل آمن وموثوق على مجموعة متنوعة من الأنظمة الأساسية.
استمتع بالسباحة مع الحيتان!
جزء من هذا العمل مستوحى من كتاب ممتاز بعنوان "استخدام Docker" للكاتب أدريان موات.