رفتن به محتوا
LoopX

آزمون بخش ۴: شبکه و Compose

این آزمون هر ۸ درس بخش «شبکه و Compose» را می‌سنجد. جواب هر سؤال همان لحظه با توضیح نشان داده می‌شود و نتیجه‌ات در همین مرورگر ذخیره می‌شود (پیشرفت من).

؟ آزمون بخش ۴
  1. کدام درایور شبکه کانتینر را روی شبکه‌ی خود میزبان قرار می‌دهد (بدون جداسازی شبکه)؟

  2. تفاوت اصلی شبکه‌ی bridge سفارشی با bridge پیش‌فرض؟

  3. آدرس DNS داخلی داکر داخل کانتینر روی شبکه‌ی سفارشی؟

  4. اگر چند کانتینر یک --network-alias مشترک داشته باشند، resolve آن اسم…

  5. چرا IP کانتینر را در تنظیمات اپ نمی‌نویسیم؟

  6. در فایل Compose، سرویس‌ها به‌طور پیش‌فرض…

  7. تفاوت docker compose down و down -v؟

  8. build: ./app در سرویس یعنی…

  9. ${PORT:-8080} یعنی…

  10. فایل .env در کنار compose.yaml…

  11. سرویسی با profiles: [dev] چه زمانی بالا می‌آید؟

  12. depends_on: [db] (شکل ساده) چه تضمینی می‌دهد؟

  13. اگر کانتینری unhealthy شود، داکر (بدون ابزار دیگر) چه می‌کند؟

  14. برای اجرای یک migration یک‌بار با همان تنظیمات سرویس؟

  15. چرا nginx بعد از ساخت دوباره‌ی کانتینر app گاهی 502 می‌دهد؟

🏁 چالش: Compose با شبکه، پروفایل و داده‌ی ماندگارسخت

یک پروژه‌ی 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 فیلتر کن.

راه‌حل
Terminal window
mkdir -p ch4 && cd ch4
cat > compose.yaml <<'LXEOF'
name: lxch4
services:
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:
LXEOF
docker compose up -d --wait >/dev/null 2>&1
docker compose ps --format '{{.Service}}: {{.State}} {{.Health}}' | sort
echo "الف) 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 -1
docker compose down 2>&1 | grep -c Removed | sed 's/^/ب) حذف‌شده‌ها: /'
docker compose up -d --wait redis >/dev/null 2>&1
echo "ب) بعد از 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>&1
خروجی
redis: running healthy
web: running
الف) web به redis: resolve-نمی‌شود
OK
ب) حذف‌شده‌ها: 4
ب) بعد از down و up: v
ج) published: "8397"