دسترسی به Docker Hub از ایران: راهحلهای پایدار و Registry اختصاصی
اگر روی سرورهای ایران با Docker کار میکنید، احتمالاً این صحنه را دیدهاید: دستور docker pull با خطای 403 Forbidden متوقف میشود. Docker Hub به دلیل محدودیتهای صادراتی آمریکا، درخواستهای IPهای ایران را مسدود میکند. در این مقاله راهحلهای رایج را مقایسه میکنیم: از یک تنظیم ساده تا یک Registry اختصاصی که برای تیمهای جدی مناسب است.
چرا راهحلهای موقت دردسر میسازند؟
رایجترین واکنش، استفاده از میرورهای عمومی یا تغییر DNS است. این روشها برای یک آزمایش سریع جواب میدهند، اما در محیط Production سه مشکل دارند:
- پایداری: میرورهای عمومی ممکن است بدون اطلاع قبلی از دسترس خارج شوند و Pipeline استقرار شما را از کار بیندازند.
- امنیت: شما کنترلی ندارید که ایمیج دریافتی دقیقاً همان ایمیج اصلی باشد.
- محدودیت دریافت: Docker Hub برای کاربران ناشناس سقف تعداد Pull دارد و میرورهای اشتراکی زودتر به آن میرسند.
راهحل ۱: تنظیم Registry Mirror در Docker
سادهترین روش این است که به Docker بگویید بهجای Docker Hub، ایمیجها را از یک میرور بگیرد. فایل /etc/docker/daemon.json را ویرایش کنید:
{
"registry-mirrors": ["https://mirror.your-domain.com"]
}
و سرویس Docker را ریاستارت کنید:
sudo systemctl restart docker
توجه کنید که این تنظیم فقط روی ایمیجهای Docker Hub اثر دارد و Registryهای دیگر مثل ghcr.io یا quay.io را پوشش نمیدهد. سؤال اصلی هم این است که آدرس میرور از کجا بیاید. بهترین جواب، میروری است که مال خودتان باشد.
راهحل ۲: Pull-through Cache اختصاصی
نرمافزار متنباز Docker Registry میتواند بهعنوان یک کش بین شما و Docker Hub کار کند. آن را روی یک سرور خارج از ایران (مثلاً یک سرور مجازی خارج) اجرا میکنید. اولین بار که ایمیجی درخواست شود، از Docker Hub دریافت و ذخیره میشود و دفعههای بعد مستقیم از کش تحویل داده میشود:
docker run -d --restart=always --name hub-cache \
-p 127.0.0.1:5000:5000 \
-v /srv/registry:/var/lib/registry \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
-e REGISTRY_PROXY_USERNAME=your-dockerhub-user \
-e REGISTRY_PROXY_PASSWORD=your-dockerhub-token \
registry:2
چند نکتهی مهم:
- Registry را مستقیم روی اینترنت باز نکنید. آن را پشت یک Reverse Proxy (مثل Nginx یا Caddy) با SSL و احراز هویت قرار دهید تا به یک میرور عمومی برای همه تبدیل نشود.
- با وارد کردن نام کاربری و توکن Docker Hub، سقف تعداد Pull شما بالاتر میرود.
- بعد از راهاندازی، آدرس آن را در
registry-mirrorsسرورهای داخل ایران قرار دهید.
راهحل ۳: Harbor برای تیمها
اگر چند تیم و چند پروژه دارید، Harbor انتخاب کاملتری است. Harbor یک Registry سازمانی متنباز است که این امکانات را دارد:
- Proxy Cache برای Docker Hub و Registryهای دیگر مثل GitHub و Quay
- نگهداری ایمیجهای خصوصی خودتان در کنار ایمیجهای کششده
- کاربران، پروژهها و سطح دسترسی جداگانه
- اسکن آسیبپذیری ایمیجها با Trivy
راهحل ۴: ساخت ایمیج خارج از ایران
در این روش، CI/CD شما روی سروری خارج از ایران اجرا میشود، ایمیج نهایی را میسازد و آن را در Registry خصوصی شما قرار میدهد. سرورهای داخل ایران فقط ایمیج نهایی را از Registry خودتان دریافت میکنند و هیچ وابستگی مستقیمی به Docker Hub ندارند.
مقایسهی راهحلها
| راهحل | پایداری | امنیت و کنترل | مناسب برای |
|---|---|---|---|
| میرور عمومی | پایین | پایین | آزمایش سریع |
| Pull-through Cache اختصاصی | بالا | متوسط تا بالا | تیمهای کوچک |
| Harbor | بالا | بالا | سازمانها و چند تیم |
| ساخت ایمیج خارج از ایران | بالا | بالا | تیمهایی که CI/CD دارند |
یک توصیهی امنیتی
در محیط Production ایمیجها را بهجای Tag (مثل nginx:latest) با Digest مشخص کنید (مثل nginx@sha256:…). به این ترتیب مطمئن میشوید دقیقاً همان ایمیجی را اجرا میکنید که تست کردهاید، از هر مسیری که دریافت شده باشد.
جمعبندی
برای یک آزمایش سریع، میرور عمومی کافی است. اما اگر استقرار نرمافزارتان به Docker وابسته است، یک Pull-through Cache یا Harbor اختصاصی تنها راهی است که هم پایدار است و هم کنترلش دست خودتان است.
نمیخواهید این کار را خودتان انجام دهید؟ تیم مروانت راهاندازی Registry اختصاصی، Harbor و CI/CD را برای شما انجام میدهد. صفحهی برونسپاری پروژههای Docker و دسترسی پایدار به ابزارهای توسعه را ببینید.
