نمای کلی

Docker registry mirrors سرعت pull image ها را با ذخیره‌سازی layers در نزدیکی زیرساخت خود افزایش می‌دهند، هزینه‌های پهنای باند را کاهش می‌دهند و تحمل به قطعی‌های upstream registry بهبود می‌بخشند. این راهنما مراحل پیکربندی Docker برای استفاده از mirror registries در سیستم‌های Linux را شرح می‌دهد.

در پایان، خواهید توانست:

  • نحوه کار Docker در یافتن و استفاده از mirror registries را درک کنید
  • Docker daemon را برای استفاده از یک یا چند mirror پیکربندی کنید
  • اتصال mirror را تأیید کنید و pull image ها را آزمایش کنید
  • مسائل مرتبط با mirror را حل کنید

پیش‌نیازها

  • Docker نصب شده و در حال اجرا روی سیستم Linux (Ubuntu, Debian, CentOS, Fedora و غیره)
  • دسترسی root یا sudo برای تغییر تنظیمات Docker
  • آشنایی اولیه با فایل‌های پیکربندی JSON
  • دسترسی شبکه‌ای به Docker Hub و mirror registries شما

گام 1: درک پیکربندی Docker Mirror

Docker mirrors در فایل پیکربندی daemon در /etc/docker/daemon.json پیکربندی می‌شوند. وقتی که mirror برای یک registry مشخص کنید، Docker ابتدا سعی می‌کند image ها را از mirror بکشد و اگر نیاز باشد، به registry اصلی برمی‌گردد.

مفاهیم کلیدی:

  • Registry اصلی: منبع پیش‌فرض (مثلاً Docker Hub برای image هایی مانند nginx:latest)
  • Mirror registry: منبع جایگزینی که layers را از registry اصلی ذخیره می‌کند
  • رفتار بازگشت: Docker به‌طور خودکار اگر mirror ناموفق باشد، به registry اصلی مراجعه می‌کند

گام 2: ایجاد یا ویرایش فایل پیکربندی Docker Daemon

اگر فایل /etc/docker/daemon.json وجود ندارد، آن را ایجاد کنید:

sudo touch /etc/docker/daemon.json

فایل را با ویرایشگر مورد نظر خود باز کنید:

sudo nano /etc/docker/daemon.json

یا

sudo vim /etc/docker/daemon.json

گام 3: پیکربندی یک Mirror منفرد

ساده‌ترین پیکربندی از یک mirror برای Docker Hub استفاده می‌کند. کلید "registry-mirrors" را اضافه یا بروزرسانی کنید:

{
  "registry-mirrors": ["https://docker.repo.mirrory.ir"]
}

اگر فایل شامل تنظیمات دیگری است، کلید registry-mirrors را ادغام کنید:

{
  "debug": false,
  "storage-driver": "overlay2",
  "registry-mirrors": ["https://docker.repo.mirrory.ir"]
}

گام 4: پیکربندی چندین Mirror (اولویت بازگشت)

برای مشخص کردن چندین mirror، Docker آن‌ها را به ترتیب امتحان می‌کند. اولین mirror در دسترس استفاده می‌شود؛ اگر ناموفق باشد، Docker به ترتیب دوباره تلاش می‌کند:

{
  "registry-mirrors": [
    "https://docker.repo.mirrory.ir",
    "https://docker-mirror.backup.local"
  ]
}

Docker mirrors را به ترتیب فهرست امتحان می‌کند. این برای تکرار و توزیع بار استفاده شود.

گام 5: پیکربندی Mirrors برای Registries خاص

برای registries دیگر (مثلاً GitHub Container Registry، Google Container Registry)، از "registry-mirrors" به عنوان کلید زیر هر registry در شیء "registries" استفاده کنید:

{
  "registry-mirrors": ["https://docker.repo.mirrory.ir"],
  "registries": {
    "ghcr.io": {
      "mirrors": ["https://ghcr.repo.mirrory.ir"]
    },
    "gcr.io": {
      "mirrors": ["https://gcr.repo.mirrory.ir"]
    }
  }
}

این پیکربندی:

  • برای Docker Hub images از docker.repo.mirrory.ir استفاده می‌کند
  • برای GitHub Container Registry (ghcr.io) از ghcr.repo.mirrory.ir استفاده می‌کند
  • برای Google Container Registry (gcr.io) از gcr.repo.mirrory.ir استفاده می‌کند

گام 6: بارگذاری Docker Daemon و تأیید پیکربندی

فایل پیکربندی را ذخیره کنید و Docker daemon را بارگذاری کنید:

sudo systemctl reload docker

اگر Docker از systemd استفاده نمی‌کند:

sudo service docker restart

تأیید کنید که پیکربندی بارگذاری شده است:

docker info | grep -A 5 "Registry Mirrors"

خروجی باید mirror registry شما را نشان دهد:

Registry Mirrors:
 https://docker.repo.mirrory.ir/

گام 7: آزمایش اتصال Mirror

یک image آزمایشی بکشید تا تأیید کنید mirror کار می‌کند:

docker pull nginx:latest

pull را نظارت کنید تا تأیید کنید mirror استفاده می‌شود. برای رویدادهای مرتبط با mirror، لاگ‌های Docker را بررسی کنید:

sudo journalctl -u docker --since "5 min ago" | grep -i mirror

یا در سیستم‌هایی که از logging داخلی Docker استفاده می‌کنند:

docker events --filter type=image &
docker pull nginx:latest

گام 8: تأیید Cache و عملکرد

برای تأیید اینکه mirror layers را ذخیره می‌کند، همان image را دوباره بکشید. باید سریع‌تر تکمیل شود:

docker pull nginx:latest
# دومین pull باید در چند ثانیه تکمیل شود، که cache hits را نشان می‌دهد

تاریخ pull را با خروجی مفصل بررسی کنید:

docker pull --verbose nginx:latest 2>&1 | grep -E "Pulling|Downloaded|Pull complete"

گام 9: مدیریت احراز هویت (اگر لازم باشد)

اگر mirror registry شما به احراز هویت نیاز دارد، اعتبارات را در ~/.docker/config.json پیکربندی کنید:

docker login docker.repo.mirrory.ir

این اعتبارات رمزگذاری شده را ذخیره می‌کند که Docker هنگام pull از mirror به‌طور خودکار استفاده می‌کند.

تأیید کنید اعتبارات ذخیره شده‌اند:

cat ~/.docker/config.json | jq '.auths'

گام 10: حل مسائل متداول

Mirror قابل دسترس نیست

اتصال شبکه‌ای به mirror را بررسی کنید:

curl -I https://docker.repo.mirrory.ir/v2/

پاسخ مورد انتظار: 200 OK یا 401 Unauthorized (اگر احراز هویت لازم باشد).

Docker به جای استفاده از mirror، به registry اصلی برمی‌گردد

لاگ‌های daemon را بررسی کنید:

sudo journalctl -u docker -n 50

به دنبال خطاهایی مثل connection refused یا certificate verify failed باشید.

تأیید کنید URL mirror در daemon.json صحیح است و daemon بارگذاری شده است.

Pull موفق است اما pull های بعدی کند هستند

mirror ممکن است layers را به درستی ذخیره نکند. تأیید کنید:

  1. ذخیره‌سازی mirror دارای فضای کافی است
  2. سرویس mirror در حال اجرا است (اگر mirror containerized است docker ps)
  3. تأخیر شبکه بین Docker host و mirror کم است (ping mirror.example.com)

خطاهای گواهینامه (“x509: certificate signed by unknown authority”)

اگر از گواهینامه خودتوقیع استفاده می‌کنید، تأیید TLS را غیرفعال کنید (برای production توصیه نمی‌شود):

{
  "insecure-registries": ["docker.repo.mirrory.ir"],
  "registry-mirrors": ["https://docker.repo.mirrory.ir"]
}

راه‌حل بهتر: گواهینامه CA mirror را به ذخیره‌سازی اعتماد سیستم خود اضافه کنید:

sudo cp docker-repo-mirrory-ir-ca.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
sudo systemctl reload docker

بهترین روش‌ها

  1. از HTTPS استفاده کنید: همیشه برای URL mirror در production از https:// استفاده کنید تا از حملات man-in-the-middle جلوگیری شود.
  2. موجودی mirror را نظارت کنید: برای تکرار، چندین mirror را شامل کنید؛ Docker به‌طور خودکار failover می‌کند.
  3. منظم آزمایش کنید: هر‌چند وقت یکبار image بکشید تا اطمینان حاصل کنید mirror کار می‌کند.
  4. mirrors را به‌روز نگه دارید: اطمینان حاصل کنید mirror registry نسخه اخیر و امن را اجرا می‌کند.
  5. راه‌اندازی خود را مستند کنید: daemon.json را با نظرات توضیح دهنده چرایی پیکربندی mirrors شرح‌حال کنید.
  6. تأثیر را اندازه‌گیری کنید: زمان pull و مصرف پهنای باند را قبل و بعد از فعال کردن mirrors مقایسه کنید.

گام‌های بعدی

  • درباره پروتکل‌های mirror یاد بگیرید: Docker Registry V2 API و نحوه پیاده‌سازی mirror را درک کنید
  • mirror خود را راه‌اندازی کنید: یک mirror registry خصوصی برای محیط‌های air-gapped یا offline استقرار دهید
  • سلامت mirror را نظارت کنید: برای عدم دسترسی mirror یا عملکرد ضعیف، هشدار را راه‌اندازی کنید
  • caching layer را بهینه کنید: ذخیره‌سازی mirror و سیاست‌های garbage collection را پیکربندی کنید

خلاصه

Docker registry mirrors روش قدرتمندی برای بهبود عملکرد pull image و کاهش پهنای باند است. با مراحل پیکربندی بالا، شما می‌توانید:

  • ✓ یک یا چند mirror را پیکربندی کنید
  • ✓ mirror را برای registry های خاص تعیین کنید
  • ✓ عملکرد mirror را تأیید کنید
  • ✓ مسائل متداول را حل کنید
  • ✓ بهترین روش‌های امنیتی و پایایی را اعمال کنید

برای جزئیات بیشتر، اسناد Docker در مورد registry mirrors و راهنمای پیکربندی provider mirror خود را مراجعه کنید.