كم مرة كان عليك تكوين بيئات الخادم لنشر تطبيقك (على سبيل المثال ، موقع ويب)؟ بالتأكيد أكثر مما أرغب.
في أفضل الأحوال ، كان لديك برنامج نصي قام بكل هذا تلقائيًا. في أسوأ الحالات ، يمكن أن يبدو مثل هذا:
- تثبيت قاعدة البيانات D الإصدار xxx
- تثبيت خادم الويب N الإصدار xx ، إلخ.
الإدارة البيئية المكونة بهذه الطريقة تصبح كثيفة الاستخدام للموارد مع مرور الوقت. أي ، حتى التغيير الطفيف في التكوين يعني على الأقل:
- أن كل مطور يجب أن يكون على علم بهذه التغييرات
- يجب إضافة كل هذه التغييرات بأمان إلى بيئة الإنتاج
من الصعب تتبع هذه التغييرات وإدارتها بدون أدوات خاصة. على أي حال ، هناك مشاكل في تكوين تبعيات البيئة. كلما زاد التطور ، زادت صعوبة العثور على هذه المشكلات وحلها.
أعلاه ، وصفت ما يسمى البائع قفل في. لتطوير التطبيقات ، ولا سيما من نوع الخادم ، تصبح هذه الظاهرة مشكلة كبيرة. في هذه المقالة ، سننظر في أحد الحلول الممكنة -
Docker . سوف تتعلم كيفية إنشاء تطبيق وتشغيله بناءً عليه.
/ إخلاء المسئولية: / هذا ليس مراجعة لـ Docker. في نهاية هذه المقالة توجد قائمة من الأدبيات المفيدة التي تصف العمل مع Docker بشكل أفضل. هذه هي نقطة الإدخال الأولى للمطورين الذين يخططون لنشر تطبيقات node.js باستخدام حاويات Docker.
أثناء تطوير
أحد مشاريعي ، واجهت نقصًا في المقالات المفصلة ، مما أدى إلى عدد كبير من الدراجات. هذا المنشور متأخرة بعض الشيء في محاولة لإصلاح نقص المعلومات حول الموضوع.
ما هو وماذا يأكل مع؟
بعبارة بسيطة ، يمثل Docker مجموعة من حاويات LXC. هذا يعني أن العمليات التي تم إطلاقها باستخدام Docker ستشاهد فقط هم وذريتهم. وتسمى هذه العمليات حاويات دوكر.
من أجل التمكن من إنشاء نوع من التجريد على أساس هذه الحاويات ، توجد صورة في Docker (/ / docker image /). بناءً على صورة Docker ، يمكنك تكوين وإنشاء حاويات.
هناك الآلاف من صور Docker الجاهزة مع قواعد بيانات مثبتة مسبقًا وخوادم الويب وعناصر مهمة أخرى. ميزة أخرى لـ Docker هي أنها أداة اقتصادية للغاية لاستهلاك الذاكرة ، لأنها تستخدم الموارد التي تحتاجها فقط.
اقترب
لن نتناول
التثبيت لفترة طويلة. تم تبسيط العملية خلال الإصدارات القليلة الماضية لعدد قليل من النقرات / الفرق.
في هذه المقالة ، سنقوم بتحليل نشر تطبيق Docker باستخدام مثال تطبيق Node.js من جانب الخادم. هنا هو ، شفرة المصدر البدائية:
// index const http = require('http'); const server = http.createServer(function(req, res) { res.write('hello world from Docker'); res.end(); }); server.listen(3000, function() { console.log('server in docker container is started on port : 3000'); });
لدينا طريقتان على الأقل لحزم تطبيق في حاوية Docker:
- إنشاء وتشغيل حاوية من صورة موجودة باستخدام أداة واجهة سطر الأوامر ؛
- قم بإنشاء صورتك الخاصة بناءً على العينة النهائية.
الطريقة الثانية تستخدم في كثير من الأحيان.
للبدء ، قم بتنزيل الصورة الرسمية node.js:
docker pull node
يقوم الأمر docker pull بتنزيل صورة Docker. بعد ذلك ، يمكنك تشغيل الأمر تشغيل عامل ميناء. سيؤدي ذلك إلى إنشاء وتشغيل الحاوية استنادًا إلى الصورة التي تم تنزيلها.
docker run -it -d --rm -v "$PWD":/app -w=/app -p 80:3000 node node index.js
سيقوم هذا الأمر بتشغيل ملف index.js ، وتعيين 3000 منفذ إلى 80 وعرض معرف الحاوية التي تم إنشاؤها. بالفعل أفضل! ولكن في CLI واحد ، لن تذهب بعيدًا. دعونا إنشاء Dockerfile لخادمنا.
FROM node WORKDIR /app RUN cp . /app CMD ["node", "index.js"]
يصف Dockerfile هذه الصورة التي يتم من خلالها توريث الإصدار الحالي ، وكذلك الدليل الذي ستبدأ به أوامر الحاوية وأمر copy file من الدليل الذي يتم فيه بدء تجميع الصورة. يشير السطر الأخير إلى الأمر الذي سيتم تشغيله في الحاوية التي تم إنشاؤها.
بعد ذلك ، نحتاج إلى بناء صورة من ملف Dockerfile هذا الذي سننشره: docker
build -t username / helloworld-with-doer: 0.1.0 . ينشئ هذا الأمر صورة جديدة ويضع علامة عليها باستخدام
اسم المستخدم / helloworld-with-doer ويقوم بإنشاء علامة 0.1.0.
حاوية لدينا جاهزة. يمكننا تشغيله باستخدام الأمر docker run. وبالتالي ، فإننا نحل مشكلة قفل البائع. لم يعد إطلاق التطبيق يعتمد على البيئة. يتم تسليم رمز جنبا إلى جنب مع صورة عامل الميناء. يتيح لنا هذان المعياران نشر التطبيق في أي مكان يمكننا تشغيل Docker به.
نشر
99 ٪ الأولى ليست فظيعة مثل 99 ٪ المتبقية.
بعد الانتهاء من جميع التعليمات المذكورة أعلاه ، تصبح عملية النشر نفسها مسألة تقنية وبيئة التطوير الخاصة بك. سننظر في خيارين لنشر Docker:
- النشر اليدوي لصورة عامل الميناء ؛
- نشر باستخدام Travis-CI.
في كل حالة ، سننظر في توصيل الصورة إلى بيئة مستقلة ، على سبيل المثال ، خادم التدريج لمنتجك.
النشر اليدوي
هذا الخيار جيد إذا لم يكن لديك أي بيئة تكامل مستمرة. تحتاج أولاً إلى تحميل صورة Docker إلى موقع يمكن الوصول إليه بواسطة خادم التدريج. في حالتنا ، سيكون DockerHub. يوفر لكل مستخدم مستودع صور خاص واحد مجانًا وعدد غير محدود من المستودعات العامة.
تسجيل الدخول للوصول إلى DockerHub لدينا:
docker login -e username@gmail.com -u username -p userpass
نقوم
بتحميل صورتنا هناك:
docker push username / helloworld-with-docker: 0.1.0.بعد ذلك ، انتقل إلى خادم التدريج (أذكرك بأنه يجب تثبيت Docker بالفعل عليه).
لنشر تطبيقنا على الخادم ، نحتاج إلى تنفيذ أمر واحد فقط:
docker run -d --rm -p 80:3000 username/helloworld-with-docker:0.1.0.
وهذا كل شيء! تحقق من السجل المحلي للصور. إذا لم تعثر على النتيجة التي تريدها ، فأدخل
اسم المستخدم / helloworld-with- doer للتحقق من سجل DockerHub. يمكن العثور على صورة بهذا الاسم في السجل ، نظرًا لأننا قمنا بالفعل بتحميلها هناك. يقوم Docker بتنزيلها وإنشاء حاوية على أساسها وتشغيل التطبيق الخاص بك فيها.
الآن ، في كل مرة تحتاج فيها إلى تحديث إصدار التطبيق الخاص بك ، يمكنك الدفع باستخدام علامة جديدة وإعادة تشغيل الحاوية على الخادم في كل مرة.
ملاحظة: هذه الطريقة غير موصى بها إذا كان من الممكن استخدام Travis-CI.
نشر مع Travis-CI
أولاً ، أضف بيانات DockerHub إلى Travis-CI. سيتم تخزينها في متغيرات البيئة.
travis encrypt DOCKER_EMAIL=email@gmail.com travis encrypt DOCKER_USER=username travis encrypt DOCKER_PASS=password
ثم نضيف المفاتيح المستلمة إلى ملف .travis.yml. سنضيف أيضًا تعليقًا على كل مفتاح للتمييز بينهما في المستقبل.
env: global: - secure: "UkF2CHX0lUZ...VI/LE=" # DOCKER_EMAIL - secure: "Z3fdBNPt5hR...VI/LE=" # DOCKER_USER - secure: "F4XbD6WybHC...VI/LE=" # DOCKER_PASS
بعد ذلك ، نحتاج إلى تسجيل الدخول وتنزيل الصورة:
after_success: - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - docker build -f Dockerfile -t username/hello-world-with-travis. - docker tag username/hello-world-with-travis 0.1.0 - docker push username/hello-world-with-travis
أيضًا ، يمكن إطلاق تسليم الصور من Travis-CI بعدة طرق:
- يدويا.
- عبر اتصال ssh.
- خدمات النشر عبر الإنترنت (نشر Bot ، publishhq) ؛
- AWS CLI
- Kubernates.
- أدوات لنشر عامل الميناء.
النتائج
في هذه المقالة ، قمنا بفحص إعداد Docker ونشره باستخدام خادم node.js بسيط كمثال بطريقتين: تلقائية وتلقائية باستخدام Travis-CI. آمل أن يكون هذا المقال قد أفادك.