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

آزمون بخش ۲: مبانی داکر

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

؟ آزمون بخش ۲
  1. کانتینر دقیقاً چیست؟

  2. برای حدود ۵۰٪ یک هسته‌ی CPU چه چیزی می‌نویسی؟

  3. در معماری داکر، چه کسی با registry حرف می‌زند و image را pull می‌کند؟

  4. بعد از usermod -aG docker $USER هنوز permission denied می‌گیری. چرا؟

  5. کلید تنظیم میرور در daemon.json چیست و بعد از تغییر چه باید کرد؟

  6. فرق tag و digest؟

  7. بعد از docker stop و docker start، فایل‌هایی که داخل کانتینر ساخته بودی…

  8. برای دیدن زنده‌ی خروجی یک کانتینر کدام دستور؟

  9. در -p 127.0.0.1:8080:80 چه اتفاقی می‌افتد؟

  10. کدام برای دیتابیسی که داده‌اش باید با حذف کانتینر بماند مناسب است؟

  11. چرا متغیر محیطی برای رازهای حساس کافی نیست؟

  12. کدام دستور می‌تواند داده‌ی volume های نام‌دار را برای همیشه پاک کند؟

🏁 چالش: وب‌سرور و دیتابیس ماندگارسخت

یک مینی‌سرویس کامل با آنچه در این بخش یاد گرفتی بساز:

۱. پوشه‌ی web با یک index.html بساز و با nginx روی پورت 8340 (نام lx-ch-web) فقط‌خواندنی و با bind mount سرو کن. ۲. یک فایل db.env با MYSQL_ROOT_PASSWORD=pw و MYSQL_DATABASE=app بساز و یک MySQL (lx-ch-db) با --env-file و یک named volume (lx-ch-data روی /var/lib/mysql) اجرا کن. داخلش یک جدول با یک سطر بساز. ۳. کانتینر دیتابیس را حذف کن و یکی تازه (lx-ch-db2) به همان volume وصل کن؛ ثابت کن سطر ماند. ۴. در آخر کانتینرها و volume را پاک کن.

راهنمایی

برای صبر تا آماده شدن MySQL، لاگ را برای عبارت ready for connections بررسی کن. رمز را با MYSQL_PWD به کلاینت بده.

راه‌حل
Terminal window
mkdir -p web && echo "<h1>چالش بخش ۲</h1>" > web/index.html
docker run -d --name lx-ch-web -p 8340:80 -v "$(pwd)/web:/usr/share/nginx/html:ro" nginx:alpine >/dev/null
printf 'MYSQL_ROOT_PASSWORD=pw\nMYSQL_DATABASE=app\n' > db.env
docker run -d --name lx-ch-db --env-file db.env -v lx-ch-data:/var/lib/mysql mysql:8.4 >/dev/null
for i in $(seq 1 40); do docker logs lx-ch-db 2>&1 | grep -q "ready for connections.*port: 3306" && break; sleep 2; done
docker exec -e MYSQL_PWD=pw lx-ch-db mysql -uroot -e "CREATE TABLE app.t (n INT); INSERT INTO app.t VALUES (42)" 2>&1 | grep -v Warning
sleep 1; curl -s localhost:8340
docker rm -f lx-ch-db >/dev/null
docker run -d --name lx-ch-db2 --env-file db.env -v lx-ch-data:/var/lib/mysql mysql:8.4 >/dev/null
for i in $(seq 1 40); do docker logs lx-ch-db2 2>&1 | grep -q "ready for connections.*port: 3306" && break; sleep 2; done
docker exec -e MYSQL_PWD=pw lx-ch-db2 mysql -uroot -N -e "SELECT n FROM app.t" 2>&1 | grep -v Warning
docker rm -f lx-ch-web lx-ch-db2 >/dev/null
docker volume rm lx-ch-data
خروجی
<h1>چالش بخش ۲</h1>
42
lx-ch-data