این آزمون هر ۱۲ درس بخش «مبانی داکر» را میسنجد. جواب هر سؤال همان لحظه با توضیح نشان داده میشود و نتیجهات در همین مرورگر ذخیره میشود (پیشرفت من). اگر جایی را اشتباه زدی، به درس مربوطه برگرد.
کانتینر دقیقاً چیست؟
کانتینر سیستمعامل مهمان ندارد؛ پروسهای است که با ویژگیهای هسته جدا شده.
برای حدود ۵۰٪ یک هستهی CPU چه چیزی مینویسی؟
گزینهی --cpus در cgroup به شکل cpu.max (50000 100000) اعمال میشود.
در معماری داکر، چه کسی با registry حرف میزند و image را pull میکند؟
CLI فقط درخواست را به daemon میفرستد.
بعد از usermod -aG docker $USER هنوز permission denied میگیری. چرا؟
logout و login دوباره یا newgrp docker.
کلید تنظیم میرور در daemon.json چیست و بعد از تغییر چه باید کرد؟
daemon فقط موقع شروع یا reload فایل را میخواند.
فرق tag و digest؟
برای تکرارپذیری مطلق از image@sha256:... استفاده کن.
بعد از docker stop و docker start، فایلهایی که داخل کانتینر ساخته بودی…
لایهی قابلنوشتن همان کانتینر با stop/start میماند.
برای دیدن زندهی خروجی یک کانتینر کدام دستور؟
docker logs -f مثل tail -f است.
در -p 127.0.0.1:8080:80 چه اتفاقی میافتد؟
آدرس loopback اول آمده است.
کدام برای دیتابیسی که دادهاش باید با حذف کانتینر بماند مناسب است؟
volume مستقل از عمر کانتینر زندگی میکند.
چرا متغیر محیطی برای رازهای حساس کافی نیست؟
هر کس به inspect یا exec دسترسی دارد مقدار را میبیند.
کدام دستور میتواند دادهی volume های نامدار را برای همیشه پاک کند؟
همهی 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 به کلاینت بده.
راهحل
mkdir -p web && echo "<h1>چالش بخش ۲</h1>" > web/index.htmldocker run -d --name lx-ch-web -p 8340:80 -v "$(pwd)/web:/usr/share/nginx/html:ro" nginx:alpine >/dev/nullprintf 'MYSQL_ROOT_PASSWORD=pw\nMYSQL_DATABASE=app\n' > db.envdocker run -d --name lx-ch-db --env-file db.env -v lx-ch-data:/var/lib/mysql mysql:8.4 >/dev/nullfor i in $(seq 1 40); do docker logs lx-ch-db 2>&1 | grep -q "ready for connections.*port: 3306" && break; sleep 2; donedocker 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 Warningsleep 1; curl -s localhost:8340docker rm -f lx-ch-db >/dev/nulldocker run -d --name lx-ch-db2 --env-file db.env -v lx-ch-data:/var/lib/mysql mysql:8.4 >/dev/nullfor i in $(seq 1 40); do docker logs lx-ch-db2 2>&1 | grep -q "ready for connections.*port: 3306" && break; sleep 2; donedocker exec -e MYSQL_PWD=pw lx-ch-db2 mysql -uroot -N -e "SELECT n FROM app.t" 2>&1 | grep -v Warningdocker rm -f lx-ch-web lx-ch-db2 >/dev/nulldocker volume rm lx-ch-data<h1>چالش بخش ۲</h1>42lx-ch-data