| <html lang="fa" dir="rtl"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>کتابچه تسلط کامل بر مفاهیم داکر و پاسخ به سوالات تحویل پروژه (Defense Guide)</title> | |
| <style> | |
| @import url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css'); | |
| :root { | |
| --primary: #1e40af; | |
| --primary-light: #3b82f6; | |
| --secondary: #0f172a; | |
| --accent-green: #15803d; | |
| --accent-amber: #b45309; | |
| --bg: #f8fafc; | |
| --card: #ffffff; | |
| --text: #1e293b; | |
| --border: #cbd5e1; | |
| } | |
| @page { | |
| size: A4; | |
| margin: 15mm; | |
| @bottom-center { | |
| content: "صفحه " counter(page) " از " counter(pages); | |
| font-family: 'Vazirmatn', sans-serif; | |
| font-size: 8.5pt; | |
| color: #64748b; | |
| } | |
| } | |
| body { | |
| font-family: 'Vazirmatn', -apple-system, sans-serif; | |
| background-color: var(--bg); | |
| color: var(--text); | |
| line-height: 1.8; | |
| margin: 0; | |
| padding: 30px; | |
| direction: rtl; | |
| } | |
| .container { | |
| max-width: 900px; | |
| margin: 0 auto; | |
| background: var(--card); | |
| padding: 40px; | |
| border-radius: 12px; | |
| box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05); | |
| border: 1px solid var(--border); | |
| } | |
| header { | |
| text-align: center; | |
| border-bottom: 3px solid var(--primary); | |
| padding-bottom: 20px; | |
| margin-bottom: 30px; | |
| } | |
| h1 { | |
| color: var(--primary); | |
| font-size: 22pt; | |
| font-weight: 800; | |
| margin-bottom: 6px; | |
| } | |
| .subtitle { | |
| color: #475569; | |
| font-size: 11.5pt; | |
| font-weight: 500; | |
| } | |
| .qa-card { | |
| background: #ffffff; | |
| border: 1px solid var(--border); | |
| border-radius: 8px; | |
| margin-bottom: 20px; | |
| overflow: hidden; | |
| box-shadow: 0 2px 6px rgba(0,0,0,0.02); | |
| page-break-inside: avoid; | |
| } | |
| .qa-header { | |
| background: #eff6ff; | |
| color: #1e40af; | |
| padding: 12px 18px; | |
| font-size: 11pt; | |
| font-weight: 700; | |
| border-bottom: 1px solid #bfdbfe; | |
| display: flex; | |
| align-items: center; | |
| gap: 10px; | |
| } | |
| .qa-body { | |
| padding: 18px; | |
| font-size: 10pt; | |
| text-align: justify; | |
| } | |
| .key-point { | |
| background: #f0fdf4; | |
| border-right: 4px solid var(--accent-green); | |
| padding: 10px 14px; | |
| border-radius: 4px; | |
| margin-top: 10px; | |
| font-size: 9.5pt; | |
| color: #14532d; | |
| } | |
| code { | |
| font-family: 'Courier New', monospace; | |
| background-color: #f1f5f9; | |
| color: #0f172a; | |
| padding: 2px 6px; | |
| border-radius: 4px; | |
| font-size: 9pt; | |
| direction: ltr; | |
| display: inline-block; | |
| } | |
| @media print { | |
| body { padding: 0; background: white; } | |
| .container { box-shadow: none; border: none; max-width: 100%; padding: 0; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <header> | |
| <h1>کتابچه تسلط کامل بر مفاهیم داکر و دفاعیه پروژه</h1> | |
| <div class="subtitle">پاسخهای نمونه و تخصصی به تمامی سوالات احتمالی استاد در جلسه تحویل پروژه مهندسی اینترنت</div> | |
| </header> | |
| <!-- Q1 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۱: داکر چیست و چه تفاوتی با ماشین مجازی (VM) دارد؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| داکر پلتفرمی برای اجرای برنامهها درون کانتینرهای ایزوله است. برخلاف ماشین مجازی که نیازمند Hypervisor و نصب یک سیستمعامل کامل میهمان (Guest OS) برای هر کانتینر است، داکر از **Kernel Sharing** استفاده میکند؛ یعنی تمامی کانتینرها از هسته سیستمعامل میزبان (Host OS Kernel) به همراه قابلیتهای Namespaces و Cgroups برای ایزولهسازی پروسهها استفاده میکنند. | |
| <div class="key-point"> | |
| <strong>نکته طلایی برای استاد:</strong> داکر به جای مجازیسازی سختافزار (Hardware Virtualization)، مجازیسازی در لایه سیستمعامل (OS-level Virtualization) انجام میدهد؛ به همین دلیل حجم ایمیجها مگابایتی، مصرف رم در حد پروسه و زمان بوت آنی است. | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Q2 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۲: تفاوت Docker Image و Docker Container چیست؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| ایمیج (Image) یک الگوی غیرقابل تغییر (Immutable)، فقط خواندنی (Read-Only) و چندلایهای است که شامل کدهای کامپایل شده، وابستگیها و تنظیمات اجرا است (مانند Class در برنامهنویسی). کانتینر (Container) نمونه در حال اجرای یک Image است (مانند Object) که داکر با اجرای آن، یک لایه قابل نوشتن (Writable Container Layer) روی لایههای فقط خواندنی ایمیج میافزاید. | |
| </div> | |
| </div> | |
| <!-- Q3 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۳: چرا در فرانتاند از Multi-stage Docker build استفاده کردید؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| زیرا برای اجرای فرانتاند در پروداکشن، به محیط سنگین Node.js، فایلهای sours-code و پکیجهای توسعه نیازی نیست. در <strong>Stage 1 (Node 20 Alpine)</strong> دستور <code>yarn build</code> اجرا شده و فایلهای بهینهشده استاتیک درون پوشه <code>dist</code> ساخته میشوند. در <strong>Stage 2 (Nginx 1.27 Alpine)</strong> تنها فایلهای پوشه <code>dist</code> به Nginx منتقل میشوند. | |
| <div class="key-point"> | |
| <strong>نتیجه:</strong> حذف کامل Node.js از پروداکشن، کاهش حجم ایمیج از 400MB به 22MB و امنیت بالا در عدم لو رفتن سورسکد خام. | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Q4 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۴: چرا دستور yarn dev یا npm start برای محیط پروداکشن مناسب نیست؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| زیرا سرورهای توسعه جهت کارهای لایو (HMR) طراحی شدهاند؛ کدها را مینیفای و فشرده نمیکنند، حافظه بالای RAM توسط نودجیاس اشغال میشود و سرعت سرو فایل استاتیک آنها بسیار کندتر از وبسرورهای واقعی مانند Nginx است. | |
| </div> | |
| </div> | |
| <!-- Q5 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۵: ریورس پروکسی (Reverse Proxy) چیست و Nginx چه نقشی دارد؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| ریورس پروکسی سروری است که سمت سرور قرار گرفته و درخواستهای مرورگر را دریافت کرده و به کانتینرهای مربوطه هدایت میکند. Nginx به عنوان **Single Entry Point** روی پورت 80 عمل میکند: | |
| <ul> | |
| <li>درخواستهای <code>/api/</code> را به <code>http://backend:9092/api/</code> پروکسی میکند.</li> | |
| <li>درخواستهای WebSocket <code>/ws</code> را با ارسال هدرهای <code>Upgrade</code> ارتقا میدهد.</li> | |
| <li>فایلهای استاتیک React را با فشردهسازی Gzip سرو میکند.</li> | |
| <li>با <code>try_files $uri $uri/ /index.html</code> مسیرهای React Router را هدایت میکند.</li> | |
| </ul> | |
| </div> | |
| </div> | |
| <!-- Q6 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۶: چرا در Stage 2 بکاند از JRE استفاده کردید نه JDK؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| در مرحله اول (Stage 1) از <code>maven:3.9-eclipse-temurin-17</code> که دارای JDK کامل و کامپایلر <code>javac</code> است برای کامپایل کد جاوا استفاده شد. اما در مرحله دوم (Stage 2) فقط به محیط اجرای جاوا (<strong>JRE 17</strong>) نیاز است. این کار حجم ایمیج را کم کرده و سطوح حمله امنیتی را به حداقل میرساند. | |
| </div> | |
| </div> | |
| <!-- Q7 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۷: چه تدابیر امنیتی در کانتینر بکاند در نظر گرفته شده است؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| <ol> | |
| <li><strong>عدم اجرا با Root:</strong> پروسه با کاربر دسترسی محدود <code>appuser</code> اجرا میشود تا در صورت آسیبپذیری، مهاجم به Host دسترسی پیدا نکند.</li> | |
| <li><strong>مدیریت حافظه JVM:</strong> تنظیم <code>-XX:+UseContainerSupport</code> و <code>-XX:MaxRAMPercentage=75.0</code> تا JVM بیش از حد مجاز رم کانتینر را مصرف نکرده و کرش OOM رخ ندهد.</li> | |
| <li><strong>حفاظت از کلیدها:</strong> ذخیره تمام Secretها در فایل `.env` و قرار دادن آن در `.gitignore`.</li> | |
| </ol> | |
| </div> | |
| </div> | |
| <!-- Q8 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۸: ماهیت Ephemeral کانتینرها چیست و چگونه دادههای دیتابیس حفظ میشوند؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| کانتینرها موقتی (Ephemeral) هستند و با حذف کانتینر، لایه Writable آن پاک میشود. با استفاده از <strong>Docker Volume</strong>، یک حافظه ماندگار از سیستم میزبان در مسیر <code>/var/lib/mysql</code> کانتینر MySQL مونت گردیده است تا دادهها با بازسازی کانتینر دستنخورده باقی بمانند. | |
| </div> | |
| </div> | |
| <!-- Q9 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۹: تفاوت Named Volume و Bind Mount چیست؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| <strong>Named Volume</strong> (مانند <code>db-data:/var/lib/mysql</code>) توسط خود موتور داکر مدیریت شده، عملکرد بالایی دارد و مناسب پایگاهداده در پروداکشن است. <strong>Bind Mount</strong> مستقیم یک پوشه از سیستم میزبان را به کانتینر وصل میکند و برای تغییرات زنده کد در محیط توسعه کاربرد دارد. | |
| </div> | |
| </div> | |
| <!-- Q10 --> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال ۱۰: کشف نام سرویسها (Service Discovery) در Compose چگونه کار میکند؟</div> | |
| <div class="qa-body"> | |
| <strong>پاسخ کامل:</strong> | |
| داکر دارای یک <strong>Embedded DNS Server</strong> درون شبکههای اختصاصی Bridge (مانند <code>ierepo-network</code>) است. وقتی کانتینر Nginx آدرس <code>http://backend:9092</code> را فراخوانی میکند، داکر نام <code>backend</code> را اتوماتیک به آدرس IP متغیر کانتینر بکاند ترجمه میکند. | |
| </div> | |
| </div> | |
| </div> | |
| </body> | |
| </html> | |
Xet Storage Details
- Size:
- 13.2 kB
- Xet hash:
- 48a8c639a99709a54bc76e76855785360210609bf903ef5bc703e3ab55ae3907
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.