حول هذا التطبيق العقدة
يحتوي هذا التطبيق على package.json و server.js وملف .gitignore ، وهو بسيط بما يكفي ليتم القيام به بسهولة.
.gitignore
node_modules/*
package.json
{"name": "docker-dev" ، "الإصدار": "0.1.0" ، "الوصف": "Docker dev" ، "التبعيات": {"connect-redis": "~ 1.4.5" ، "express":server.js
var express = require ('express') ، app = express () ، redis = require ('redis') ، redisStore = require ('connect-redis') (express) ، server = require ('http'). correeserver (app) ؛ app.configure (function () {app.use (express.cookeparser ('keyboard-cat') ؛ redisStore ({Host: Process.env.redis_host || 'localhost' ، port: process.env.redis_port || 6379 ، db: process.env.redis_db || 0}) ، cookie: {expires: false ، maxage: 30 * 60 * 1000}}}) ؛}) ؛ app. res.json ({الحالة: "موافق"}) ؛}) ؛ var port = process.env.http_port || 3000 ؛ server.listen (port) ؛ console.log ('الاستماع على المنفذ' + منفذ) ؛يقوم Server.js بسحب جميع التبعيات ويطلق تطبيقًا محددًا. تم تعيين هذا التطبيق المحدد لتخزين معلومات الجلسة في Redis ويعرض نقطة نهاية الطلب التي ستستجيب لرسالة حالة JSON. هذا كل شيء قياسي للغاية.
شيء واحد يجب ملاحظة أنه يمكن إعادة كتابة معلومات الاتصال الخاصة بـ Redis باستخدام متغيرات البيئة - وهذا سوف يلعب دورًا في الترحيل اللاحق من بيئة التنمية إلى بيئة الإنتاج.
ملف Docker
لتلبية احتياجات التطوير ، سيكون لدينا Redis و Node Run في نفس الحاوية. للقيام بذلك ، سوف نستخدم dockerfile لتكوين هذه الحاوية.
Dockerfile
من dockerfile / ubuntumaintainer abhinav ajgaonkar <[email protected]># قم بتثبيت redisrun / apt -get -y -y -qq تثبيت python redis -server# تثبيت noderun / cd / opt && / wget http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz &&/tar -xzf node-v0.10.28-linux-x64.tar.gz &&/mv node-v0.10.28-linux-64 node & yc. -S/OPT/NODE/BIN/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz# اضبط دليل العمل /srccmd [" /bin /bash"]
دعونا نفهمها واحدة تلو الأخرى ،
من Dockerfile/Ubuntu
هذه المرة ، يُطلب من Docker استخدام صورة Dockerfile/Ubuntu المقدمة من Docker Inc. باعتبارها الصورة القياسية للبناء.
يجري /
apt -get -y -QQ تثبيت python redis server
تحتوي الصورة القياسية على أي شيء على الإطلاق - لذلك نحن بحاجة إلى استخدام APT -GET للحصول على كل ما يحتاج التطبيق إلى تشغيله. هذه الجملة سوف تثبيت Python و Redis-Server. يعد Redis Server ضروريًا لأننا سنقوم بتخزين معلومات الجلسة فيه ، وضرورة Python هي أنه يمكن دمجها في امتداد C المطلوب بواسطة وحدة Redis Node من خلال NPM.
Run /CD /OPT && /WGET http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-x64.tar.gz && /tar -xzf node-v0.10.28-linux-x64.tar.gz && /mv node-v0.10.20.28-x64. MV Node-V0.10.28-Linux-X64 Node &&/CD/usr/local/bin &&/ln -s/opt/node/bin/*. && /rm -f /opt/node-v0.10.28-linux-x64.tar.gz
هذا ينزيل ويستخلص NodeJS 64 بت.
Workdir /SRC
ستخبر هذه الجملة Docker أنه بمجرد بدء الحاوية ، يجب أن تقوم CD /SRC مرة واحدة قبل تنفيذ الأشياء المحددة بواسطة خاصية CMT.
CMD ["/bin/bash"]
كخطوة أخيرة ، Run /Bin /Bash.
بناء وتشغيل الحاويات
الآن بعد كتابة ملف Docker ، دعنا نبني صورة Docker.
Docker Build -T Sqldump/Docker -Dev: 0.1.
بمجرد إنشاء الصورة ، يمكننا تشغيل حاوية باستخدام العبارة التالية:
Docker Run -I -T - -RM / -P 3000: 3000 / -V `PWD`: / SRC / SQLDUMP / DOCKER -DEV: 0.1
دعونا نلقي نظرة على ما يحدث في أمر Docker Run.
-سأبدأ الحاوية في الوضع التفاعلي (مقارنة بـ -D في وضع منفصل). هذا يعني أنه بمجرد انتهاء الجلسة التفاعلية ، ستخرج الحاوية.
-T سوف يعين زائفة tty.
-سيقوم RM بإزالة الحاوية ونظام الملفات الخاص بها عند الخروج.
-P 3000: 3000 سيقوم بإعادة توجيه المنفذ 3000 على المضيف إلى المنفذ 3000 على الحاوية.
-v `pwd`:/src
ستقوم هذه الجملة بتركيب دليل العمل الحالي لـ /src في حاوية المضيف (على سبيل المثال ، ملف المشروع). نقوم بتعليق الدليل الحالي كمعول حجم بدلاً من استخدام الأمر Add في DockerFile ، بحيث يمكن رؤية أي تعديلات نقوم بها في محرر النص على الفور في الحاوية.
SQLDUMP/DOCKER-DEV: 0.1 هو اسم وإصدار صورة Docker التي سيتم تشغيلها. هذا هو نفس الاسم والنسخة التي استخدمناها لإنشاء صورة Docker.
نظرًا لأن Dockerfile يحدد CMD ["/bin/bash"] ، بمجرد بدء تشغيل الحاوية ، سنقوم بتسجيل الدخول إلى بيئة قذيفة باش. إذا تم تنفيذ أمر Docker Run بنجاح ، فسيبدو ما يلي:
ابدأ التنمية
الآن تعمل الحاوية ، قبل أن نبدأ في كتابة التعليمات البرمجية ، سنحتاج إلى فرز بعض الأشياء القياسية غير المتعلقة بالمواجهة. أولاً ، نحتاج إلى استخدام العبارة التالية لبدء خادم Redis في الحاوية:
خدمة إعادة صياغة الخدمة
ثم ، قم بتثبيت تبعيات المشروع و nodemon. يراقب Nodemon التغييرات في ملف المشروع وإعادة تشغيل الخادم في الوقت المناسب.
NPM InstallNPM تثبيت -G NODEMON
أخيرًا ، ابدأ الخادم مع الأمر التالي:
nodemon server.js
الآن ، إذا انتقلت إلى http: // localhost: 3000 في متصفحك ، فيجب أن ترى شيئًا كهذا:
دعنا نضيف نقطة نهاية أخرى مثل server.js لمحاكاة عملية التطوير:
app.get ('/hello/: name' ، function (req ، res) {res.json ({hello: req.params.name}) ؛}) ؛سترى أن Nodemon قد اكتشف التغييرات التي أجريتها وأعدت تشغيل الخادم:
والآن ، إذا انتقلت متصفحك إلى http: // localhost: 3000/hello/world ، فسترى الرد التالي:
بيئة الإنتاج
الحاويات في الحالة الحالية بعيدة عن أن يتم إطلاقها كمنتجات. لن تكون البيانات الموجودة في Redis مستمرة عند إعادة التشغيل عبر الحاويات. على سبيل المثال ، إذا قمت بإعادة تشغيل الحاوية ، فسيتم القضاء على جميع بيانات الجلسة. سيحدث نفس الشيء عند تدمير الحاوية وتفتح حاوية جديدة ، والتي من الواضح أنها ليست ما تريد. سأتحدث عن هذه المشكلة في المحتوى المنتج للجزء الثاني.