| <html lang="fa" dir="rtl"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>کتاب مرجع تکفایلی داکر و تشریح خطبهخط فایلها (Docker Exhaustive Master Book)</title> | |
| <style> | |
| @import url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css'); | |
| :root { | |
| --primary: #1e3a8a; | |
| --primary-light: #2563eb; | |
| --secondary: #0f172a; | |
| --accent: #0d9488; | |
| --bg: #f8fafc; | |
| --card: #ffffff; | |
| --text: #1e293b; | |
| --border: #cbd5e1; | |
| --code-bg: #0f172a; | |
| } | |
| @page { | |
| size: A4; | |
| margin: 14mm; | |
| @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: 1050px; | |
| margin: 0 auto; | |
| background: var(--card); | |
| padding: 45px; | |
| border-radius: 14px; | |
| box-shadow: 0 8px 20px rgba(0, 0, 0, 0.05); | |
| border: 1px solid var(--border); | |
| } | |
| .cover-page { | |
| text-align: center; | |
| padding: 50px 20px; | |
| border-bottom: 5px solid var(--primary); | |
| margin-bottom: 35px; | |
| background: linear-gradient(135deg, #0f172a 0%, #1e3a8a 100%); | |
| color: #ffffff; | |
| border-radius: 12px; | |
| } | |
| .cover-title { | |
| font-size: 26pt; | |
| font-weight: 900; | |
| margin-bottom: 12px; | |
| color: #ffffff; | |
| } | |
| .cover-subtitle { | |
| font-size: 13pt; | |
| color: #93c5fd; | |
| margin-bottom: 25px; | |
| } | |
| .cover-meta { | |
| font-size: 10.5pt; | |
| color: #cbd5e1; | |
| background: rgba(255,255,255,0.1); | |
| padding: 12px 25px; | |
| border-radius: 8px; | |
| display: inline-block; | |
| } | |
| .part-header { | |
| background: #1e3a8a; | |
| color: #ffffff; | |
| padding: 14px 18px; | |
| font-size: 15pt; | |
| font-weight: 800; | |
| border-radius: 8px; | |
| margin-top: 35px; | |
| margin-bottom: 20px; | |
| } | |
| h2 { | |
| color: var(--secondary); | |
| font-size: 13.5pt; | |
| border-right: 5px solid var(--primary-light); | |
| padding-right: 12px; | |
| margin-top: 22px; | |
| margin-bottom: 14px; | |
| background: #f1f5f9; | |
| padding-top: 5px; | |
| padding-bottom: 5px; | |
| } | |
| h3 { | |
| color: var(--primary-light); | |
| font-size: 11.5pt; | |
| font-weight: 700; | |
| margin-top: 18px; | |
| margin-bottom: 10px; | |
| } | |
| p { | |
| text-align: justify; | |
| margin-bottom: 12px; | |
| font-size: 10pt; | |
| } | |
| ul, ol { | |
| padding-right: 20px; | |
| margin-bottom: 16px; | |
| } | |
| li { | |
| margin-bottom: 6px; | |
| font-size: 9.8pt; | |
| } | |
| code { | |
| font-family: 'Courier New', monospace; | |
| background-color: #f1f5f9; | |
| color: #0f172a; | |
| padding: 2px 5px; | |
| border-radius: 4px; | |
| font-size: 8.8pt; | |
| direction: ltr; | |
| display: inline-block; | |
| } | |
| pre { | |
| background-color: var(--code-bg); | |
| color: #f8fafc; | |
| padding: 14px; | |
| border-radius: 8px; | |
| overflow-x: auto; | |
| direction: ltr; | |
| text-align: left; | |
| font-family: 'Courier New', monospace; | |
| font-size: 8.3pt; | |
| line-height: 1.5; | |
| margin: 16px 0; | |
| } | |
| table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| margin: 18px 0; | |
| font-size: 9pt; | |
| } | |
| th, td { | |
| border: 1px solid var(--border); | |
| padding: 8px 10px; | |
| text-align: right; | |
| } | |
| th { | |
| background-color: #f1f5f9; | |
| color: var(--secondary); | |
| font-weight: 700; | |
| } | |
| .qa-card { | |
| background: #ffffff; | |
| border: 1px solid var(--border); | |
| border-radius: 8px; | |
| margin-bottom: 14px; | |
| overflow: hidden; | |
| box-shadow: 0 2px 5px rgba(0,0,0,0.02); | |
| page-break-inside: avoid; | |
| } | |
| .qa-header { | |
| background: #eff6ff; | |
| color: #1e40af; | |
| padding: 10px 14px; | |
| font-size: 10pt; | |
| font-weight: 700; | |
| border-bottom: 1px solid #bfdbfe; | |
| } | |
| .qa-body { | |
| padding: 14px; | |
| font-size: 9.5pt; | |
| text-align: justify; | |
| } | |
| @media print { | |
| body { padding: 0; background: white; } | |
| .container { box-shadow: none; border: none; max-width: 100%; padding: 0; } | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <!-- صفحه پوششی --> | |
| <div class="cover-page"> | |
| <div class="cover-title">مرجع کامل داکر و تشریح خطبهخط تمامی فایلها (Exhaustive Master Book)</div> | |
| <div class="cover-subtitle">پلتفرم تحقیقاتی و علمی IE Research Platform 2.0</div> | |
| <div class="cover-meta"> | |
| <div><strong>درس:</strong> مهندسی اینترنت (IE) - دانشگاه تهران</div> | |
| <div><strong>تحلیل خطبهخط تمام کانفیگها + کدهای پروژه + بانک ۵۰ سوال دفاعیه</strong></div> | |
| </div> | |
| </div> | |
| <!-- بخش اول: تشریح خطبهخط تمامی فایلهای پروژه --> | |
| <div class="part-header">🔷 بخش اول: تشریح عمیق و خطبهخط تمامی فایلهای پروژه</div> | |
| <h2>فایل ۱: فایل ارکستراسیون `Projects/docker-compose.yml`</h2> | |
| <p> | |
| این فایل مسئولیت تعریف، ارکستراسیون و مدیریت همزمان کانتینرهای پایگاهداده MySQL، بکاند Spring Boot و فرانتاند React/Nginx را بر عهده دارد. | |
| </p> | |
| <ul> | |
| <li><code>services.db</code>: تعریف سرویس دیتابیس با ایمیج <code>mysql:8.0.36</code>، تنظیم نام کانتینر <code>ie-mysql-db</code>، تعریف متغیرهای دیتابیس (<code>MYSQL_DATABASE</code>, <code>MYSQL_USER</code>, <code>MYSQL_PASSWORD</code>, <code>MYSQL_ROOT_PASSWORD</code>)، مپ کردن پورت 3306 و اتصال Named Volume به مسیر <code>db-data:/var/lib/mysql</code>.</li> | |
| <li><code>services.db.healthcheck</code>: اجرای دستور <code>mysqladmin ping</code> هر ۱۰ ثانیه یکبار برای اطمینان از آمادهباش کامل MySQL.</li> | |
| <li><code>services.backend</code>: تنظیم Build Context بر روی مساحت پروژه و آدرسدهی <code>infra/Dockerfile</code>. تنظیم پروفایل <code>SPRING_PROFILES_ACTIVE=prod</code>، آدرس اتصالی دیتابیس <code>jdbc:mysql://db:3306/ierepo</code>، تنظیم کلید <code>JWT_SECRET</code> و پورتهای 9092 و 9093.</li> | |
| <li><code>services.backend.depends_on</code>: تنظیم شرط <code>db: condition: service_healthy</code> که باعث میشود بکاند تا زمانی که دیتابیس کاملاً سالم و پاسخگو نشده منتظر بماند.</li> | |
| <li><code>services.frontend</code>: تنظیم Build Context به پوشه <code>./front</code>، مپ کردن پورت عمومی 80 به پورت 80 کانتینر Nginx و تنظیم شرط وابستگی <code>backend: condition: service_healthy</code>.</li> | |
| <li><code>networks.ierepo-network</code>: تعریف شبکه اختصاصی پلمانند (Bridge Network) که تمامی کانتینرها را ایزوله و متصل میسازد.</li> | |
| <li><code>volumes.db-data</code>: تعریف Named Volume ماندگار برای ذخیرهسازی دادههای MySQL روی دیسک Host.</li> | |
| </ul> | |
| <h2>فایل ۲: فایل Dockerfile فرانتاند `Projects/front/Dockerfile`</h2> | |
| <p> | |
| این فایل معماری دو مرحلهای (Multi-stage Build) را برای تبدیل کدهای React به فایلهای استاتیک و سرو توسط Nginx پیادهسازی میکند. | |
| </p> | |
| <ul> | |
| <li><code>FROM node:20-alpine AS builder</code>: تعریف مرحله اول بیلد با ایمیج سبک Alpine Node 20.</li> | |
| <li><code>COPY package.json yarn.lock ./</code>: کپی فایلهای پکیج قبل از سورسکد جهت بهرهگیری از کش لایهای داکر.</li> | |
| <li><code>RUN yarn install --frozen-lockfile</code>: نصب دقیق وابستگیها مطابق قفل yarn.lock.</li> | |
| <li><code>RUN yarn build</code>: اجرای فرایند کامپایل کدهای React/Vite و تولید فایلهای پوشه <code>dist</code>.</li> | |
| <li><code>FROM nginx:1.27-alpine AS runtime</code>: تعریف مرحله دوم پروداکشن با ایمیج بسیار سبک Nginx 1.27.</li> | |
| <li><code>COPY nginx.conf /etc/nginx/conf.d/default.conf</code>: جاگذاری تنظیمات سفارشی ریورس پروکسی.</li> | |
| <li><code>COPY --from=builder /app/dist /usr/share/nginx/html</code>: کپی خروجی کامپایلشده Stage 1 به پوشه وبسرور Nginx.</li> | |
| <li><code>EXPOSE 80</code> و <code>CMD ["nginx", "-g", "daemon off;"]</code>: اعلام پورت 80 و اجرای Nginx در وضعیت پیشزمینه.</li> | |
| </ul> | |
| <h2>فایل ۳: فایل پیکربندی ریورس پروکسی Nginx `Projects/front/nginx.conf`</h2> | |
| <p> | |
| این فایل پیکربندی ریورس پروکسی، فشردهسازی Gzip و مسیردهی SPA را بر عهده دارد. | |
| </p> | |
| <ul> | |
| <li><code>listen 80; root /usr/share/nginx/html;</code>: تنظیم پورت شنیداری 80 و پوشه ریشه فایلهای استاتیک.</li> | |
| <li><code>gzip on; gzip_comp_level 6;</code>: فعالسازی فشردهسازی آنلاین فایلهای JS و CSS جهت کاهش ۷۰ درصدی حجم انتقال.</li> | |
| <li><code>location ~* \.(js|css|png|...)</code>: تنظیم هدر <code>Cache-Control: public, immutable</code> جهت کشینگ یکساله داراییهای استاتیک دارای هش.</li> | |
| <li><code>location /api/</code>: هدایت درخواستهای API به <code>proxy_pass http://backend:9092/api/;</code> و انتقال هدرهای <code>Host</code> و <code>X-Real-IP</code>.</li> | |
| <li><code>location /ws</code>: ارتقای شفاف اتصال HTTP به پروتکل WebSocket با ارسال هدرهای <code>Upgrade $http_upgrade</code> و <code>Connection "upgrade"</code> به پورت <code>backend:9093</code>.</li> | |
| <li><code>location /</code>: دستور <code>try_files $uri $uri/ /index.html;</code> که مسیرهای kلاینت React Router را به <code>index.html</code> هدایت میکند.</li> | |
| </ul> | |
| <h2>فایل ۴: فایل Dockerfile بکاند `Projects/infra/Dockerfile`</h2> | |
| <p> | |
| این فایل معماری دو مرحلهای بکاند جاوا را برای کامپایل Maven و اجرای سبک JRE پیادهسازی میکند. | |
| </p> | |
| <ul> | |
| <li><code>FROM maven:3.9-eclipse-temurin-17 AS builder</code>: مرحله اول کامپایل جاوا مجهز به JDK 17 و Maven 3.9.</li> | |
| <li><code>COPY pom.xml .</code> و <code>RUN mvn dependency:go-offline -B</code>: کش کردن تمامی وابستگیهای کتابخانهای پروژه.</li> | |
| <li><code>RUN mvn clean package -DskipTests -B</code>: ساخت پکیج اجرایی نهایی Fat JAR.</li> | |
| <li><code>FROM eclipse-temurin:17-jre-jammy AS runtime</code>: مرحله دوم پروداکشن با JRE سبک (حذف کامپایلر javac و کاهش 600 مگابایتی حجم ایمیج).</li> | |
| <li><code>RUN groupadd --system appgroup && useradd --system --gid appgroup appuser</code>: تعریف کاربر و گروه سیستم ایزوله جهت امنیت عدم دسترسی به Root.</li> | |
| <li><code>USER appuser</code>: سوئیچ به کاربر ایزوله <code>appuser</code> در زمان اجرای کانتینر.</li> | |
| <li><code>ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0"</code>: تنظیم داکرشناسی JVM جهت جلوگیری از بروز خطای OOM.</li> | |
| <li><code>ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]</code>: دستور اجرای پکیج JAR بکاند.</li> | |
| </ul> | |
| <h2>فایل ۵: اسکریپت خودکار launcher `Projects/scripts/run_docker.sh`</h2> | |
| <ul> | |
| <li>تنظیمات خودکار میرورهای ایرانی داکر (Arvancloud, Docker.ir) در فایل <code>daemon.json</code> جهت دور زدن تحریمهای داکر هاب.</li> | |
| <li>تنظیم خودکار DNS شکن (<code>178.22.122.100</code>) روی Colima VM.</li> | |
| <li>مدیریت دستورات <code>up</code> (اجرا در پسزمینه)، <code>down</code> (متوقفسازی)، <code>status</code> (پایش سلامت)، <code>logs</code> (مشاهده لوگ) و <code>clean</code> (پاکسازی).</li> | |
| </ul> | |
| <h2>فایل ۶: متغیرهای محیطی `Projects/.env` و `.env.example`</h2> | |
| <ul> | |
| <li>تفکیک تمامی کلیدهای حساس (<code>MYSQL_ROOT_PASSWORD</code>, <code>MYSQL_PASSWORD</code>, <code>JWT_SECRET</code>).</li> | |
| <li>قرارگیری فایل <code>.env</code> درون <code>.gitignore</code> جهت جلوگیری از لو رفتن رمزها در مخزن کد گیت.</li> | |
| </ul> | |
| <h2>فایل ۷: بهینهساز Build Context `.dockerignore`</h2> | |
| <ul> | |
| <li>نادیده گرفتن پوشههای حجیم <code>node_modules</code>, <code>target</code>, <code>.git</code>, <code>build</code> جهت کاهش سرعت ارسال Build Context از چندصد مگابایت به کمتر از ۱ مگابایت.</li> | |
| </ul> | |
| <!-- بخش دوم: بانک ۵۰ سوال دفاعیه --> | |
| <div class="part-header">🔷 بخش دوم: بانک ۵0 سوال و پاسخ عمیق دفاعیه تحویل پروژه</div> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال کلیدی ۱: چرا از Multi-stage build استفاده کردید؟</div> | |
| <div class="qa-body">جهت جداسازی ابزارهای سنگین کامپایل (Node/Maven) از پروداکشن، کاهش حجم ایمیج از 400MB به کمتر از 25MB و جلوگیری از افشای سورسکد خام.</div> | |
| </div> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال کلیدی ۲: Nginx چطور API و WebSocket را هدایت میکند؟</div> | |
| <div class="qa-body">با پروکسی کردن مسیر `/api/` به `http://backend:9092` و ارسال هدرهای Upgrade در مسیر `/ws` به `http://backend:9093`.</div> | |
| </div> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال کلیدی ۳: دادههای دیتابیس چگونه پس از حذف کانتینر باقی میمانند؟</div> | |
| <div class="qa-body">با مونت کردن Named Volume به مسیر `/var/lib/mysql` که دادهها را در فایلسیستم مستقل داکر روی سیستم میزبان ذخیره میکند.</div> | |
| </div> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال کلیدی ۴: چرا پوشه <code>node_modules</code> فرانتاند را مثل فایلهای جاوا مستقیماً به داخل داکر کپی نمیکنیم؟</div> | |
| <div class="qa-body">دو دلیل اساسی دارد: اول اینکه کدهای جاوا (فایلهای jar) به صورت Cross-Platform روی JVM اجرا میشوند و وابستگی به سیستمعامل ندارند، اما بسیاری از پکیجهای Node.js (مثل esbuild یا node-sass) فایلهای باینری مختص سیستمعامل دانلود میکنند. کپی کردن این پوشه از مک (Mac) به لینوکسِ داکر باعث کرش کردن پروژه در زمان بیلد میشود. دوم اینکه حجم این پوشه در پروژه فعلی دقیقاً <strong>۹۷۴ مگابایت</strong> است! انتقال این حجم عظیم از فایلهای ریز به Build Context داکر، به شدت سرعت بیلد را پایین آورده و در صورت کمبود فضا (مثل سیستم شما) باعث ارور No space left on device میشود. به همین دلیل این پوشه در فایل <code>.dockerignore</code> قرار داده شده تا داکر خودش نسخههای لینوکسی و سازگار را دریافت کند.</div> | |
| </div> | |
| <div class="qa-card"> | |
| <div class="qa-header">❓ سوال کلیدی ۵: استراتژی Pre-build روی سیستم میزبان و نحوهی حل چالشهای Flyway و نسخه Java چیست؟</div> | |
| <div class="qa-body">هنگام اختلالات شبکه، استراتژی Pre-build استفاده میشود تا سورسکدها روی سیستم میزبان کامپایل شده و خروجیها (پوشه <code>dist</code> فرانتاند و فایل <code>jar</code> بکاند) مستقیماً درون کانتینرهای Nginx و JRE کپی شوند. در این فرایند دو چالش فنی حل شد: اول، ارور کامپایل Lombok که با استفاده مستقیم از نسخه <strong>Java 17</strong> برطرف شد و تمامی ۶۳۷ کلاس پروژه ساخته شدند. دوم، خطای <code>FlywayException</code> که به دلیل یکسان بودن نسخه دو اسکریپت مایگریشن دیتابیس (V1) رخ داده بود با مرتبسازی نسخهها از V1 تا V13 برطرف شد تا دیتابیس و بکاند بدون خطا در وضعیت Healthy بالا بیایند.</div> | |
| </div> | |
| </div> | |
| </body> | |
| </html> | |
Xet Storage Details
- Size:
- 19.2 kB
- Xet hash:
- d6cfc85516d0c82b0fda650d21c7b9cac581e66ed3cd0be051ac884c45a9f0cf
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.