کار با Registryها (Docker Hub و GHCR)

مفهوم Container Registry چیست؟

وقتی در گیت کدی می‌نویسید، آن را به یک مخزن گیت مثل GitHub یا GitLab ارسال می‌کنید. در دنیای کانتینرها، به سرویسی که ایمیج‌های ساخته‌شده را ذخیره، نسخه‌بندی و توزیع می‌کند Container Registry می‌گویند.

1  Developer Machine              Container Registry              Production Server
2 ┌─────────────────┐            ┌──────────────────┐            ┌─────────────────┐
3 │  docker build   │            │   Docker Hub /   │            │                 │
4 │       │         │ (CI/CD)    │   GHCR / Quay    │ docker pull│   docker run    │
5 │       ▼         │───────────►│                  │───────────►│                 │
6 │  docker tag     │            │ [myapp:v1.0.0]   │            │                 │
7 └─────────────────┘            └──────────────────┘            └─────────────────┘

اصطلاحات کلیدی:

  • Registry: سرویس میزبان ایمیج‌ها (مثلاً docker.io یا ghcr.io).
  • Repository: مجموعه‌ای از ایمیج‌های مرتبط با یک پروژه‌ی خاص (مثلاً library/nginx یا octocat/hello-world).
  • Tag: برچسب متنی برای تفکیک نسخه‌های مختلف یک ایمیج (مانند v1.0.0، alpine، latest).
  • Digest: شناسه‌ی رمزنگاری‌شده و یکتای محتوای ایمیج (sha256:...) که تغییرناپذیر است.

ساختار آدرس‌دهی ایمیج‌ها در Docker

هر نام ایمیج در داکر ساختاری به شکل زیر دارد:

1[registry_domain/][namespace/]repository:tag

اگر آدرس رجیستری را ننویسید، داکر به‌طور پیش‌فرض آن را داکر هاب (docker.io) فرض می‌کند:

  • nginx:alpine — در واقع docker.io/library/nginx:alpine است (ایمیج رسمی داکر هاب).
  • bitnami/redis:latest — ایمیج متعلق به حساب سازمانی bitnami در داکر هاب است.
  • ghcr.io/home-assistant/home-assistant:stable — ایمیج از رجیستری گیت‌هاب (GHCR) دانلود می‌شود.

ارسال و انتشار ایمیج چگونه انجام می‌شود؟ (آشنایی مفهومی)

در پایپ‌لاین‌های اتوماسیون و CI/CD (که در هفته‌ی بعد به‌طور کامل بررسی می‌کنیم)، فرایند ارسال ایمیج به رجیستری‌ها معمولاً به این صورت انجام می‌شود:

  1. احراز هویت: ورود با نام کاربری و توکن امنیتی:
    1# ورود به داکر هاب
    2docker login
    3# یا ورود به رجیستری گیت‌هاب
    4echo "$TOKEN" | docker login ghcr.io -u USERNAME --password-stdin
  2. برچسب‌گذاری (Tagging): نام‌گذاری ایمیج مطابق الگوی دامنه‌ی رجیستری و حساب کاربری:
    1docker tag myapp:local ghcr.io/myuser/myapp:v1.0.0
  3. ارسال (Push): بارگذاری لایه‌ها در سرور رجیستری:
    1docker push ghcr.io/myuser/myapp:v1.0.0

نکته: در این مرحله نیازی نیست ایمیج‌های خود را در رجیستری عمومی پوش کنید؛ چرا که ساخت اکانت، تولید PAT و آپلود ایمیج بخشی از اتوماسیون خطوط لوله‌ی CI/CD در گیت‌هاب اکشنز (هفته‌ی ششم) خواهد بود. در اینجا تمرکز ما بر دریافت، استفاده و شناخت منابع مختلف ایمیج‌ها است.


آزمایش عملی: دریافت و اجرای ایمیج‌ها از رجیستری‌های گوناگون

بیایید نحوه‌ی دریافت و اجرای کانتینر از رجیستری‌های معتبر مختلف را تجربه کنیم:

۱. اجرای کانتینر از Docker Hub (ایمیج رسمی)

ساده‌ترین حالت، دریافت مستقیم بدون نوشتن نام رجیستری است:

1docker run --rm hello-world

۲. دریافت و اجرای ایمیج از GitHub Container Registry (GHCR)

رجیستری گیت‌هاب با آدرس ghcr.io شناخته می‌شود. برای آزمایش دانلود و اجرای یک ایمیج بسیار سبک (چند مگابایتی) از GHCR:

1docker run --rm ghcr.io/astral-sh/uv:alpine uv --version

در این مثال، داکر به‌صورت خودکار تشخیص می‌دهد که باید با سرور ghcr.io ارتباط برقرار کند، لایه‌های ایمیج ابزار uv را دریافت کند و نگارش آن را در ترمینال نمایش دهد.


استراتژی‌های تگ‌گذاری و مخاطرات تگ latest

یکی از اشتباهات پرریسک در استقرار Production، تکیه بر تگ :latest است.

چرا استفاده از :latest در Production توصیه نمی‌شود؟

  1. تغییرپذیر بودن (Mutable): تگ latest یک اشاره‌گر متغیر است. امروز ممکن است به نسخه‌ی ۱ اشاره کند و فردا به نسخه‌ی ۲.
  2. غیرقابل پیش‌بینی بودن Rollback: اگر نسخه‌ی جدید باگ داشته باشد، نمی‌توانید با اطمینان مشخص کنید نسخه‌ی قبلی چه کدی داشته است.
  3. سردرگمی کش داکر: اگر روی سرور ایمیجی با تگ latest وجود داشته باشد، دستور docker run ممکن است اصلاً ایمیج جدید را دانلود نکند و از همان نسخه‌ی قدیمی سرور استفاده کند!

الگوهای استاندارد تگ‌گذاری در DevOps:

  1. نسخه‌بندی معنایی (Semantic Versioning):
    • مثل v1.2.0 یا v1.2.1 برای ریلیزهای پایدار.
  2. هش کامیت گیت (Git Commit SHA):
    • مثل sha-7f2a1b9 که در پایپ‌لاین‌های CI/CD ساخته می‌شود و امکان ردیابی دقیق خط به خط کد متناظر با آن کانتینر را فراهم می‌کند.
  3. تگ‌های ترکیبی:
    • مثل myapp:1.2.0-alpine که هم نسخه و هم سیستم‌عامل پایه را مشخص می‌کند.

منابع یادگیری

مستندات و مقالات