این آزمون سه درس بخش «داکر در ایران» (محدودیتها و خطاها، proxy و registry، انتقال آفلاین) و درس «تنظیم میرور» از بخش نصب را میسنجد. جواب هر سؤال همان لحظه با توضیح نشان داده میشود و نتیجهات در همین مرورگر ذخیره میشود (پیشرفت من).
کلید تنظیم میرور در daemon.json چیست؟
فقط برای image های Docker Hub است.
برای برداشتن میرور تنظیمشده چه باید کرد؟
حذف کلید یا فایل، تنظیم قبلی را در daemon پاک نمیکند.
خطای «not found» / «manifest unknown» هنگام pull یعنی…
جواب دادن registry یعنی شبکه سالم است.
خطای «no such host» روی نام registry یعنی…
غلط تایپی در آدرس یا مشکل DNS.
خطای «server gave HTTP response to HTTPS client» یعنی…
TLS بگذار؛ insecure-registries فقط برای شبکهی خصوصی.
خروجی curl با کد خروج 6 یعنی…
۶ DNS، ۷ اتصال رد شد، ۲۸ timeout.
digest برای چه کاری از tag بهتر است؟
tag قابل جابهجایی است؛ digest هش محتواست.
چرا export HTTPS_PROXY در ترمینال docker pull را درست نمیکند؟
proxy باید برای daemon تنظیم شود.
بعد از تغییر کلید proxies در daemon.json چه لازم است؟
با docker info تأیید کن.
برای proxy در زمان build؟
ARG های proxy پیشفرض در تاریخچهی image ثبت نمیشوند.
no-proxy برای چیست؟
مثل registry داخلی یا localhost.
registry با REGISTRY_PROXY_REMOTEURL چه کاری میکند؟
میرور شخصی؛ در daemon با registry-mirrors معرفی میشود.
تفاوت docker save و docker export؟
برای انتقال image از save/load.
یکخطی انتقال بدون فایل میانی به سرور؟
میتوان gzip هم در میان گذاشت.
مهمترین چیزی که قبل از بردن image به سرور باید بررسی کنی؟
نامطابق بودن معماری مشکل بعدی در اجراست.
یک image را بدون registry و بدون ssh به یک «سرور» ایزوله برسان:
۱. یک image با اسم lx-ch5:1.0 بساز که از alpine ساخته شود، فایل /msg با متن دلخواه داشته باشد و CMD ["cat","/msg"].
۲. یک daemon آزمایشی جدا بساز: کانتینر lx-ch5-srv از docker:dind (با --privileged و DOCKER_TLS_CERTDIR=) که هیچ imageای ندارد.
۳. با یک خط لوله docker save ... | gzip | docker exec -i lx-ch5-srv sh -c 'gunzip | docker load' image را منتقل کن.
۴. ثابت کن شناسهی image در دو طرف یکی است و اجرایش روی سرور همان متن /msg را میدهد.
۵. روی همان سرور، با docker pull registry.invalid/x/y:1 یک خطای واقعی بساز و نوعش را از متن خطا تشخیص بده.
راهنمایی
برای مقایسهی شناسه از docker image inspect IMG --format '{{.Id}}' در دو طرف استفاده کن. روی سرور از docker exec lx-ch5-srv docker ... کمک بگیر.
راهحل
docker rm -f lx-ch5-srv >/dev/null 2>&1mkdir -p ch5 && printf 'FROM alpine\nRUN echo "سلام از سرور بدون registry" > /msg\nCMD ["cat", "/msg"]\n' > ch5/Dockerfiledocker build -q -t lx-ch5:1.0 ch5 >/dev/nulldocker run -d --privileged --name lx-ch5-srv -e DOCKER_TLS_CERTDIR= docker:dind >/dev/nulluntil docker exec lx-ch5-srv docker info >/dev/null 2>&1; do sleep 1; doneecho "image ها روی سرور قبل از انتقال: $(docker exec lx-ch5-srv docker images -q | wc -l | tr -d ' ')"docker save lx-ch5:1.0 | gzip | docker exec -i lx-ch5-srv sh -c 'gunzip | docker load'a=$(docker image inspect lx-ch5:1.0 --format '{{.Id}}')b=$(docker exec lx-ch5-srv docker image inspect lx-ch5:1.0 --format '{{.Id}}')[ "$a" = "$b" ] && echo "شناسهی image در دو طرف یکی است"docker exec lx-ch5-srv docker run --rm lx-ch5:1.0docker exec lx-ch5-srv docker pull registry.invalid/x/y:1 2>&1 | tail -1 | sed -E 's/ on [0-9.]+:53//' | grep -o 'lookup registry.invalid.*'docker rm -f lx-ch5-srv >/dev/null; docker rmi lx-ch5:1.0 >/dev/nullimage ها روی سرور قبل از انتقال: 0Loaded image: lx-ch5:1.0شناسهی image در دو طرف یکی استسلام از سرور بدون registrylookup registry.invalid: no such hostخطای آخر no such host است: مشکل از DNS (نام registry)، نه از tag یا دسترسی.