کار با Registryها (Docker Hub و GHCR)
مفهوم Container Registry چیست؟
وقتی در گیت کدی مینویسید، آن را به یک مخزن گیت مثل GitHub یا GitLab ارسال میکنید. در دنیای کانتینرها، به سرویسی که ایمیجهای ساختهشده را ذخیره، نسخهبندی و توزیع میکند Container Registry میگویند.
اصطلاحات کلیدی:
- Registry: سرویس میزبان ایمیجها (مثلاً
docker.ioیاghcr.io). - Repository: مجموعهای از ایمیجهای مرتبط با یک پروژهی خاص (مثلاً
library/nginxیاoctocat/hello-world). - Tag: برچسب متنی برای تفکیک نسخههای مختلف یک ایمیج (مانند
v1.0.0،alpine،latest). - Digest: شناسهی رمزنگاریشده و یکتای محتوای ایمیج (
sha256:...) که تغییرناپذیر است.
ساختار آدرسدهی ایمیجها در Docker
هر نام ایمیج در داکر ساختاری به شکل زیر دارد:
اگر آدرس رجیستری را ننویسید، داکر بهطور پیشفرض آن را داکر هاب (docker.io) فرض میکند:
nginx:alpine— در واقعdocker.io/library/nginx:alpineاست (ایمیج رسمی داکر هاب).bitnami/redis:latest— ایمیج متعلق به حساب سازمانی bitnami در داکر هاب است.ghcr.io/home-assistant/home-assistant:stable— ایمیج از رجیستری گیتهاب (GHCR) دانلود میشود.
ارسال و انتشار ایمیج چگونه انجام میشود؟ (آشنایی مفهومی)
در پایپلاینهای اتوماسیون و CI/CD (که در هفتهی بعد بهطور کامل بررسی میکنیم)، فرایند ارسال ایمیج به رجیستریها معمولاً به این صورت انجام میشود:
- احراز هویت: ورود با نام کاربری و توکن امنیتی:
- برچسبگذاری (Tagging): نامگذاری ایمیج مطابق الگوی دامنهی رجیستری و حساب کاربری:
- ارسال (Push): بارگذاری لایهها در سرور رجیستری:
نکته: در این مرحله نیازی نیست ایمیجهای خود را در رجیستری عمومی پوش کنید؛ چرا که ساخت اکانت، تولید PAT و آپلود ایمیج بخشی از اتوماسیون خطوط لولهی CI/CD در گیتهاب اکشنز (هفتهی ششم) خواهد بود. در اینجا تمرکز ما بر دریافت، استفاده و شناخت منابع مختلف ایمیجها است.
آزمایش عملی: دریافت و اجرای ایمیجها از رجیستریهای گوناگون
بیایید نحوهی دریافت و اجرای کانتینر از رجیستریهای معتبر مختلف را تجربه کنیم:
۱. اجرای کانتینر از Docker Hub (ایمیج رسمی)
سادهترین حالت، دریافت مستقیم بدون نوشتن نام رجیستری است:
۲. دریافت و اجرای ایمیج از GitHub Container Registry (GHCR)
رجیستری گیتهاب با آدرس ghcr.io شناخته میشود. برای آزمایش دانلود و اجرای یک ایمیج بسیار سبک (چند مگابایتی) از GHCR:
در این مثال، داکر بهصورت خودکار تشخیص میدهد که باید با سرور ghcr.io ارتباط برقرار کند، لایههای ایمیج ابزار uv را دریافت کند و نگارش آن را در ترمینال نمایش دهد.
استراتژیهای تگگذاری و مخاطرات تگ latest
یکی از اشتباهات پرریسک در استقرار Production، تکیه بر تگ :latest است.
چرا استفاده از :latest در Production توصیه نمیشود؟
- تغییرپذیر بودن (Mutable): تگ
latestیک اشارهگر متغیر است. امروز ممکن است به نسخهی ۱ اشاره کند و فردا به نسخهی ۲. - غیرقابل پیشبینی بودن Rollback: اگر نسخهی جدید باگ داشته باشد، نمیتوانید با اطمینان مشخص کنید نسخهی قبلی چه کدی داشته است.
- سردرگمی کش داکر: اگر روی سرور ایمیجی با تگ
latestوجود داشته باشد، دستورdocker runممکن است اصلاً ایمیج جدید را دانلود نکند و از همان نسخهی قدیمی سرور استفاده کند!
الگوهای استاندارد تگگذاری در DevOps:
- نسخهبندی معنایی (Semantic Versioning):
- مثل
v1.2.0یاv1.2.1برای ریلیزهای پایدار.
- مثل
- هش کامیت گیت (Git Commit SHA):
- مثل
sha-7f2a1b9که در پایپلاینهای CI/CD ساخته میشود و امکان ردیابی دقیق خط به خط کد متناظر با آن کانتینر را فراهم میکند.
- مثل
- تگهای ترکیبی:
- مثل
myapp:1.2.0-alpineکه هم نسخه و هم سیستمعامل پایه را مشخص میکند.
- مثل
منابع یادگیری
مستندات و مقالات
- Docker Pull Reference — مستندات رسمی دریافت ایمیجها از رجیستریهای مختلف
- Working with the Container registry (GHCR) — راهنمای گیتهاب درباره رجیستری GHCR
- The misunderstood Docker tag: latest - Marc Campbell — دلایل فنی و تجربی پرهیز از تگ latest در محیطهای پایدار