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

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

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

؟ آزمون بخش ۵
  1. کلید تنظیم میرور در daemon.json چیست؟

  2. برای برداشتن میرور تنظیم‌شده چه باید کرد؟

  3. خطای «not found» / «manifest unknown» هنگام pull یعنی…

  4. خطای «no such host» روی نام registry یعنی…

  5. خطای «server gave HTTP response to HTTPS client» یعنی…

  6. خروجی curl با کد خروج 6 یعنی…

  7. digest برای چه کاری از tag بهتر است؟

  8. چرا export HTTPS_PROXY در ترمینال docker pull را درست نمی‌کند؟

  9. بعد از تغییر کلید proxies در daemon.json چه لازم است؟

  10. برای proxy در زمان build؟

  11. no-proxy برای چیست؟

  12. registry با REGISTRY_PROXY_REMOTEURL چه کاری می‌کند؟

  13. تفاوت docker save و docker export؟

  14. یک‌خطی انتقال بدون فایل میانی به سرور؟

  15. مهم‌ترین چیزی که قبل از بردن image به سرور باید بررسی کنی؟

🏁 چالش: رساندن image به سرور بدون registryسخت

یک 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 ... کمک بگیر.

راه‌حل
Terminal window
docker rm -f lx-ch5-srv >/dev/null 2>&1
mkdir -p ch5 && printf 'FROM alpine\nRUN echo "سلام از سرور بدون registry" > /msg\nCMD ["cat", "/msg"]\n' > ch5/Dockerfile
docker build -q -t lx-ch5:1.0 ch5 >/dev/null
docker run -d --privileged --name lx-ch5-srv -e DOCKER_TLS_CERTDIR= docker:dind >/dev/null
until docker exec lx-ch5-srv docker info >/dev/null 2>&1; do sleep 1; done
echo "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.0
docker 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/null
خروجی
image ها روی سرور قبل از انتقال: 0
Loaded image: lx-ch5:1.0
شناسه‌ی image در دو طرف یکی است
سلام از سرور بدون registry
lookup registry.invalid: no such host

خطای آخر no such host است: مشکل از DNS (نام registry)، نه از tag یا دسترسی.