dacker

رفع خطای 403 در docker pull و نصب داکر در ایران

چرا داکر از ایران خطای ۴۰۳ (403 Forbidden) می‌دهد و چطور با نصب Docker از مخزن داخلی dacker و تنظیم registry mirror هر دو مشکل را حل کنید.

  • پیش‌نویس
  • آخرین بازبینی:
  • هنوز روی سرور واقعی آزموده نشده

راه‌حل سریع

خطای ۴۰۳ در کار با داکر (Docker) از دو جای متفاوت می‌آید و هرکدام راه‌حل خودش را دارد:

کجا خطای 403 می‌گیرید منشأ خطا راه‌حل
apt install docker-ce یا dnf install docker-ce مخزن بسته‌های Docker نصب Docker از مخزن داخلی dacker (مرحلهٔ ۱)
docker pull nginx یا docker compose pull Docker Hub، جایی که imageها هستند تنظیم یک registry mirror (مرحلهٔ ۲)
kubectl یا crictl هنگام گرفتن image Docker Hub از طریق containerd mirror در تنظیمات containerd

به زبان ساده: dacker فقط بسته‌های apt و dnf را دارد، نه imageهای Docker. پس برای نصب خود داکر در ایران از dacker استفاده کنید و برای docker pull یک registry mirror تنظیم کنید. هر دو کار روی هم کمتر از پنج دقیقه طول می‌کشد.

متن خطاها

اگر یکی از این پیام‌ها را می‌بینید، این راهنما مال شماست. خطای docker pull از Docker Hub معمولاً این است:

text
Error response from daemon: error parsing HTTP 403 response body: invalid character '<' looking for beginning of value: "<html><body><h1>403 Forbidden</h1>\nSince Docker is a US company, we must comply with US export control regulations. In an effort to comply with these, we now block all IP addresses that are located in Cuba, Iran, North Korea, Republic of Crimea, Sudan, and Syria. If you are not in one of these cities, countries, or regions and are blocked, please reach out to https://hub.docker.com/support/contact/\n</body></html>\n\n"

نصب Docker با دستورهای مستند رسمی روی Ubuntu به این خطا می‌خورد (عدد IP و نام توزیع فرق می‌کند):

text
Err:5 https://download.docker.com/linux/ubuntu noble InRelease  403  Forbidden [IP: … 443]E: Failed to fetch https://download.docker.com/linux/ubuntu/dists/noble/InRelease  403  Forbidden [IP: … 443]

و روی AlmaLinux یا Rocky به این یکی:

text
Errors during downloading metadata for repository 'docker-ce-stable':  - Status code: 403 for https://download.docker.com/linux/centos/9/x86_64/stable/repodata/repomd.xml (IP: …)Error: Failed to download metadata for repo 'docker-ce-stable': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried

روی Kubernetes با containerd، همین مشکل در رویدادهای pod این‌طور دیده می‌شود:

text
Failed to pull image "nginx:latest": failed to pull and unpack image "docker.io/library/nginx:latest": failed to resolve reference "docker.io/library/nginx:latest": unexpected status from HEAD request to https://registry-1.docker.io/v2/library/nginx/manifests/latest: 403 Forbidden

چرا داکر از ایران 403 می‌دهد

Docker Hub و مخزن بسته‌های Docker (download.docker.com) درخواست‌هایی را که از IP ایران برسد، به دلیل قوانین صادراتی آمریکا رد می‌کنند. تصمیم بر اساس IP گرفته می‌شود، نه حساب کاربری؛ پس login کردن با docker login کمکی نمی‌کند. همین محدودیت برای بعضی سرویس‌های دیگر مثل HashiCorp، Elastic و MongoDB هم هست.

راه پایدار این است که هر چیزی را که لازم دارید از مسیری داخل ایران بگیرید: بسته‌ها را از یک مخزن داخلی و imageها را از یک registry mirror داخلی. به این ترتیب سرور شما هرگز مستقیم به سرویس‌های مسدودکننده وصل نمی‌شود و نصب و به‌روزرسانی قابل پیش‌بینی می‌ماند.

مرحلهٔ ۱: Docker را از dacker نصب کنید

اگر Docker هنوز نصب نیست، این دستورها را روی Ubuntu 24.04 اجرا کنید. بلوک کامل است: کلید امضا، فایل مخزن، نصب، روشن کردن سرویس و بررسی. برای توزیع‌های دیگر راهنمای نصب Docker یا صفحهٔ Docker را ببینید.

Docker Engine29.8.1

  • Ubuntu 24.04
  • 95.8 MB
  • امضا و بررسی‌شده
جزئیات ←
bash · Ubuntu 24.04
  1. ۱کلید امضای dacker
    # 1) Add the dacker signing keysudo curl -fsSL https://repo.dacker.ir/dacker.gpg -o /usr/share/keyrings/dacker.gpg
  2. ۲افزودن مخزن
    # 2) Add the repositorysudo curl -fsSL https://repo.dacker.ir/apt/sources/dacker-docker.sources -o /etc/apt/sources.list.d/dacker-docker.sources
  3. ۳نصب
    # 3) Installsudo apt updatesudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  4. ۴راه‌اندازی سرویس
    # 4) Enable and start the servicesudo systemctl enable --now docker
  5. ۵بررسی نصب
    # 5) Check the installationdocker --versiondocker compose version
به‌جای فایل .sources، یک خط .list می‌خواهید؟
  1. جایگزین مرحلهٔ ۲
    echo "deb [arch=amd64 signed-by=/usr/share/keyrings/dacker.gpg] https://repo.dacker.ir/apt/docker noble main" | sudo tee /etc/apt/sources.list.d/dacker-docker.list

اگر Docker را قبلاً از جای دیگری نصب کرده‌اید و فقط docker pull خطا می‌دهد، مستقیم سراغ مرحلهٔ ۲ بروید.

مرحلهٔ ۲: یک registry mirror تنظیم کنید

registry mirror سروری است که imageهای Docker Hub را از طرف شما می‌گیرد و نگه می‌دارد. وقتی mirror تنظیم شده باشد، Docker هر docker pull از Docker Hub را اول از mirror می‌خواهد و فقط اگر mirror جواب ندهد سراغ خود Docker Hub می‌رود؛ که از ایران دوباره همان 403 است.

نشانی یک mirror را که به آن اعتماد دارید (مثلاً mirror داخلی سازمان یا دیتاسنتر خودتان) به‌جای https://mirror.example.ir بگذارید. پیش از هر چیز بررسی کنید که جواب می‌دهد. پاسخ 200 یا 401 یعنی سرور واقعاً یک registry است:

bash
curl -sI https://mirror.example.ir/v2/ | head -n 1

بعد آن را در تنظیمات Docker ثبت کنید و Docker را restart کنید:

bash
sudo mkdir -p /etc/dockerecho '{ "registry-mirrors": ["https://mirror.example.ir"] }' | sudo tee /etc/docker/daemon.jsonsudo systemctl restart docker

اگر فایل /etc/docker/daemon.json از قبل تنظیمات دیگری دارد (مثلاً log-opts یا data-root)، آن را بازنویسی نکنید؛ فقط کلید registry-mirrors را به همان JSON اضافه کنید. می‌توانید چند mirror بدهید؛ Docker به ترتیب امتحانشان می‌کند.

مراقب باشید: mirror هر image را که به شما می‌دهد می‌بیند و در اصل می‌تواند عوضش کند. فقط از mirrorی استفاده کنید که گردانندهٔ آن را می‌شناسید. برای imageهای حساس، به‌جای tag از digest استفاده کنید تا image دقیقاً همانی باشد که انتظار دارید: docker pull alpine@sha256:…

مرحلهٔ ۳: بررسی کنید

bash
docker info | grep -A2 "Registry Mirrors"docker pull alpine:3

اگر Registry Mirrors نشانی شما را نشان داد و docker pull بدون خطای ۴۰۳ تمام شد، کار تمام است. docker compose pull و docker build (برای imageهای پایهٔ FROM) هم از همین تنظیم استفاده می‌کنند.

containerd و Kubernetes

فایل daemon.json فقط به Docker مربوط است. اگر روی Kubernetes با containerd کار می‌کنید، containerd تنظیم mirror خودش را دارد: برای هر registry یک فایل hosts.toml در /etc/containerd/certs.d/<registry>/. برای Docker Hub:

toml
# /etc/containerd/certs.d/docker.io/hosts.tomlserver = "https://registry-1.docker.io"[host."https://mirror.example.ir"]  capabilities = ["pull", "resolve"]

مطمئن شوید config_path در بخش تنظیمات registry فایل /etc/containerd/config.toml به /etc/containerd/certs.d اشاره می‌کند و containerd را restart کنید. این کار را روی همهٔ nodeهای کلاستر انجام دهید؛ هر node image را خودش می‌گیرد.

خطاهای رایج

بعد از ویرایش daemon.json، Docker بالا نمی‌آید

تقریباً همیشه JSON نامعتبر است، مثلاً یک ویرگول اضافه بعد از آخرین مقدار. در لاگ Docker چیزی شبیه این می‌بینید:

text
unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '}' looking for beginning of object key string

خطا را ببینید و فایل را با یک ابزار JSON بررسی کنید:

bash
sudo journalctl -u docker -n 30 --no-pagerpython3 -m json.tool /etc/docker/daemon.json

هنوز برای بعضی imageها 403 می‌گیرم

registry mirror فقط برای imageهای Docker Hub است. imageهایی که نامشان با registry دیگری شروع می‌شود، مثل ghcr.io/…، quay.io/… یا registry.k8s.io/…، از registry خودشان می‌آیند و از mirror Docker Hub رد نمی‌شوند. برای آن‌ها mirror جداگانهٔ همان registry لازم است؛ در containerd با یک پوشهٔ دیگر در certs.d به نام همان registry.

x509: certificate signed by unknown authority

گواهی TLS سرور mirror معتبر نیست یا زنجیرهٔ آن ناقص است. این را گردانندهٔ mirror باید درست کند. غیرفعال کردن بررسی TLS با insecure-registries کار را راه می‌اندازد، اما هر کسی در مسیر شبکه می‌تواند image را عوض کند؛ راه‌حل امنی نیست.

toomanyrequests

text
toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

mirror به سقف درخواست‌های Docker Hub رسیده است، معمولاً چون کاربران زیادی از آن استفاده می‌کنند. کمی بعد دوباره امتحان کنید یا mirror دیگری را اول فهرست بگذارید.

mirror تنظیم شده اما Docker هنوز مستقیم به Docker Hub می‌رود

اگر mirror جواب ندهد یا image را نداشته باشد، Docker بی‌صدا به Docker Hub برمی‌گردد و همان 403 را نشان می‌دهد. با curl بالا ببینید mirror در دسترس است و با docker info مطمئن شوید Docker بعد از ویرایش فایل واقعاً restart شده است.

دستور نصب برای توزیع شما

مرتبط