رفع تحریم داکر در سرورهای مستقر در دیتاسنترهای داخل ایران، دغدغه و چالش روزمره تمام توسعهدهندگان، مهندسان دواپس و مدیران سیستم است. شرکت Docker به دلیل قوانین کنترل صادرات ایالات متحده، دسترسی آدرسهای IP متعلق به ایران را به مخزن رسمی Docker Hub مسدود کرده و درخواستهای بارگیری ایمیج را با خطای 403 Forbidden یا تایماوتهای طولانی مواجه میسازد. از سوی دیگر، وابستگی به ابزارهای عمومی آنلاین یا DNSهای اشتراکی به دلیل افت مداوم پایداری و اعمال محدودیت تعداد دانلود (Rate Limit)، پروسه استقرار پروداکشن و پایپلاینهای CI/CD را مختل میکند. در این راهنمای جامع از تراستهاست، ۴ راهکار فنی، تستشده و کاملاً رایگان را برای رفع تحریم داکر و پیادهسازی مخزن کش اختصاصی آموزش میدهیم.
جهت دریافت سریعترین نتیجه و صرفهجویی ۹۰ درصدی در مصرف توکن، میتوانید کانتکست مهندسیشده زیر را با دکمه کپی بالای کادر برداشته و مستقیماً به هوش مصنوعی تحویل دهید تا سناریوی سرور شما را درک کند:
[System Context - TrustHost Iran Infrastructure Standard]
Role: Senior Linux/DevOps Engineer
Objective: Resolve Docker Hub Sanction (403 Forbidden / Rate Limit) on Iran Servers
Primary Solution: Private Docker Pull-Through Cache via registry:2 container
Key Configuration (/etc/docker/daemon.json):
{
"registry-mirrors": ["https://mirror.yourdomain.ir:5000"],
"insecure-registries": ["mirror.yourdomain.ir:5000"]
}
Local Registry Run Command:
docker run -d -p 5000:5000 --name docker-mirror --restart always \
-e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
-v /var/lib/docker-cache:/var/lib/registry registry:2
Instruction: Help me troubleshoot and configure Docker on my TrustHost server based on these parameters. Keep responses concise and focused on command-line implementation.
علت فنی خطاهای تحریم داکر در سرورهای ایران
هنگامی که دستور docker pull را روی یک سرور لینوکس در ایران اجرا میکنید، دیمن داکر با اندپوینت https://registry-1.docker.io/v2/ ارتباط برقرار میکند. سرویس کلودفلر مستقر روی داکر هاب، بازه IP ارائهدهندگان اینترنت ایران (ASهای کشور) را شناسایی کرده و ارتباط را در لایه TLS یا با کد وضعیت HTTP قطع میکند. خروجی معمول این خطا به شکل زیر ظاهر میشود:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
# یا خطای مسدودسازی ژئوبلاک:
Error response from daemon: error parsing HTTP 403 response body: access denied
همچنین داکر برای کاربران ناشناس محدودیت بارگیری ۱۰۰ ایمیج در هر ۶ ساعت را در نظر گرفته است. در صورتی که سرورهای متعددی از یک IP اشتراکی یا میرورهای عمومی شلوغ استفاده کنند، با خطای toomanyrequests: You have reached your pull rate limit متوقف خواهند شد. پیادهسازی راهکارهای بومی زیر این مشکلات را به صورت ریشهای حل میکند.
روش اول: ساخت Docker Registry Mirror شخصی با قابلیت Pull-Through Cache (پیشنهادی)
پایدارترین و حرفهایترین راهکار برای رفع تحریم داکر، راهاندازی کانتینر رسمی registry:2 به عنوان یک سرور کش واسط (Pull-Through Cache) است. طبق مستندات رسمی رجیستری داکر، در این معماری یک بار ایمیج توسط سرور پروکسی دانلود شده و در دیسک محلی ذخیره میشود؛ درخواستهای بعدی بدون مصرف ترافیک بینالملل و با سرعت شبکه داخلی دیتاسنتر (تا ۱۰ گیگابیت بر ثانیه) تحویل داده میشوند.
برای اجرای این سناریو، یک سرور مجازی خارج از کشور یا یک سرور دارای دسترسی آزاد تهیه کرده و دستور زیر را روی آن اجرا نمایید:
# ۱. ایجاد پوشه ذخیرهسازی دادههای کش روی دیسک
sudo mkdir -p /var/lib/docker-cache
# ۲. اجرای کانتینر رسمی رجیستری در حالت آینه (Mirror)
sudo docker run -d \
--name docker-registry-mirror \
--restart always \
-p 5000:5000 \
-e REGISTRY_PROXY_REMOTEURL="https://registry-1.docker.io" \
-e REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR="inmemory" \
-e REGISTRY_STORAGE_DELETE_ENABLED="true" \
-v /var/lib/docker-cache:/var/lib/registry \
registry:2
سپس در سرورهای مقصد داخل ایران، کافیست فایل تنظیمات داکر را ویرایش کرده و آدرس سرور کش خود را معرفی کنید:
# مسیر فایل: /etc/docker/daemon.json
{
"registry-mirrors": ["http://YOUR_SERVER_IP:5000"],
"insecure-registries": ["YOUR_SERVER_IP:5000"]
}
در نهایت دیمن داکر را ریلود کنید تا تنظیمات فعال شوند:
sudo systemctl daemon-reload
sudo systemctl restart docker
روش دوم: استفاده از میرورهای عمومی داخلی و DNSهای تحریمشکن
اگر امکان یا زمان کافی برای راهاندازی سرور رجیستری شخصی ندارید، میتوانید از میرورهای اشتراکی داخل کشور به همراه سامانههای عبور از تحریم (مانند شکن، ۴۰۳ و الکترو) استفاده کنید. این سرویسها درخواستهای داکر را از طریق پروکسیهای معکوس یا Anycast DNS به سرورهای مجاز هدایت میکنند.
تنظیم فایل /etc/docker/daemon.json با مطمئنترین میرورهای عمومی فعال:
{
"registry-mirrors": [
"https://docker.arvancloud.ir",
"https://docker.iranserver.com",
"https://registry.docker.ir"
]
}
همچنین برای جلوگیری از نشت DNS و مسدودسازی توسط کلودفلر، میتوانید DNSهای تحریمشکن را مستقیماً به تنظیمات داکر اضافه نمایید:
{
"dns": [
"178.22.122.100",
"185.51.200.2",
"10.202.10.202",
"1.1.1.1"
]
}
نکته مهم: در پروژههای حساس و پروداکشن شرکتی، اتکا به میرورهای اشتراکی توصیه نمیشود؛ چرا که در صورت اختلال در سرورهای واسط، تمام دستورات بیلد و دیپلوی شما متوقف خواهند شد.
روش سوم: راهاندازی مخزن کش سازمانی با Sonatype Nexus OSS
در سازمانها و تیمهای نرمافزاری بزرگ، علاوه بر رفع تحریم داکر، مدیریت دسترسی، کش کردن پکیجهای پایتون (PyPI)، نود (NPM) و اوبونتو (APT) نیز ضروری است. ابزار متنباز Nexus Repository OSS بدون هیچگونه هزینه لایسنس، یک رجیستری فوقالعاده پایدار در اختیارتان میگذارد.
اجرای سریع نکسوس با داکر کامپوز:
version: '3.8'
services:
nexus:
image: sonatype/nexus3:latest
container_name: enterprise-nexus
restart: always
ports:
- "8081:8081" # وب پنل مدیریت
- "8082:8082" # پورت اختصاصی داکر میرور
volumes:
- nexus-data:/nexus-data
volumes:
nexus-data:
driver: local
پس از بالا آمدن پنل در پورت ۸۰۸۱، یک مخزن از نوع docker (proxy) ایجاد کرده و آدرس https://registry-1.docker.io را به عنوان Remote Storage تنظیم کنید و پورت کانتینری ۸۰۸۲ را به آن اختصاص دهید.
روش چهارم: هدایت ترافیک داکر از طریق HTTP/HTTPS Proxy اختصاصی
چنانچه روی سرور خود از یک تانل امن یا پروکسی داخلی استفاده میکنید، نیازی به تغییر رجیستری ایمیجها نیست. میتوانید کلاینت داکر را مجبور کنید تمام ترافیک بارگیری ایمیج را از پروکسی شبکه عبور دهد.
برای پیادهسازی این روش، یک فایل کانفیگ برای سرویس systemd داکر ایجاد کنید:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
محتوای زیر را با مشخصات پروکسی خود در فایل ذخیره نمایید:
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10809"
Environment="HTTPS_PROXY=http://127.0.0.1:10809"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
سپس سرویس را بازنشانی کنید:
sudo systemctl daemon-reload
sudo systemctl restart docker
# بررسی فعال بودن پروکسی در داکر:
sudo docker info | grep -i proxy
جدول مقایسه روشهای رفع تحریم داکر بر اساس شاخصهای پروداکشن
برای انتخاب بهترین متد با توجه به ابعاد زیرساخت، جدول تحلیلی زیر را بررسی نمایید:
| روش پیادهسازی | مصرف منابع سرور | سرعت تحویل ایمیج | امنیت و حریم خصوصی | پایداری در محدودیت اینترنت |
|---|---|---|---|---|
| Pull-Through Cache شخصی | کمتر از ۵۰ مگابایت رم | فوقالعاده سریع (شبکه دیتاسنتر داخلی) | بسیار بالا (داده روی سرور خودتان است) | ۱۰۰٪ تضمینی (بدون ریسک قطعی عمومی) |
| میرورهای عمومی اشتراکی | صفر (بدون درگیر شدن سرور) | متوسط تا ضعیف (وابسته به ترافیک عمومی) | متوسط (لاگها در سرور عمومی است) | پایین (احتمال مسدودی یا دان شدن) |
| Sonatype Nexus سازمانی | حدود ۲ تا ۴ گیگابایت رم | فوقالعاده بالا همراه با کش چندگانه | سطح سازمانی و دارای کنترل دسترسی | بسیار بالا برای تیمهای نرمافزاری |
| تنظیم Systemd Proxy | وابسته به نرمافزار پروکسی | متوسط (محدود به پهنای باند تانل) | بسیار بالا در صورت تانل اختصاصی | متوسط (نیازمند پایش دائمی کانکشن) |
عیبیابی خطاهای متداول پس از تنظیم داکر میرور
در جریان پیادهسازی متدهای رفع تحریم داکر، ۳ مشکل زیر ممکن است رخ دهند که راهکار رفع آنها به شرح زیر است:
- خطای server gave HTTP response to HTTPS client: این خطا زمانی اتفاق میافتد که میرور شخصی شما گواهی SSL معتبر ندارد اما کلاینت سعی دارد از طریق HTTPS به آن متصل شود. راهکار: حتماً در فایل
/etc/docker/daemon.jsonآدرس پورت را در آرایهinsecure-registriesقرار دهید. - خطای x509: certificate signed by unknown authority: اگر روی رجیستری شخصی از Self-Signed Certificate استفاده میکنید، گواهی
domain.crtرا در مسیر/etc/docker/certs.d/myregistry:5000/ca.crtکپی کرده و داکر را ریاستارت کنید. - پر شدن فضای دیسک سرور کش: به صورت پیشفرض رجیستری ایمیجهای قدیمی را به طور کامل از دیسک حذف نمیکند. با اجرای دستور
registry garbage-collect /etc/docker/registry/config.ymlبلاکهای یتیم و بلااستفاده را از حافظه پاک نمایید.
سوالات متداول پیرامون رفع تحریم داکر
آیا استفاده از میرور داکر نیاز به پرداخت هزینه یا اشتراک خارجی دارد؟
خیر؛ تمام ابزارهای معرفیشده نظیر کانتینر رسمی registry:۲ و Sonatype Nexus نسخه OSS کاملاً رایگان و متنباز هستند و روی هر سرور مجازی لینوکس بدون نیاز به مسترکارت یا پرداخت ارزی قابل پیادهسازی میباشند.
چرا با وجود تنظیم میرور در daemon.json، ایمیجها همچنان از داکر هاب دانلود میشوند؟
اگر ایمیج درخواستی در نام خود دارای پیشوند مخزن دیگری باشد (مثل quay.io یا gcr.io)، داکر هاب دور زده نمیشود؛ زیرا registry-mirrors فقط ایمیجهای رسمی داکر هاب (library) را کش میکند. برای ایمیجهای Quay و GCR باید آدرس آینه اختصاصی تنظیم شود.
بهترین بستر زیرساختی برای راهاندازی رجیستری کش داکر چیست؟
سرورهای مجازی لینوکس با درایوهای سازمانی NVMe و پورت شبکه ۱۰ گیگابیت، بالاترین سرعت I/O را برای خواندن و نوشتن لایههای فشرده داکر فراهم میکنند و زمان بیلد ایمیجها را تا ۸۰ درصد کاهش میدهند.
سرعت فوقالعاده بیلد و استقرار داکر با سرورهای ابری تراستهاست
اگر در شرکت یا استارتاپ خود روزانه دهها کانتینر داکر را بیلد و اجرا میکنید و از کندی شبکه و تحریمها کلافه شدهاید، سرورهای ابری تراستهاست مستقر در دیتاسنتر تهران با ترافیک نامحدود، سختافزار مدرن NVMe و پورت شبکه اختصاصی، بهترین بستر برای راهاندازی رجیستری و پایپلاینهای CI/CD شما هستند. جهت بررسی پلنها به صفحات خرید سرور مجازی ابری و سرور اختصاصی ایران مراجعه فرمایید.