یاد بگیرید چگونه یک محیط توسعه جاوا اسکریپت قوی و یکپارچه را با استفاده از کانتینرهای داکر راهاندازی کنید. این راهنمای جامع همه چیز را از تنظیمات اولیه تا پیکربندیهای پیشرفته پوشش میدهد و گردش کاری روان و کارآمد را تضمین میکند.
محیط توسعه جاوا اسکریپت: پیکربندی کانتینر داکر
در چشمانداز پرشتاب توسعه نرمافزار امروزی، حفظ یک محیط توسعه یکپارچه و قابل تکرار بسیار حیاتی است. سیستمعاملهای مختلف، نسخههای متفاوت نرمافزارها و وابستگیهای متناقض میتوانند به سندروم dreaded "روی دستگاه من کار میکند" منجر شوند. داکر، یک پلتفرم پیشرو در زمینه کانتینرسازی، راهحل قدرتمندی برای این مشکل ارائه میدهد و به توسعهدهندگان اجازه میدهد تا اپلیکیشن خود و وابستگیهای آن را در یک واحد منفرد و ایزوله بستهبندی کنند.
این راهنما شما را در فرآیند راهاندازی یک محیط توسعه جاوا اسکریپت قوی و یکپارچه با استفاده از کانتینرهای داکر راهنمایی میکند. ما همه چیز را از تنظیمات اولیه تا پیکربندیهای پیشرفته پوشش خواهیم داد تا گردش کاری روان و کارآمدی را برای پروژههای جاوا اسکریپت شما، صرفنظر از سیستمعاملهای متنوع تیمتان، تضمین کنیم.
چرا از داکر برای توسعه جاوا اسکریپت استفاده کنیم؟
قبل از پرداختن به جزئیات، بیایید مزایای استفاده از داکر برای محیط توسعه جاوا اسکریپت خود را بررسی کنیم:
- یکپارچگی: داکر تضمین میکند که همه افراد تیم شما با محیطی دقیقاً یکسان کار میکنند، که این امر مشکلات سازگاری را از بین میبرد و احتمال بروز باگهای ناشی از تفاوتهای محیطی را کاهش میدهد. این موضوع به ویژه برای تیمهایی که به صورت جغرافیایی توزیع شدهاند، اهمیت دارد.
- ایزولهسازی: کانتینرها ایزولهسازی از سیستم میزبان را فراهم میکنند و از تداخل با پروژههای دیگر جلوگیری کرده و تضمین میکنند که وابستگیهای شما با یکدیگر تداخل نداشته باشند.
- قابلیت تکرار: ایمیجهای داکر به راحتی قابل اشتراکگذاری و استقرار هستند، که این امر بازتولید محیط توسعه شما را بر روی ماشینهای مختلف یا در محیط پروداکشن ساده میکند. این ویژگی به خصوص هنگام پذیرش اعضای جدید تیم یا استقرار در ارائهدهندگان مختلف ابری مفید است.
- قابلیت حمل: کانتینرهای داکر میتوانند بر روی هر پلتفرمی که از داکر پشتیبانی میکند، از جمله ویندوز، macOS و لینوکس، اجرا شوند و به توسعهدهندگان اجازه میدهند از سیستمعامل مورد علاقه خود بدون تأثیر بر پروژه استفاده کنند.
- استقرار سادهشده: همان ایمیج داکری که برای توسعه استفاده میشود، میتواند برای تست و پروداکشن نیز به کار رود، که این امر فرآیند استقرار را ساده کرده و خطر خطاها را کاهش میدهد.
پیشنیازها
قبل از شروع، مطمئن شوید که موارد زیر را نصب کردهاید:
- داکر: Docker Desktop را برای سیستمعامل خود از وبسایت رسمی داکر (docker.com) دانلود و نصب کنید. Docker Desktop شامل Docker Engine، Docker CLI، Docker Compose و سایر ابزارهای ضروری است.
- Node.js و npm (اختیاری): اگرچه داشتن آنها بر روی ماشین میزبان شما الزامی نیست زیرا درون کانتینر قرار خواهند گرفت، اما نصب محلی Node.js و npm میتواند برای کارهایی خارج از کانتینر یا هنگام راهاندازی ساختار اولیه پروژه شما مفید باشد. میتوانید آنها را از nodejs.org دانلود کنید.
- یک ویرایشگر کد: ویرایشگر کد مورد علاقه خود را انتخاب کنید (مانند VS Code، Sublime Text، Atom). VS Code دارای افزونههای داکر عالی است که میتواند گردش کار شما را ساده کند.
پیکربندی پایهای Dockerfile
پایه و اساس هر محیط مبتنی بر داکر، فایل Dockerfile است. این فایل حاوی دستورالعملهایی برای ساختن ایمیج داکر شماست. بیایید یک Dockerfile پایهای برای یک اپلیکیشن Node.js ایجاد کنیم:
# استفاده از یک رانتایم رسمی Node.js به عنوان ایمیج والد
FROM node:18-alpine
# تنظیم دایرکتوری کاری در کانتینر
WORKDIR /app
# کپی کردن package.json و package-lock.json به دایرکتوری کاری
COPY package*.json ./
# نصب وابستگیهای اپلیکیشن
RUN npm install
# کپی کردن سورس کد اپلیکیشن به دایرکتوری کاری
COPY . .
# در دسترس قرار دادن پورت 3000 برای دنیای خارج (اگر اپلیکیشن شما از پورت دیگری استفاده میکند، آن را تنظیم کنید)
EXPOSE 3000
# تعریف دستوری که هنگام شروع کانتینر اجرا میشود
CMD ["npm", "start"]
بیایید هر خط را بررسی کنیم:
FROM node:18-alpine: ایمیج پایه برای کانتینر را مشخص میکند. در این مورد، ما از ایمیج رسمی Node.js 18 Alpine استفاده میکنیم که یک توزیع لینوکس سبک است. Alpine به دلیل حجم کم خود شناخته شده است که به سبک نگه داشتن ایمیج داکر شما کمک میکند. نسخههای دیگر Node.js را متناسب با پروژه خود در نظر بگیرید.WORKDIR /app: دایرکتوری کاری داخل کانتینر را روی/appتنظیم میکند. اینجاست که کد اپلیکیشن شما قرار میگیرد.COPY package*.json ./: فایلهایpackage.jsonوpackage-lock.json(یاyarn.lockاگر از Yarn استفاده میکنید) را به دایرکتوری کاری کپی میکند. کپی کردن این فایلها در ابتدا به داکر اجازه میدهد تا مرحلهnpm installرا کش کند، که این کار زمان ساخت را هنگامی که فقط کد اپلیکیشن را تغییر میدهید، به طور قابل توجهی سرعت میبخشد.RUN npm install: وابستگیهای اپلیکیشن تعریف شده درpackage.jsonرا نصب میکند.COPY . .: تمام فایلها و دایرکتوریهای باقیمانده را از دایرکتوری پروژه محلی شما به دایرکتوری کاری داخل کانتینر کپی میکند.EXPOSE 3000: پورت 3000 را در دسترس قرار میدهد تا از ماشین میزبان قابل دسترسی باشد. این امر در صورتی که اپلیکیشن شما روی این پورت گوش میدهد، مهم است. اگر اپلیکیشن شما از پورت دیگری استفاده میکند، شماره پورت را تنظیم کنید.CMD ["npm", "start"]: دستوری را که هنگام شروع کانتینر اجرا میشود، مشخص میکند. در این مورد، ما ازnpm startاستفاده میکنیم که یک دستور رایج برای شروع اپلیکیشنهای Node.js است. اطمینان حاصل کنید که این دستور با دستور تعریف شده در بخشscriptsفایلpackage.jsonشما مطابقت دارد.
ساختن ایمیج داکر
پس از ایجاد Dockerfile خود، میتوانید ایمیج داکر را با استفاده از دستور زیر بسازید:
docker build -t my-node-app .
که در آن:
docker build: دستور داکر برای ساختن ایمیجها است.-t my-node-app: تگ (نام) برای ایمیج را مشخص میکند. یک نام توصیفی برای اپلیکیشن خود انتخاب کنید..: زمینه ساخت (build context) را مشخص میکند که دایرکتوری فعلی است. داکر ازDockerfileموجود در این دایرکتوری برای ساخت ایمیج استفاده خواهد کرد.
سپس داکر دستورالعملهای موجود در Dockerfile شما را اجرا کرده و ایمیج را لایه به لایه میسازد. اولین باری که ایمیج را میسازید، ممکن است دانلود ایمیج پایه و نصب وابستگیها کمی طول بکشد. با این حال، ساختهای بعدی بسیار سریعتر خواهند بود زیرا داکر لایههای میانی را کش میکند.
اجرای کانتینر داکر
پس از ساخته شدن ایمیج، میتوانید یک کانتینر از آن را با استفاده از دستور زیر اجرا کنید:
docker run -p 3000:3000 my-node-app
که در آن:
docker run: دستور داکر برای اجرای کانتینرها است.-p 3000:3000: پورت 3000 روی ماشین میزبان را به پورت 3000 داخل کانتینر متصل میکند. این به شما امکان میدهد تا از طریق مرورگر خود با استفاده ازlocalhost:3000به اپلیکیشن خود دسترسی پیدا کنید. عدد اول پورت میزبان و عدد دوم پورت کانتینر است.my-node-app: نام ایمیجی است که میخواهید اجرا کنید.
اکنون اپلیکیشن شما باید در داخل کانتینر داکر در حال اجرا باشد. میتوانید با باز کردن مرورگر خود و رفتن به localhost:3000 (یا پورتی که مشخص کردهاید) به آن دسترسی پیدا کنید. باید صفحه خوشآمدگویی یا رابط کاربری اولیه اپلیکیشن خود را ببینید.
استفاده از Docker Compose
برای اپلیکیشنهای پیچیدهتر با چندین سرویس، Docker Compose یک ابزار بسیار ارزشمند است. این ابزار به شما امکان میدهد تا اپلیکیشنهای چند کانتینری را با استفاده از یک فایل YAML تعریف و مدیریت کنید. بیایید یک فایل docker-compose.yml برای اپلیکیشن Node.js خود ایجاد کنیم:
version: "3.9"
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- .:/app
environment:
NODE_ENV: development
command: npm run dev
بیایید هر بخش را بررسی کنیم:
version: "3.9": نسخه فرمت فایل Docker Compose را مشخص میکند.services: سرویسهایی را که اپلیکیشن شما را تشکیل میدهند، تعریف میکند. در این مورد، ما یک سرویس به نامappداریم.build: .: مشخص میکند که ایمیج باید ازDockerfileموجود در دایرکتوری فعلی ساخته شود.ports: - "3000:3000": پورت 3000 روی ماشین میزبان را به پورت 3000 داخل کانتینر متصل میکند، مشابه دستورdocker run.volumes: - .:/app: یک والیوم ایجاد میکند که دایرکتوری فعلی روی ماشین میزبان شما را به دایرکتوری/appداخل کانتینر متصل (mount) میکند. این به شما امکان میدهد تغییراتی در کد خود روی ماشین میزبان ایجاد کنید و این تغییرات به طور خودکار در داخل کانتینر منعکس شوند، که امکان بارگذاری مجدد زنده (hot reloading) را فراهم میکند.environment: NODE_ENV: development: متغیر محیطیNODE_ENVرا در داخل کانتینر بهdevelopmentتنظیم میکند. این برای پیکربندی اپلیکیشن شما برای اجرا در حالت توسعه مفید است.command: npm run dev: دستور پیشفرض تعریف شده در Dockerfile را لغو میکند. در این مورد، ما ازnpm run devاستفاده میکنیم که اغلب برای راهاندازی یک سرور توسعه با بارگذاری مجدد زنده استفاده میشود.
برای شروع اپلیکیشن با استفاده از Docker Compose، به دایرکتوری حاوی فایل docker-compose.yml بروید و دستور زیر را اجرا کنید:
docker-compose up
Docker Compose ایمیج را (در صورت لزوم) ساخته و کانتینر را شروع میکند. میتوان فلگ -d را برای اجرای کانتینر در حالت جدا شده (در پسزمینه) اضافه کرد.
گزینههای پیکربندی پیشرفته
در اینجا چند گزینه پیکربندی پیشرفته برای بهبود محیط توسعه جاوا اسکریپت داکرایز شده شما آورده شده است:
۱. ساختهای چند مرحلهای (Multi-Stage Builds)
ساختهای چند مرحلهای به شما امکان میدهند تا از چندین دستور FROM در Dockerfile خود استفاده کنید که هر کدام یک مرحله ساخت متفاوت را نشان میدهند. این برای کاهش اندازه ایمیج نهایی شما با جدا کردن محیط ساخت از محیط اجرا مفید است.
# مرحله ۱: ساخت اپلیکیشن
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# مرحله ۲: ایجاد ایمیج زمان اجرا
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
در این مثال، مرحله اول (builder) اپلیکیشن را با استفاده از Node.js میسازد. مرحله دوم از Nginx برای سرویسدهی فایلهای ساخته شده اپلیکیشن استفاده میکند. فقط فایلهای ساخته شده از مرحله اول به مرحله دوم کپی میشوند، که منجر به یک ایمیج کوچکتر و کارآمدتر میشود.
۲. استفاده از متغیرهای محیطی
متغیرهای محیطی یک راه قدرتمند برای پیکربندی اپلیکیشن شما بدون تغییر کد هستند. میتوانید متغیرهای محیطی را در فایل docker-compose.yml خود تعریف کنید یا آنها را در زمان اجرا با استفاده از فلگ -e ارسال کنید.
services:
app:
environment:
API_URL: "http://api.example.com"
در داخل اپلیکیشن خود، میتوانید با استفاده از process.env به این متغیرهای محیطی دسترسی پیدا کنید.
const apiUrl = process.env.API_URL;
۳. اتصال والیوم برای توسعه
اتصال والیوم (همانطور که در مثال Docker Compose نشان داده شد) برای توسعه بسیار مهم است زیرا به شما امکان میدهد تغییراتی در کد خود روی ماشین میزبان ایجاد کنید و این تغییرات بلافاصله در داخل کانتینر منعکس شوند. این کار نیاز به ساخت مجدد ایمیج در هر بار تغییر را از بین میبرد.
۴. دیباگ کردن با VS Code
VS Code پشتیبانی عالی برای دیباگ کردن اپلیکیشنهای Node.js در حال اجرا در داخل کانتینرهای داکر دارد. میتوانید از افزونه Docker VS Code برای اتصال به یک کانتینر در حال اجرا و تنظیم نقاط شکست (breakpoints)، بازرسی متغیرها و پیمایش کد خود استفاده کنید.
ابتدا، افزونه Docker را در VS Code نصب کنید. سپس، یک فایل launch.json در دایرکتوری .vscode خود با پیکربندی زیر ایجاد کنید:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to Docker",
"port": 9229,
"address": "localhost",
"remoteRoot": "/app",
"localRoot": "${workspaceFolder}"
}
]
}
اطمینان حاصل کنید که اپلیکیشن Node.js شما با فلگ --inspect یا --inspect-brk شروع شده است. به عنوان مثال، میتوانید فایل docker-compose.yml خود را برای اضافه کردن این فلگ تغییر دهید:
services:
app:
command: npm run dev -- --inspect=0.0.0.0:9229
سپس، در VS Code، پیکربندی "Attach to Docker" را انتخاب کرده و دیباگ را شروع کنید. شما قادر خواهید بود نقاط شکست را تنظیم کرده و کد در حال اجرای خود در داخل کانتینر را دیباگ کنید.
۵. استفاده از رجیستری خصوصی npm
اگر روی پروژهای با بستههای خصوصی npm کار میکنید، باید کانتینر داکر خود را برای احراز هویت با رجیستری خصوصی npm خود پیکربندی کنید. این کار را میتوان با تنظیم متغیر محیطی NPM_TOKEN در فایل docker-compose.yml خود یا با ایجاد یک فایل .npmrc در دایرکتوری پروژه و کپی کردن آن به کانتینر انجام داد.
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
COPY .npmrc .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
فایل `.npmrc` باید حاوی توکن احراز هویت شما باشد:
//registry.npmjs.org/:_authToken=YOUR_NPM_TOKEN
به یاد داشته باشید که YOUR_NPM_TOKEN را با توکن npm واقعی خود جایگزین کنید. این توکن را امن نگه دارید و آن را در مخزن عمومی خود کامیت نکنید.
۶. بهینهسازی حجم ایمیج
کوچک نگه داشتن حجم ایمیج داکر برای زمانهای ساخت و استقرار سریعتر مهم است. در اینجا چند نکته برای بهینهسازی حجم ایمیج آورده شده است:
- از یک ایمیج پایه سبک مانند
node:alpineاستفاده کنید. - از ساختهای چند مرحلهای برای جدا کردن محیط ساخت از محیط اجرا استفاده کنید.
- فایلها و دایرکتوریهای غیرضروری را از ایمیج حذف کنید.
- از فایل
.dockerignoreبرای حذف فایلها و دایرکتوریها از زمینه ساخت استفاده کنید. - چندین دستور
RUNرا در یک دستور واحد ترکیب کنید تا تعداد لایهها کاهش یابد.
مثال: داکرایز کردن یک اپلیکیشن React
بیایید این مفاهیم را با یک مثال عملی نشان دهیم: داکرایز کردن یک اپلیکیشن React که با Create React App ایجاد شده است.
ابتدا، یک اپلیکیشن React جدید با استفاده از Create React App ایجاد کنید:
npx create-react-app my-react-app
cd my-react-app
سپس، یک Dockerfile در دایرکتوری ریشه پروژه ایجاد کنید:
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
یک فایل docker-compose.yml ایجاد کنید:
version: "3.9"
services:
app:
build: .
ports:
- "3000:80"
volumes:
- .:/app
environment:
NODE_ENV: development
توجه: ما پورت 3000 روی میزبان را به پورت 80 داخل کانتینر متصل میکنیم زیرا Nginx اپلیکیشن را روی پورت 80 سرویس میدهد. ممکن است لازم باشد اتصال پورت را بسته به پیکربندی اپلیکیشن خود تنظیم کنید.
در نهایت، docker-compose up را اجرا کنید تا اپلیکیشن ساخته و شروع شود. سپس میتوانید با رفتن به localhost:3000 در مرورگر خود به اپلیکیشن دسترسی پیدا کنید.
مشکلات رایج و عیبیابی
حتی با پیکربندی دقیق، ممکن است هنگام کار با داکر با مشکلاتی مواجه شوید. در اینجا برخی از مشکلات رایج و راهحلهای آنها آورده شده است:
- تداخل پورتها: اطمینان حاصل کنید که پورتهایی که در
docker-compose.ymlیا دستورdocker runخود متصل میکنید، توسط اپلیکیشنهای دیگر روی ماشین میزبان شما استفاده نمیشوند. - مشکلات اتصال والیوم: مجوزهای فایلها و دایرکتوریهایی که متصل میکنید را بررسی کنید. ممکن است داکر مجوزهای لازم برای دسترسی به فایلها را نداشته باشد.
- خطاهای ساخت ایمیج: خروجی دستور
docker buildرا برای یافتن خطاها به دقت بررسی کنید. دلایل رایج شامل سینتکس نادرستDockerfile، وابستگیهای گمشده یا مشکلات شبکه است. - کرش کردن کانتینر: از دستور
docker logsبرای مشاهده لاگهای کانتینر خود و شناسایی علت کرش استفاده کنید. دلایل رایج شامل خطاهای اپلیکیشن، متغیرهای محیطی گمشده یا محدودیتهای منابع است. - زمان ساخت طولانی:
Dockerfileخود را با استفاده از ساختهای چند مرحلهای، کش کردن وابستگیها و به حداقل رساندن تعداد لایهها بهینه کنید.
نتیجهگیری
داکر یک راهحل قدرتمند و همهکاره برای ایجاد محیطهای توسعه جاوا اسکریپت یکپارچه و قابل تکرار فراهم میکند. با استفاده از داکر، میتوانید مشکلات سازگاری را از بین ببرید، استقرار را ساده کنید و اطمینان حاصل کنید که همه افراد تیم شما با یک محیط یکسان کار میکنند.
این راهنما اصول اولیه راهاندازی یک محیط توسعه جاوا اسکریپت داکرایز شده و همچنین برخی گزینههای پیکربندی پیشرفته را پوشش داده است. با دنبال کردن این مراحل، میتوانید یک گردش کار قوی و کارآمد برای پروژههای جاوا اسکریپت خود، صرفنظر از پیچیدگی آنها یا اندازه تیمتان، ایجاد کنید. داکر را بپذیرید و پتانسیل کامل فرآیند توسعه جاوا اسکریپت خود را آزاد کنید.
گامهای بعدی:
- برای یافتن ایمیجهای از پیش ساخته شده که با نیازهای خاص شما مطابقت دارند، Docker Hub را کاوش کنید.
- برای مدیریت اپلیکیشنهای چند کانتینری، عمیقتر به Docker Compose بپردازید.
- در مورد Docker Swarm و Kubernetes برای هماهنگسازی کانتینرهای داکر در محیطهای پروداکشن بیاموزید.
با گنجاندن این بهترین شیوهها در گردش کار خود، میتوانید یک محیط توسعه کارآمدتر، قابل اعتمادتر و مقیاسپذیرتر برای اپلیکیشنهای جاوا اسکریپت خود ایجاد کنید و موفقیت در بازار رقابتی امروز را تضمین نمایید.