راهحل سریع
خطای ۴۰۳ در کار با داکر (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 معمولاً این است:
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 و نام توزیع فرق میکند):
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 به این یکی:
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 اینطور دیده میشود:
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
- امضا و بررسیشده
-
۱کلید امضای dacker
# 1) Add the dacker signing keysudo curl -fsSL https://repo.dacker.ir/dacker.gpg -o /usr/share/keyrings/dacker.gpg -
۲افزودن مخزن
# 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) Installsudo apt updatesudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -
۴راهاندازی سرویس
# 4) Enable and start the servicesudo systemctl enable --now docker -
۵بررسی نصب
# 5) Check the installationdocker --versiondocker compose version
بهجای فایل .sources، یک خط .list میخواهید؟
-
جایگزین مرحلهٔ ۲
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 است:
curl -sI https://mirror.example.ir/v2/ | head -n 1بعد آن را در تنظیمات Docker ثبت کنید و Docker را restart کنید:
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:…
مرحلهٔ ۳: بررسی کنید
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:
# /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 چیزی شبیه این میبینید:
unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character '}' looking for beginning of object key stringخطا را ببینید و فایل را با یک ابزار JSON بررسی کنید:
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
toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limitmirror به سقف درخواستهای Docker Hub رسیده است، معمولاً چون کاربران زیادی از آن استفاده میکنند. کمی بعد دوباره امتحان کنید یا mirror دیگری را اول فهرست بگذارید.
mirror تنظیم شده اما Docker هنوز مستقیم به Docker Hub میرود
اگر mirror جواب ندهد یا image را نداشته باشد، Docker بیصدا به Docker Hub برمیگردد و همان 403 را نشان میدهد. با curl بالا ببینید mirror در دسترس است و با docker info مطمئن شوید Docker بعد از ویرایش فایل واقعاً restart شده است.