این آزمون هر ۸ درس بخش «شبکه و Compose» را میسنجد. جواب هر سؤال همان لحظه با توضیح نشان داده میشود و نتیجهات در همین مرورگر ذخیره میشود (پیشرفت من).
کدام درایور شبکه کانتینر را روی شبکهی خود میزبان قرار میدهد (بدون جداسازی شبکه)؟
با host، کانتینر IP و پورتهای میزبان را مستقیم استفاده میکند.
تفاوت اصلی شبکهی bridge سفارشی با bridge پیشفرض؟
روی bridge پیشفرض resolve با نام کار نمیکند.
آدرس DNS داخلی داکر داخل کانتینر روی شبکهی سفارشی؟
resolver داخلی همان است.
اگر چند کانتینر یک --network-alias مشترک داشته باشند، resolve آن اسم…
یک load balancing ساده در سطح DNS.
چرا IP کانتینر را در تنظیمات اپ نمینویسیم؟
DNS نام را به IP فعلی میرساند.
در فایل Compose، سرویسها بهطور پیشفرض…
برای ایزولهسازی شبکهی سفارشی تعریف کن.
تفاوت docker compose down و down -v؟
بدون -v دادهی volume میماند.
build: ./app در سرویس یعنی…
بعد از تغییر کد با up --build دوباره بساز.
${PORT:-8080} یعنی…
برای خطا دادن از ${PORT:?پیام} استفاده کن.
فایل .env در کنار compose.yaml…
این دو مفهوم را قاطی نکن.
سرویسی با profiles: [dev] چه زمانی بالا میآید؟
یا با COMPOSE_PROFILES=dev.
depends_on: [db] (شکل ساده) چه تضمینی میدهد؟
برای آماده بودن: healthcheck + condition: service_healthy.
اگر کانتینری unhealthy شود، داکر (بدون ابزار دیگر) چه میکند؟
واکنش به سلامت کار ابزارهای هماهنگی است.
برای اجرای یک migration یکبار با همان تنظیمات سرویس؟
کانتینر تازه و یکبارمصرف.
چرا nginx بعد از ساخت دوبارهی کانتینر app گاهی 502 میدهد؟
با resolver داخلی داکر و متغیر در proxy_pass حل میشود.
یک پروژهی Compose با نام lxch4 بساز که این شرایط را داشته باشد:
۱. سرویس redis (redis:alpine) با healthcheck (redis-cli ping)، یک volume نامدار برای /data و فقط روی شبکهی backend.
۲. سرویس web (nginx:alpine) فقط روی شبکهی frontend با پورت ${WEB_PORT:-8396}.
۳. سرویس tools (redis:alpine) در پروفایل dev، روی شبکهی backend، که فقط وقتی redis سالم است شروع شود.
۴. نشان بده: (الف) web نمیتواند redis را resolve کند؛ (ب) با docker compose --profile dev run --rm tools redis-cli -h redis set k v یک مقدار بنویسی و بعد از down (بدون -v) و بالا آمدن دوباره همان مقدار را بخوانی؛ (ج) با WEB_PORT=8397 در docker compose config پورت منتشرشده ۸۳۹۷ است.
راهنمایی
برای (ب) بعد از down دوباره up -d --wait redis بزن. برای (الف) از docker compose exec -T web getent hosts redis استفاده کن. برای (ج) خروجی config را با grep published فیلتر کن.
راهحل
mkdir -p ch4 && cd ch4cat > compose.yaml <<'LXEOF'name: lxch4services: redis: image: redis:alpine volumes: - rdata:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 1s retries: 10 networks: [backend] web: image: nginx:alpine ports: - "${WEB_PORT:-8396}:80" networks: [frontend] tools: image: redis:alpine profiles: [dev] depends_on: redis: condition: service_healthy networks: [backend]networks: frontend: backend:volumes: rdata:LXEOFdocker compose up -d --wait >/dev/null 2>&1docker compose ps --format '{{.Service}}: {{.State}} {{.Health}}' | sortecho "الف) web به redis: $(docker compose exec -T web sh -c 'getent hosts redis >/dev/null && echo resolve-شد || echo resolve-نمیشود')"docker compose --profile dev run --rm -T tools redis-cli -h redis set k v 2>/dev/null | tail -1docker compose down 2>&1 | grep -c Removed | sed 's/^/ب) حذفشدهها: /'docker compose up -d --wait redis >/dev/null 2>&1echo "ب) بعد از down و up: $(docker compose --profile dev run --rm -T tools redis-cli -h redis get k 2>/dev/null | tail -1)"echo "ج) $(WEB_PORT=8397 docker compose config | grep published)"docker compose --profile dev down -v >/dev/null 2>&1redis: running healthyweb: runningالف) web به redis: resolve-نمیشودOKب) حذفشدهها: 4ب) بعد از down و up: vج) published: "8397"