استفد من Docker وDocker Compose لنشر تطبيقات Nest.js وتشغيلها بسلاسة.
"لكنها تعمل على جهاز الكمبيوتر الخاص بي..." تسلط نكتة المطورين الضوء بشكل مثالي على التحدي المتمثل في نشر التطبيقات وتشغيلها عبر أنظمة مختلفة.
تكمن المشكلة الحقيقية في تكوين التبعيات المطلوبة والتأكد من توافق إصدارات البرنامج مع التطبيق الخاص بك. يتضمن الحل البديل الرائع لهذه المشكلة استخدام تقنية النقل بالحاويات مثل Docker.
فهو يسمح لك بنشر التطبيقات وتشغيلها بسهولة - مع كافة التبعيات الضرورية - داخل صورة الحاوية؛ مما يلغي الحاجة إلى تكوين واسع النطاق في أنظمة الإنتاج.
فهم Docker وDocker Compose
عامل ميناء عبارة عن منصة تطوير مفتوحة المصدر توفر تقنية النقل بالحاويات المستخدمة في بناء التطبيقات وتعبئتها إلى جانب تبعياتها كصور محمولة.
يتم بعد ذلك تشغيل هذه الصور كمكونات قابلة للتنفيذ داخل بيئات الحاويات المعزولة. ويضمن تشغيل التطبيقات داخل هذه الحاويات أداءً متسقًا للتطبيق عبر أنظمة الإنتاج المختلفة دون أي مشكلات في التوافق.
على الجانب الآخر، Docker Compose هي أداة يتم استخدامه مع Docker لتبسيط عملية تحديد وإدارة التطبيقات متعددة الحاويات.
بينما يتم استخدام Docker بشكل أساسي لإدارة الحاويات الفردية، يتيح لك Docker Compose إدارة تكوين الحاويات المتعددة التي تحتاج إلى التشغيل كتطبيق واحد.
يعد هذا مفيدًا بشكل خاص عندما يتكون التطبيق من خدمات متعددة تحتاج إلى العمل معًا، مثل العديد من خدمات واجهة برمجة التطبيقات التابعة وقواعد البيانات وغيرها.
قبل أن تغوص في الكود، تحتاج إلى التثبيت سطح المكتب دوكر على جهازك المحلي. راجع المتطلبات الخاصة بالنظام وخطوات التثبيت من الوثائق الرسمية.
يمكنك العثور على رمز هذا التطبيق في ملف جيثب مخزن.
قم بإعداد مشروع Nest.js
سيرشدك هذا الدليل خلال عملية تدوير حاويتي Docker اللتين تعملان بسلاسة كتطبيق Nest.js واحد. ستحتوي الحاوية الأولى على نسخة من صورة Docker لخادم الويب Nest.js، بينما ستنفذ الحاوية الثانية صورة قاعدة بيانات Docker's PostgreSQL.
للبدء، قم بتثبيت أداة سطر الأوامر Nest.js:
npm i -g @nestjs/cli
الآن، قم بإنشاء مشروع Nest.js جديد عن طريق تشغيل الأمر أدناه في جهازك.
nest new docker-nest-app
بعد ذلك، ستعرض أداة CLI العديد من مديري الحزم لتختار من بينها لإنشاء المشروع. اختر خيارك المفضل. في هذه الحالة سنستخدم npm، مدير حزم العقدة.
وأخيرًا، يمكنك الانتقال إلى دليل المشروع وتشغيل خادم التطوير.
cd docker-nest-app
npm run start
إنشاء وحدة قاعدة البيانات
أولاً، قم بتثبيت هذه التبعيات:
npm install pg typeorm @nestjs/typeorm @nestjs/config
بعد ذلك، في الدليل الجذر لمشروعك، قم بإنشاء ملف .env الملف، وأضف قيم تكوين اتصال قاعدة البيانات التالية:
DATABASE_HOST="db"
DATABASE_PORT=5432
DATABASE_USER="testUser"
DATABASE_PASSWORD="mypassword123"
أخيرًا، تابع وأنشئ وحدة قاعدة البيانات.
nest g module database
الآن، بعد إنشاء الوحدة، افتح ملف قاعدة البيانات/database.module.ts الملف ويتضمن رمز تكوين قاعدة البيانات التالي:
import { Module } from'@nestjs/common';
import { TypeOrmModule } from'@nestjs/typeorm';
import { ConfigModule, ConfigService } from'@nestjs/config';@Module({
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRootAsync({
imports: [ConfigModule],
useFactory: async (configService: ConfigService) => ({
type: 'postgres',
host: configService.get<string>('DATABASE_HOST'),
port: configService.get<number>('DATABASE_PORT'),
username: configService.get<string>('DATABASE_USER'),
password: configService.get<string>('DATABASE_PASSWORD'),
synchronize: true,
}),
inject: [ConfigService],
}),
],
})
exportclass DatabaseModule {}
بمجرد إعداد صورة Docker PostgreSQL باستخدام تكوين TypeORM هذا، سيقوم تطبيق Nest.js بإنشاء اتصال بقاعدة البيانات.
قم بتحديث ملف app.module.ts
وأخيرًا، قم بتحديث ملف وحدة التطبيق الرئيسية لدمج التكوين الخاص بوحدة قاعدة البيانات.
import { Module } from'@nestjs/common';
import { ConfigModule } from'@nestjs/config';
import { AppController } from'./app.controller';
import { AppService } from'./app.service';
import { DatabaseModule } from'./database/database.module';@Module({
imports: [
ConfigModule.forRoot({
envFilePath: '.env',
}),
DatabaseModule,
],
controllers: [AppController],
providers: [AppService],
})
exportclass AppModule {}
قم بإعداد ملف Dockerfile
يلتقط ملف Dockerfile مجموعة التعليمات المطلوبة التي يحتاجها محرك Docker لإنشاء صورة Docker. تشمل هذه الصورة الكود المصدري للتطبيق وجميع تبعياته.
في الدليل الجذر لمشروعك، قم بإنشاء ملف جديد وقم بتسميته Dockerfile. ثم قم بإضافة المحتويات التالية:
FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY. .
RUN npm run build
CMD [ "npm", "run", "start: dev" ]
إليك ما يمثله كل أمر:
- من: تحدد هذه التعليمات الصورة الأساسية التي يجب أن يستخدمها Docker لإنشاء صورة التطبيق.
- دير العمل: يوجه هذا الأمر Docker لتعيين /app الدليل كدليل العمل للتطبيق داخل الحاوية.
- ينسخالحزمة*.json./: نسخ جميع الملفات بتنسيق اسم الملف هذا من الدليل الحالي في التطبيق إلى ملف برنامج مجلد.
- تشغيل تثبيت npm: سيقوم هذا الأمر بتثبيت الحزم والتبعيات المطلوبة التي يتطلبها التطبيق داخل حاوية Docker.
- ينسخ. .: يوجه Docker لنسخ كافة ملفات التعليمات البرمجية المصدر للتطبيق من الدليل الحالي إلى ملف /app مجلد.
- RUN npm تشغيل البناء: يقوم الأمر بإنشاء تطبيق Nest.js قبل إنشاء صورة Docker. يقوم بتجميع كود TypeScript في JavaScript ويخزن مخرجات عملية الإنشاء في ملف حي الدليل.
- كمد: يحدد الأمر الذي سيتم تشغيله عند بدء تشغيل الحاوية. في هذه الحالة، سوف نقوم بتشغيل بداية تشغيل npm: dev الأمر الذي سيبدأ الخادم في وضع التطوير.
يمكّن هذا التكوين التطبيق من مراقبة تغييرات التعليمات البرمجية بشكل فعال. بمجرد اكتشاف التغييرات، ستخضع الحاوية تلقائيًا لإعادة البناء.
قم بإنشاء ملف Docker Compose
في الدليل الجذر لمجلد المشروع الخاص بك، قم بإنشاء ملف docker-compose.yml الملف، وأضف المحتوى التالي:
version:'3.9'
services:
server:
build:.
ports:
-'3000:3000'
depends_on:
-db
db:
image:'postgres'
ports:
-'5432:5432'
environment:
POSTGRES_PASSWORD:'mypassword123'
POSTGRES_USER:'testUser'
volumes:
-data:/var/lib/postgresql/data
volumes:
data:
سيستخدم Docker Compose هذه التعليمات لإنشاء الصورتين وتشغيلهما في حاويتين من Docker. الحاوية الأولى، الخادم، سوف تستضيف صورة التطبيق؛ يعمل على المنفذ 3000.
ستستضيف الحاوية الثانية صورة قاعدة بيانات PostgreSQL. لا تحتاج إلى تحديد ملف Dockerfile لهذه الصورة — ستستخدم Docker صورة PostgreSQL الموجودة مسبقًا في سجل صور Docker لإنشائها.
ابدأ تشغيل حاويات Docker
أخيرًا، تابع إنشاء الصور وبدء تشغيل الحاويات عن طريق تشغيل الأمر التالي:
docker compose up
بمجرد اكتمال العملية بنجاح، من المفترض أن ترى معلومات سجل مماثلة على جهازك الطرفي.
الآن، بعد أن تم تشغيل كل من خادم الويب وحاويات قاعدة البيانات، يمكنك المضي قدمًا وإضافة المزيد من الوظائف إلى تطبيق Nest.js الخاص بك. على سبيل المثال، يمكنك إنشاء واجهة برمجة تطبيقات Nest.js CRUD REST.
دفع صور Docker إلى Docker Hub
إن دفع صور Docker إلى Docker Hub يشبه تقريبًا دفع المشاريع إلى GitHub. اتبع هذه الخطوات لدفع صورة Docker لتطبيق Nest.js إلى Docker Hub.
- رئيس لأكثر من مركز عامل الميناء، قم بالتسجيل، ثم قم بتسجيل الدخول إلى صفحة النظرة العامة الخاصة بحسابك.
- انقر على إنشاء مستودع قم بملء اسم المستودع الخاص بك، وحدد إمكانية رؤيته عن طريق تحديد أي منهما عام أو خاص، ثم انقر فوق يخلق.
- الآن، تحتاج إلى تسجيل الدخول إلى حسابك عبر الجهاز عن طريق تشغيل الأمر أدناه، ثم تقديم اسم المستخدم وكلمة المرور الخاصين بـ Docker.
docker login
- بعد ذلك، قم بتحديث اسم صورة Docker ليطابق هذا التنسيق:
/ عن طريق تشغيل الأمر أدناه.docker tag
/ - وأخيرًا، ادفع صورة Docker.
docker push
/
الاستفادة من تقنية حاويات Docker في التطوير
تمكّنك تقنية النقل بالحاويات في Docker من تجميع التطبيق مع جميع تبعياته في صور Docker. يمكن بعد ذلك تشغيل هذه الصور بسلاسة داخل الحاويات في بيئات التطوير والإنتاج المختلفة دون أي مشاكل.