
داکر (Docker) یه ابزار باحاله که توی دنیای برنامهنویسی و DevOps حسابی سر و صدا کرده. فکر کن یه جعبه جادویی داری که میتونی برنامهت، همه کتابخونهها، تنظیمات و هر چیزی که برای اجراش نیازه رو بندازی توش و هر جا بخوای ببری و اجرا کنی، بدون اینکه نگران این باشی که "آخ، این چرا اینجا کار نمیکنه؟". این جعبه جادویی اسمش کانتینره و داکر کارش اینه که این کانتینرها رو برات درست کنه و مدیریتشون کنه.
داکر مثل یه ماشین مجازی (VM) نیست که بخواد کل یه سیستمعامل رو با خودش بکشه. سبک و سریع کار میکنه چون از هسته سیستمعامل خودت (مثلاً لینوکس یا ویندوز) استفاده میکنه. حالا بیا یه کم عمیقتر بشیم توش و ببینیم داستان چیه.
- هر جا میخوای ببر: کانتینر داکر رو میتونی رو لپتاپ خودت، سرور شرکت یا حتی یه سرور ابری اجرا کنی، بدون دردسر.
- سبک و سریع: چون فقط چیزایی که برنامهت لازم داره رو با خودش میبره، نه یه سیستمعامل کامل.
- همهچیز جدا جداست: هر کانتینر انگار یه دنیای کوچیک برای خودش داره. پس برنامهها نمیتونن همدیگه رو خراب کنن.
- وابستگیها رو جمع و جور میکنه: دیگه لازم نیست بشینی تکتک کتابخونهها رو نصب کنی. همهچیز تو کانتینر آمادهست.
داکر یه معماری کلاینت-سرور داره. یعنی یه بخشش (کلاینت) دستورات تو رو میگیره و یه بخش دیگه (داکر دیمن) کارای اصلی رو انجام میده. حالا بیایم اجزای اصلی داکر رو بشناسیم:
1. داکر دیمن (Docker Daemon): این مغز داکره. رو سرور اجرا میشه و کارای سنگین مثل ساختن، اجرا کردن و مدیریت کانتینرها رو انجام میده.
2. داکر کلاینت (Docker Client): این چیزیه که باهاش حرف میزنی. مثلاً وقتی تو ترمینال میزنی docker run، کلاینت به دیمن میگه چیکار کنه.
3. ایمیجها (Images): ایمیج مثل یه قالب آمادهست. فکر کن یه فایل زیپ داری که همهچیز برنامهت توشه. از روی این ایمیج، کانتینرها ساخته میشن.
4. کانتینرها (Containers): اینا نسخههای در حال اجرای ایمیجها هستن. مثل یه برنامه که داره اجرا میشه، با همه تنظیمات و وابستگیهاش.
5. رجیستری (Registry): یه جایی مثل Docker Hub که ایمیجها رو اونجا ذخیره میکنن. میتونی ایمیجهای آماده رو ازش بکشی یا ایمیج خودت رو آپلود کنی.
فرض کن میخوای یه وباپلیکیشن ساده با Node.js بسازی و بذاریش تو داکر. بیایم قدم به قدم این کار رو انجام بدیم:
اول یه پوشه درست کن و برو توش:
docker build -t my-node-app .
- docker build: میگه یه ایمیج جدید بساز.
- -t my-node-app: اسم ایمیج رو میذاره my-node-app.
- .: یعنی از فایلهای همین پوشه استفاده کن.
### 4. کانتینر رو اجرا کن
حالا که ایمیجت آمادهست، بیا یه کانتینر از روش اجرا کنیم:
docker run -p 3000:3000 my-node-app
- -p 3000:3000: پورت 3000 روی سیستم خودت رو به پورت 3000 توی کانتینر وصل میکنه.
حالا اگه بری به http://localhost:3000 تو مرورگرت، باید ببینی که نوشته: سلام دنیا! این یه اپلیکیشن Node.js توی داکره!
حالا فرض کن اپلیکیشنت یه دیتابیس هم لازم داره، مثلاً MongoDB. میتونی چند تا کانتینر رو با هم ترکیب کنی. برای این کار از Docker Compose استفاده میکنیم که یه ابزار برای مدیریت چند کانتینره.
یه فایل به اسم docker-compose.yml درست کن و اینا رو توش بنویس:
yaml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
depends_on:
- db
environment:
- MONGO_URL=mongodb://db:27017/myapp
db:
image: mongo:latest
ports:
- "27017:27017"
این فایل میگه:
- یه سرویس به اسم app داریم که از Dockerfile خودمون ساخته میشه.
- یه سرویس دیگه به اسم db داریم که از ایمیج رسمی MongoDB استفاده میکنه.
- اپلیکیشن ما به دیتابیس وصل میشه با متغیر محیطی MONGO_URL.
### کد اپلیکیشن رو آپدیت کن
حالا فایل index.js رو یه کم تغییر بده که به MongoDB وصل بشه:
javascript
const express = require('express');
const mongoose = require('mongoose');
const app = express();
mongoose.connect(process.env.MONGO_URL, { useNewUrlParser: true, useUnifiedTopology: true })
.then(() => console.log('به MongoDB وصل شدیم!'))
.catch(err => console.error('خطا:', err));
app.get('/', (req, res) => {
res.send('سلام دنیا! این اپلیکیشن به MongoDB وصله!');
});
app.listen(3000, () => {
console.log('اپلیکیشن روی پورت 3000 اجرا شد');
});
و تو package.json یه وابستگی جدید اضافه کن:
json
{
"name": "my-node-app",
"version": "1.0.0",
"dependencies": {
"express": "^4.17.1",
"mongoose": "^6.0.12"
}
}
حالا با این دستور همهچیز رو با هم اجرا کن:
bash
docker-compose up
این دستور هم اپلیکیشن Node.js رو اجرا میکنه و هم یه کانتینر MongoDB راه میندازه. حالا اگه بری به http://localhost:3000، میبینی که اپلیکیشنت داره کار میکنه و به دیتابیس هم وصله.
1. بهینهسازی ایمیجها: سعی کن ایمیجهات سبک باشن. مثلاً از ایمیجهای پایه مثل node:16-alpine استفاده کن که کوچیکترن.
2. کش کردن درビルد: تو Dockerfile، دستوراتی که کمتر تغییر میکنن (مثل COPY package.json و npm install) رو بالاتر بذار تا داکر از کش استفاده کنه وビルد سریعتر بشه.
3. مدیریت لاگها: میتونی لاگهای کانتینر رو با docker logs <container_id> ببینی.
4. شبکهسازی: داکر بهت امکان میده شبکههای مجازی درست کنی تا کانتینرها بتونن باهم حرف بزنن.
5. داکر هاب: از Docker Hub برای پیدا کردن ایمیجهای آماده استفاده کن، مثلاً برای Redis، MySQL یا هر چی لازم داری.
## یه مثال واقعیتر: استقرار روی سرور
فرض کن میخوای اپلیکیشنت رو روی یه سرور ابری (مثل AWS یا دیجیتال اوشن) مستقر کنی. مراحلش اینه:
1. ایمیجت رو بساز و تست کن روی سیستم خودت.
2. ایمیج رو به یه رجیستری (مثل Docker Hub یا Amazon ECR) آپلود کن:
bash
docker tag my-node-app username/my-node-app
docker push username/my-node-app
3. روی سرور، داکر رو نصب کن و کانتینرت رو اجرا کن:
bash
docker pull username/my-node-app
docker run -d -p 80:3000 username/my-node-app
- مدیریت فضای دیسک: کانتینرها و ایمیجها میتونن دیسکت رو پر کنن. با docker system prune چیزای اضافی رو پاک کن.
- امنیت: همیشه از ایمیجهای رسمی و معتبر استفاده کن و دسترسیهای کانتینر رو محدود کن.
- دیباگ کردن: اگه کانتینرت کار نکرد، با docker logs یا docker exec -it <container_id> bash برو توش و ببین چی به چیه.
داکر یه ابزار قدرتمنده که کار توسعه و استقرار رو خیلی راحتتر کرده. با یه کم تمرین و بازی کردن با کانتینرها، میتونی پروژههای پیچیدهت رو بهراحتی مدیریت کنی. از مثالهای ساده مثل اپلیکیشن Node.js تا پروژههای بزرگ با چندین سرویس، داکر بهت کمک میکنه همهچیز رو مرتب و قابلحمل نگه داری. حالا برو یه پروژه کوچیک راه بنداز و خودت امتحان کن! اگه سوالی داشتی، تو کامنتها بپرس، خودم برات توضیح میدم 😎