Node.js REST API خود را با استفاده از فناوری Containerization Docker که فرآیند استقرار و مدیریت را ساده میکند، Docker کنید.
فرآیند استقرار و اجرای برنامهها در محیطهای مختلف میتواند دردسرساز باشد، زیرا عوامل مختلفی مانند تنظیم متغیرهای محیطی برای پیکربندی وابستگیهای لازم و نسخههای خاص بستههای نرمافزاری مختلف باید در نظر گرفته شوند.
با این حال، با استفاده از فناوری کانتینریسازی Docker، میتوانید برنامهها را در محیطهای مختلف با حداقل تلاش و با تمام وابستگیهای لازم در تصویر داکر مستقر کنید. به این معنی که لازم نیست نگران انجام تنظیمات باشید. این امر روند استقرار و اجرای برنامه ها در محیط های مختلف را آسان می کند.
داکر چیست؟
Docker یک پلت فرم توسعه است که ابزارها و محیطی را برای بسته بندی برنامه ها به عنوان تصاویر قابل حمل فراهم می کند که می توانند به عنوان اجزای اجرایی مستقل در کانتینرها اجرا شوند.
این کانتینرها کد برنامه و وابستگی های مورد نیاز برای اجرای موفقیت آمیز برنامه در محیط های زمان اجرا مختلف بدون هیچ مشکلی را تشکیل می دهند.
قبل از شروع، Docker را روی دستگاه محلی خود نصب کنید. پیش نیازهای خاص پلت فرم و دستورالعمل های نصب را از اسناد رسمی بررسی کنید.
یک Node.js REST API ایجاد کنید
برای شروع، یک وب سرور Node.js ایجاد کنید.
می توانید کد این برنامه را در مخزن GitHub آن پیدا کنید.
در مرحله بعد پکیج های مورد نیاز این پروژه را نصب کنید.
npm install morgan pg knex
بسته pg برای ایجاد ارتباط با پایگاه داده PostgreSQL استفاده می شود. از سوی دیگر، knex یک API ساده برای تعامل با PostgreSQL ارائه میکند – شما از آن برای نوشتن پرسوجوهای SQL استفاده خواهید کرد.
در نهایت، شما از مورگان، یک میانافزار که درخواستها و پاسخهای HTTP را روی کنسول ثبت میکند، برای اشکالزدایی و نظارت بر برنامهای که در یک ظرف Docker اجرا میشود، استفاده خواهید کرد.
در نهایت، فایل index.js را باز کنید و کد زیر را اضافه کنید که یک REST API ساده با سه مسیر را پیاده سازی می کند.
const express = require("express")
const morgan = require("morgan")
const app = express()
const db = require('./db')
const PORT = process.env.PORT || 5000
app.use(morgan('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.get('/', (req, res) => res.send('Hello World!' ))
app.get('/users', async (req, res) => {
const users = await db.select().from('users')
res.json(users)
})
app.post('/users', async (req, res) => {
const user = await db('users').insert({ name: req.body.name }).returning('*')
res.json(user)
})
app.listen(PORT, () => console.log(`Server up at PORT:${PORT}`))
اتصال پایگاه داده را پیکربندی کنید
REST API با نمونه Docker’s PostgreSQL تعامل خواهد داشت، با این حال، ابتدا باید اتصال پایگاه داده را در برنامه خود پیکربندی کنید. در پوشه اصلی پروژه خود، یک فایل db.js ایجاد کنید و کد زیر را اضافه کنید.
const knex = require('knex')
module.exports = knex({
client: 'postgres',
connection: {
host: 'db',
user: 'testUser',
password: 'mypassword123',
database: 'testUser',
},
})
فایل های migrate.js و seed.js را تنظیم کنید
این دو فایل امکان ایجاد جدول در پایگاه داده و پر کردن آن با داده های آزمایشی از طریق API را فراهم می کند. یک پوشه جدید به نام اسکریپت ها در دایرکتوری ریشه پروژه خود ایجاد کنید و دو فایل migrate.js و seed.js را اضافه کنید.
در فایل migrate.js کد زیر را اضافه کنید:
const db = require('../db');
(async () => {
try {
await db.schema.dropTableIfExists('users')
await db.schema.withSchema('public').createTable('users', (table) => {
table.increments()
table.string('name')
})
console.log('Created users table!')
process.exit(0)
} catch (err) {
console.log(err)
process.exit(1)
}
})()
این کد یک جدول کاربران با یک ستون شناسه افزایش خودکار و یک ستون نام در پایگاه داده ایجاد می کند.
سپس در فایل seed.js کد زیر را اضافه کنید:
const db = require('../db');
(async () => {
try {
await db('users').insert({ name: 'Test User1' })
await db('users').insert({ name: 'Test User2' })
console.log('Added dummy users!')
process.exit(0)
} catch (err) {
console.log(err)
process.exit(1)
}
})()
این کد یک تابع ناهمزمان را پیاده سازی می کند که دو کاربر را به پایگاه داده PostgreSQL وارد می کند.
در نهایت این دستورات را به فایل package.json خود اضافه کنید.
"scripts": {
"start": "node index.js",
"migrate": "node scripts/migrate.js",
"seed": "node scripts/seed.js"
},
از آنجایی که کلاینت پیکربندی نشده است، برای آزمایش API، باید دو فایل را به صورت اسکریپت در کنار دستور npm run اجرا کنید.
یک Dockerfile راه اندازی کنید
یک Dockerfile دستورالعمل های مورد نیاز موتور Docker را برای ساخت یک تصویر Docker تعریف می کند. در پوشه اصلی پروژه خود، یک فایل جدید ایجاد کنید و نام آن را Dockerfile بگذارید. سپس، دستورالعملهای زیر را برای ساختن یک تصویر Docker برای برنامه Node.js اضافه کنید.
FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8000
CMD [ "node", "index.js" ]
بیایید آن را تجزیه کنیم:
- FROM – این دستورالعمل تصویر پایه برنامه را تنظیم می کند، که تصویر Node.js Alpine است، یک نسخه سبک وزن از تصویر Node.js که در رجیستری Docker یافت می شود.
- WORKDIR – فهرست /app را به عنوان دایرکتوری کاری تنظیم می کند.
- COPY package*.json./ – به Docker دستور میدهد که همه فایلها را با فرمت نام فایل از فهرست فعلی در پوشه /app کپی کند.
- RUN – تصویر را اجرا و ایجاد می کند.
- کپی 🀄 . . – فایل های منبع را در پوشه /app کپی می کند.
- EXPOSE – این به Docker دستور می دهد تا یک پورت را در کانتینر در معرض محیط خارجی قرار دهد، برای این مورد، ماشین میزبان.
- CMD – دستوری را مشخص می کند که باید در هنگام ایجاد کانتینر Docker از تصویر اجرا شود.
فایل Docker Compose را ایجاد کنید
برای اینکه برنامه Node.js با نمونه Docker’s PostgreSQL تعامل داشته باشد، این دو برنامه باید در کانتینرهای Docker در یک محیط شبکه اجرا شوند.
به همین دلیل، باید هم تصویر برنامه و هم نمونه PostgreSQL را با استفاده از Docker Compose تعریف و بسازید – ابزاری که به شما امکان می دهد چندین کانتینر Docker را بسازید و مدیریت کنید.
به زبان ساده، با استفاده از Docker Compose، میتوانید سرویسهایی را که برنامه شما را تشکیل میدهند به عنوان یک واحد، برای این مورد، Node.js REST API و پایگاه داده PostgreSQL تعریف کنید.
یک فایل جدید به نام docker-compose.yml در پوشه اصلی ایجاد کنید و کد زیر را اضافه کنید:
version: '3.9'
services:
server:
build: .
ports:
- '5000:5000'
depends_on:
- db
db:
image: 'postgres'
ports:
- '4321:5432'
environment:
POSTGRES_PASSWORD: 'mypassword123'
POSTGRES_USER: 'testUser'
volumes:
- data:/var/lib/postgresql/data
volumes:
data:
این کد دو کانتینر داکر را ایجاد و اجرا می کند. اولین کانتینر، سرور، Docker Compose از Dockerfile برای ساخت تصویر این کانتینر استفاده می کند.
همچنین مشخص می کند که کانتینر سرور به ظرف db بستگی دارد. به این معنی که کانتینر سرور باید بعد از کانتینر db راه اندازی شود تا به آن متصل شود.
کانتینر دوم یک ظرف پایگاه داده PostgreSQL است. شما نیازی به تعیین یک Dockerfile برای این کانتینر ندارید زیرا از تصویر PostgreSQL در رجیستری تصویر Docker ایجاد می شود.
تصاویر داکر را بسازید
از دستور Docker Compose برای ساخت تصاویر و شروع دو کانتینر استفاده کنید.
docker-compose up -d
پس از اتمام موفقیت آمیز فرآیند باید پاسخ مشابهی را مشاهده کنید.
REST API را تست کنید
دستور زیر را اجرا کنید تا REST API در حال اجرا در ظرف Docker را آزمایش کنید. باید یک جدول در پایگاه داده PostgreSQL ایجاد کند.
docker exec docker_node-server-1 npm run migrate
شما باید پاسخ مشابهی را ببینید.
به اشتراک گذاری تصاویر داکر
مرحله آخر، فشار دادن تصویر Docker برای برنامه Node.js به داکر هاب است. این شبیه به سوق دادن پروژه های شما به GitHub است.
- به داکر هاب بروید و برای یک حساب کاربری ثبت نام کنید و وارد داشبورد کاربر شوید.
- بعد روی Create a Repository کلیک کنید. نام مخزن خود را وارد کنید و نمایان بودن آن را روی عمومی یا خصوصی تنظیم کنید و سپس روی ایجاد کلیک کنید.
- برای انتقال تصویر Docker برنامه خود به Docker Hub، ابتدا باید از طریق ترمینال وارد حساب کاربری خود شوید و سپس نام کاربری و رمز عبور خود را وارد کنید.
docker login
- در مرحله بعد، نام تصویر Docker خود را برای مطابقت با این قالب به روز کنید:
/ . برای ایجاد این تغییر دستور زیر را اجرا کنید:
docker tag <image> <your docker username>/<repo name>
- در نهایت، تصویر Docker خود را فشار دهید.
docker push <image>/< repo name>
استفاده از داکر در توسعه
این راهنما تنها به کسری از پتانسیلی که داکر می تواند ارائه دهد اشاره کرد. با این حال، اکنون میتوانید از فناوری کانتینریسازی Docker برای بستهبندی هر برنامه و تمام وابستگیهای آن بهعنوان تصاویری که میتوانند در توسعههای مختلف و همچنین محیطهای تولیدی مانند ابر بدون هیچ مشکلی مستقر شوند، استفاده کنید.