داکر میرور
ابزار انتخاب خودکار سریعترین میرور داکر ایرانی برای دستورات
docker pullوdocker compose up
در این سند
مشکل چیست؟
دسترسی مستقیم به Docker Hub از داخل ایران معمولاً کند یا غیرممکن است. این ابزار بهصورت خودکار و شفاف:
- بهترین و سریعترین میرور ایرانی قابل دسترس را پیدا میکند
- تنظیمات Docker daemon را بهروز میکند
- دستور اصلی شما را اجرا میکند
هیچ تغییری در گردش کار موجود Docker شما لازم نیست. ابزار در پسزمینه دستورات شما را پوشش میدهد.
پیشنیازها
| ابزار | وضعیت | نحوه نصب |
|---|---|---|
curl | ضروری | در اکثر سیستمها پیشنصب است |
jq | پیشنهادی | brew install jq یا sudo apt install jq |
python3 | جایگزین jq | در اکثر سیستمها پیشنصب است |
اگر نه jq و نه python3 نصب باشد، ابزار یک هشدار نمایش میدهد و دستور بدون پیکربندی میرور اجرا میشود.
نصب
از ریشه پروژه اجرا کنید:
- پیشنهادی — Source (فعالسازی فوری)
- جایگزین — Bash (نیاز به ترمینال جدید)
source docker/setup_docker_mirrors.sh
bash docker/setup_docker_mirrors.sh
source؟وقتی با bash اجرا میکنید، اسکریپت در یک پردازش فرزند (child process) اجرا شده و نمیتواند محیط شل فعلی شما را تغییر دهد. با source اسکریپت مستقیماً در شل فعلی اجرا شده و توابع بلافاصله فعال میشوند — بدون نیاز به ریاستارت ترمینال.
اسکریپت نصب چه کاری انجام میدهد؟
| مرحله | عمل |
|---|---|
| ۱ | تشخیص شل — نوع شل شما را شناسایی میکند (zsh / bash / sh) |
| ۲ | کپی فایل — توابع wrapper را به ~/.docker_mirror_functions.sh کپی میکند |
| ۳ | تزریق — یک خط source به فایل RC شل شما اضافه میکند (مثلاً ~/.zshrc، ~/.bashrc) |
| ۴ | فعالسازی خودکار — در صورت اجرا با source، توابع بلافاصله در شل فعلی فعال میشوند |
اجرای مکرر اسکریپت نصب بیخطر است و خطوط تکراری ایجاد نمیکند.
نحوه استفاده
استفاده عادی — بدون نیاز به تغییر
پس از نصب، دقیقاً مثل قبل از Docker استفاده کنید. هیچ تغییری در دستورات لازم نیست:
docker pull nginx:latest
docker pull redis:7-alpine
docker compose up -d
docker compose pull
docker-compose up # سینتکس نسخه قدیمی هم پشتیبانی میشود
دستورات بدون تأثیر
سایر دستورات Docker بدون هیچ سربار مستقیماً اجرا میشوند:
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 شل خود اضافه کنید:
- zsh (~/.zshrc)
- bash (~/.bashrc)
# مدت اعتبار کش (پیشفرض: ۳۰۰ ثانیه = ۵ دقیقه)
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
# مدت اعتبار کش (پیشفرض: ۳۰۰ ثانیه = ۵ دقیقه)
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
حالت دیباگ
برای مشاهده فرآیند انتخاب میرور در زمان واقعی:
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)
bash docker/setup_docker_mirrors.sh --remove
این دستور:
- خط
sourceرا از فایلهای RC شل حذف میکند - فایل
~/.docker_mirror_functions.shرا پاک میکند - فایل کش
~/.docker_mirror_cacheرا پاک میکند
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_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/ روی هر میرور
│ Liara → Arvan → Mobin│ سریعترین (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 / python | jq را نصب کنید: 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 # مستندات انگلیسی