پرش به مطلب اصلی

داکر میرور

ابزار انتخاب خودکار سریع‌ترین میرور داکر ایرانی برای دستورات docker pull و docker compose up

در این سند


مشکل چیست؟

دسترسی مستقیم به Docker Hub از داخل ایران معمولاً کند یا غیرممکن است. این ابزار به‌صورت خودکار و شفاف:

  1. بهترین و سریع‌ترین میرور ایرانی قابل دسترس را پیدا می‌کند
  2. تنظیمات Docker daemon را به‌روز می‌کند
  3. دستور اصلی شما را اجرا می‌کند
بدون نیاز به تغییر در گردش کار

هیچ تغییری در گردش کار موجود Docker شما لازم نیست. ابزار در پس‌زمینه دستورات شما را پوشش می‌دهد.


پیش‌نیازها

ابزاروضعیتنحوه نصب
curlضروریدر اکثر سیستم‌ها پیش‌نصب است
jqپیشنهادیbrew install jq یا sudo apt install jq
python3جایگزین jqدر اکثر سیستم‌ها پیش‌نصب است
هشدار

اگر نه jq و نه python3 نصب باشد، ابزار یک هشدار نمایش می‌دهد و دستور بدون پیکربندی میرور اجرا می‌شود.


نصب

از ریشه پروژه اجرا کنید:

نصب + فعال‌سازی فوری (بدون نیاز به ری‌استارت ترمینال)
source docker/setup_docker_mirrors.sh
چرا source؟

وقتی با bash اجرا می‌کنید، اسکریپت در یک پردازش فرزند (child process) اجرا شده و نمی‌تواند محیط شل فعلی شما را تغییر دهد. با source اسکریپت مستقیماً در شل فعلی اجرا شده و توابع بلافاصله فعال می‌شوند — بدون نیاز به ری‌استارت ترمینال.

اسکریپت نصب چه کاری انجام می‌دهد؟

مرحلهعمل
۱تشخیص شل — نوع شل شما را شناسایی می‌کند (zsh / bash / sh)
۲کپی فایل — توابع wrapper را به ~/.docker_mirror_functions.sh کپی می‌کند
۳تزریق — یک خط source به فایل RC شل شما اضافه می‌کند (مثلاً ~/.zshrc، ~/.bashrc)
۴فعال‌سازی خودکار — در صورت اجرا با source، توابع بلافاصله در شل فعلی فعال می‌شوند
اسکریپت idempotent است

اجرای مکرر اسکریپت نصب بی‌خطر است و خطوط تکراری ایجاد نمی‌کند.


نحوه استفاده

استفاده عادی — بدون نیاز به تغییر

پس از نصب، دقیقاً مثل قبل از Docker استفاده کنید. هیچ تغییری در دستورات لازم نیست:

دستوراتی که به‌صورت خودکار از بهترین میرور استفاده می‌کنند
docker pull nginx:latest
docker pull redis:7-alpine
docker compose up -d
docker compose pull
docker-compose up # سینتکس نسخه قدیمی هم پشتیبانی می‌شود

دستورات بدون تأثیر

سایر دستورات Docker بدون هیچ سربار مستقیماً اجرا می‌شوند:

دستورات pass-through (بدون سربار میرور)
docker ps
docker logs my-container
docker exec -it app bash
docker images
docker network ls

لیست میرورها

میرورها به ترتیب اولویت تست می‌شوند:

اولویتارائه‌دهندهآدرس
۱لیاراdocker-mirror.liara.ir
۲ابرآروانdocker.arvancloud.ir
۳مُبین‌هاستdocker.mobinhost.com

منطق انتخاب

  • هر میرور با ارسال درخواست HTTP به endpoint /v2/ تست می‌شود
  • پاسخ 200 یا 401 = میرور فعال است
  • میرور با کمترین زمان پاسخ انتخاب می‌شود
  • اگر هیچ میروری در دسترس نباشد → دستور مستقیماً از Docker Hub اجرا می‌شود

کش (Cache)

برای جلوگیری از بررسی مکرر میرورها، نتیجه به مدت ۵ دقیقه کش می‌شود:

ویژگیمقدار
فایل کش~/.docker_mirror_cache
مدت پیش‌فرض300 ثانیه (۵ دقیقه)
نکته

دستورات متوالی docker pull در طول زمان TTL از میرور کش‌شده بدون بررسی مجدد استفاده می‌کنند.


تنظیمات پیشرفته

تمام تنظیمات از طریق متغیرهای محیطی قابل تغییر هستند. آن‌ها را به فایل RC شل خود اضافه کنید:

~/.zshrc — تنظیمات پیشرفته
# مدت اعتبار کش (پیش‌فرض: ۳۰۰ ثانیه = ۵ دقیقه)
export DOCKER_MIRROR_CACHE_TTL=600

# مهلت زمانی تست هر میرور (پیش‌فرض: ۴ ثانیه)
export DOCKER_MIRROR_CURL_TIMEOUT=3

# فعال‌سازی لاگ‌های دیباگ (پیش‌فرض: غیرفعال)
export DOCKER_MIRROR_VERBOSE=1

# مسیر فایل daemon.json داکر (پیش‌فرض: /etc/docker/daemon.json)
export DOCKER_MIRROR_DAEMON_JSON=/etc/docker/daemon.json

# مسیر فایل کش (پیش‌فرض: ~/.docker_mirror_cache)
export DOCKER_MIRROR_CACHE_FILE=$HOME/.docker_mirror_cache

حالت دیباگ

برای مشاهده فرآیند انتخاب میرور در زمان واقعی:

اجرای verbose یک‌بار
DOCKER_MIRROR_VERBOSE=1 docker pull alpine
# خروجی نمونه:
# [docker-mirror] Checking Iranian registry mirrors...
# [docker-mirror] Probing https://docker-mirror.liara.ir ...
# [docker-mirror] -> https://docker-mirror.liara.ir responded in 245ms
# [docker-mirror] Probing https://docker.arvancloud.ir ...
# [docker-mirror] -> https://docker.arvancloud.ir responded in 380ms
# [docker-mirror] Probing https://docker.mobinhost.com ...
# [docker-mirror] -> https://docker.mobinhost.com unreachable
# [docker-mirror] Selected mirror: https://docker-mirror.liara.ir
# [docker-mirror] Applied mirror: https://docker-mirror.liara.ir

حذف (Uninstall)

حذف wrapper داکر میرور
bash docker/setup_docker_mirrors.sh --remove

این دستور:

  • خط source را از فایل‌های RC شل حذف می‌کند
  • فایل ~/.docker_mirror_functions.sh را پاک می‌کند
  • فایل کش ~/.docker_mirror_cache را پاک می‌کند
daemon.json به حالت قبل بازنمی‌گردد

daemon.json داکر به‌صورت خودکار بازنمی‌گردد. در صورت نیاز، پس از حذف /etc/docker/daemon.json را به‌صورت دستی ویرایش کنید.


نکات مهم

دسترسی sudo

تغییر فایل /etc/docker/daemon.json و reload سرویس Docker نیاز به دسترسی sudo دارد. ممکن است اولین بار پس از یک cache miss، رمز عبور سیستم پرسیده شود.

سازگاری با شل‌ها

شلفایل تنظیماتوضعیت
zsh~/.zshrc✅ پشتیبانی می‌شود
bash~/.bashrc / ~/.bash_profile✅ پشتیبانی می‌شود
sh / dash / ksh~/.profile✅ پشتیبانی می‌شود

سفارشی‌سازی لیست میرورها

برای افزودن یا مرتب‌سازی مجدد میرورها، فایل ~/.docker_mirror_functions.sh را ویرایش کنید:

~/.docker_mirror_functions.sh — لیست میرور سفارشی
DOCKER_MIRROR_LIST=(
"https://docker-mirror.liara.ir"
"https://docker.arvancloud.ir"
"https://docker.mobinhost.com"
"https://your-custom-mirror.example.com" # میرور سفارشی اضافه کنید
)

چگونه کار می‌کند؟

┌─────────────────────────┐
│ docker pull nginx │ دستور را تایپ می‌کنید
└───────────┬─────────────┘

┌──────▼───────┐
docker() │ تابع wrapper دستور را رهگیری می‌کند
│ wrapper │
└──────┬───────┘

┌──────▼────────────────┐
│ خواندن کش │ بررسی ~/.docker_mirror_cache (TTL: ۵ دقیقه)
└──────┬────────────────┘
│ cache miss
┌──────▼────────────────┐
│ تست میرورها │ curl /v2/ روی هر میرور
LiaraArvanMobin│ سریع‌ترین (HTTP 200/401) انتخاب می‌شود
└──────┬────────────────┘

┌──────▼────────────────┐
│ اعمال میرور │ ادغام jq در daemon.json
│ │ + reload Docker daemon
└──────┬────────────────┘

┌──────▼────────────────┐
│ اجرای دستور اصلی │ اجرای دستور اصلی docker pull
│ docker pull nginx │
└───────────────────────┘

ویژگی‌های ایمنی

موقعیتنحوه رسیدگی
daemon.json وجود نداردبه‌صورت خودکار ایجاد می‌شود
daemon.json JSON نامعتبر داردبکاپ به .bak.<timestamp> گرفته شده و به {} ریست می‌شود
هیچ میروری در دسترس نیستهشدار نمایش داده می‌شود، دستور از Docker Hub اجرا می‌شود
میرور از قبل فعال استاز نوشتن و reload daemon صرف‌نظر می‌شود
curl یا jq نصب نیستهشدار نمایش داده می‌شود، دستور بدون میرور اجرا می‌شود
docker ps، docker logs و ...pass-through بدون سربار

عیب‌یابی

مشکلراه‌حل
رمز عبور مکرراً پرسیده می‌شودقبل از سری دستورات sudo -v اجرا کنید
میرور انتخاب نمی‌شودDOCKER_MIRROR_VERBOSE=1 را فعال کرده و خروجی را بررسی کنید
خطای jq / pythonjq را نصب کنید: brew install jq
daemon.json خراب شدهفایل بکاپ با پسوند .bak.* را در /etc/docker/ بررسی کنید
پس از نصب کار نمی‌کنددوباره source docker/setup_docker_mirrors.sh اجرا کنید یا یک ترمینال جدید باز کنید

ساختار فایل‌ها

docker/
├── docker_mirror_functions.sh # توابع wrapper اصلی (کپی به ~/.docker_mirror_functions.sh)
├── setup_docker_mirrors.sh # اسکریپت نصب / حذف
├── DOCKER_MIRROR_FA.md # مستندات فارسی
└── DOCKER_MIRROR_EN.md # مستندات انگلیسی