چگونه یک رجیستری کانتینر را خود میزبانی کنیم
رجیستری کانتینر یک کاتالوگ ذخیره سازی است که از آنجا می توانید تصاویر کانتینر را فشار داده و بکشید.
بسیاری از رجیستری های عمومی و خصوصی مانند Docker Hub ، Amazon ECR و Google Cloud Artifact Registry در دسترس توسعه دهندگان است. اما گاهی اوقات، به جای تکیه بر یک فروشنده خارجی، ممکن است بخواهید خودتان تصاویر خود را میزبانی کنید. این به شما کنترل بیشتری بر نحوه پیکربندی رجیستری و محل میزبانی تصاویر کانتینر می دهد.
این مقاله یک آموزش عملی است که به شما میآموزد چگونه یک رجیستری کانتینر را خود میزبانی کنید.
فهرست مطالب
چرا ممکن است بخواهید یک رجیستری کانتینر را خود میزبانی کنید؟
چگونه یک رجیستری کانتینر را خود میزبانی کنیم
مرحله 1: Docker و Docker Compose را روی سرور نصب کنید
مرحله 2: کانتینر رجیستری را پیکربندی و اجرا کنید
مرحله 3: NGINX را برای مدیریت TLS اجرا کنید
اگر از قبل با ابزارهایی مانند Docker و NGINX آشنا باشید و درک کلی از کانتینر داشته باشید، از این مقاله بیشترین بهره را خواهید برد.
تصویر کانتینر چیست؟
قبل از اینکه در مورد ثبت کانتینر صحبت کنیم، ابتدا بیایید بفهمیم که یک تصویر کانتینر چیست. به طور خلاصه، یک تصویر ظرف بسته ای است که شامل تمام فایل ها، کتابخانه ها و تنظیمات برای اجرای یک ظرف است. آنها از لایههایی تشکیل شدهاند که هر لایه نشاندهنده مجموعهای از تغییرات سیستم فایل است که فایلها را اضافه، حذف یا تغییر میدهد.
رایج ترین راه برای ایجاد یک تصویر ظرف، استفاده از Dockerfile است.
# build an image docker build -t pliutau/hello-world:v0 . # check the images locally docker images # REPOSITORY TAG IMAGE ID CREATED SIZE # hello-world latest 9facd12bbcdd 22 seconds ago 11MB
این یک تصویر ظرف ایجاد می کند که در دستگاه محلی شما ذخیره می شود. اما اگر بخواهید این تصویر را با دیگران به اشتراک بگذارید یا از آن در دستگاه دیگری استفاده کنید، چه؟ اینجا جایی است که رجیستری کانتینر وارد می شود.
رجیستری کانتینر چیست؟
رجیستری کانتینر یک کاتالوگ ذخیره سازی است که می توانید تصاویر کانتینر را فشار داده و از آن بیرون بکشید. تصاویر در مخازن گروه بندی می شوند که مجموعه ای از تصاویر مرتبط با همین نام هستند. به عنوان مثال، در رجیستری Docker Hub، nginx نام مخزنی است که شامل نسخههای مختلف تصاویر NGINX است.
برخی از رجیستری ها عمومی هستند، به این معنی که تصاویر میزبانی شده در آنها برای هر کسی در اینترنت قابل دسترسی است. ثبت عمومی مانند Docker Hub گزینه خوبی برای میزبانی پروژه های منبع باز است.
از سوی دیگر، ثبتهای خصوصی راهی برای گنجاندن امنیت و حریم خصوصی در ذخیرهسازی تصویر کانتینر سازمانی، چه در فضای ابری و چه در محل، ارائه میدهند. این رجیستری های خصوصی اغلب دارای ویژگی های امنیتی پیشرفته و پشتیبانی فنی هستند.
فهرست رو به رشدی از رجیستری های خصوصی موجود است مانند Amazon ECR ، GCP Artifact Registry ، GitHub Container Registry ، و Docker Hub نیز یک ویژگی مخزن خصوصی ارائه می دهد.
به عنوان یک توسعه دهنده، هنگام استفاده از دستورات docker push
و docker pull
با یک رجیستری کانتینر تعامل دارید.
docker push docker.io/pliutau/hello-world:v0 # In case of Docker Hub we could also skip the registry part docker push pliutau/hello-world:v0
بیایید به آناتومی URL تصویر ظرف نگاه کنیم:
docker pull docker.io/pliutau/hello-world:v0@sha256:dc11b2... | | | | ↓ ↓ ↓ ↓ registry repository tag digest
چرا ممکن است بخواهید یک رجیستری کانتینر را خود میزبانی کنید؟
گاهی اوقات، به جای تکیه بر ارائه دهنده ای مانند AWS یا GCP، ممکن است بخواهید خودتان تصاویر خود را میزبانی کنید. این امر زیرساخت شما را داخلی نگه می دارد و باعث می شود کمتر به فروشندگان خارجی وابسته باشید. در برخی از صنایع به شدت تحت نظارت، این حتی یک الزام است.
یک رجیستری خود میزبانی شده روی سرورهای شما اجرا می شود و به شما کنترل بیشتری بر نحوه پیکربندی رجیستری و محل میزبانی تصاویر کانتینر می دهد. در عین حال هزینه نگهداری و ایمن سازی رجیستری نیز به همراه دارد.
چگونه یک رجیستری کانتینر را خود میزبانی کنیم
چندین راه حل رجیستری کانتینر منبع باز موجود است. محبوب ترین مورد به طور رسمی توسط Docker پشتیبانی می شود که رجیستری نام دارد و برای ذخیره و توزیع تصاویر و مصنوعات کانتینر پیاده سازی می شود. این بدان معنی است که شما می توانید رجیستری خود را در داخل یک کانتینر اجرا کنید.
در اینجا مراحل اصلی برای اجرای رجیستری روی سرور آمده است:
Docker و Docker Compose را روی سرور نصب کنید.
کانتینر رجیستری را پیکربندی و اجرا کنید.
NGINX را برای رسیدگی به TLS و ارسال درخواست ها به کانتینر رجیستری اجرا کنید.
گواهینامه های SSL را راه اندازی کنید و دامنه را پیکربندی کنید.
مرحله 1: Docker و Docker Compose را روی سرور نصب کنید
می توانید از هر سروری که از Docker پشتیبانی می کند استفاده کنید. به عنوان مثال، می توانید از DigitalOcean Droplet با اوبونتو استفاده کنید. برای این نسخه نمایشی از Google Cloud Compute برای ایجاد یک VM با اوبونتو استفاده کردم.
neofetch # OS: Ubuntu 20.04.6 LTS x86_64 # CPU: Intel Xeon (2) @ 2.200GHz # Memory: 3908MiB
وقتی داخل ماشین مجازی خود شدیم، باید Docker و Docker Compose را نصب کنیم. Docker Compose اختیاری است، اما مدیریت برنامههای چند کانتینری را آسانتر میکند.
# install docker engine and docker-compose sudo snap install docker # verify the installation docker --version docker-compose --version
مرحله 2: کانتینر رجیستری را پیکربندی و اجرا کنید
بعد باید کانتینر رجیستری خود را پیکربندی کنیم. فایل compose.yaml زیر یک محفظه رجیستری با حجم برای ذخیره تصاویر و حجم برای ذخیره فایل رمز ایجاد می کند.
services: registry: image: registry:latest environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: # Mount the password file - ./registry/registry.password:/auth/registry.password # Mount the data directory - ./registry/data:/data ports: - 5000
فایل رمز عبور تعریف شده در REGISTRY_AUTH_HTPASSWD_PATH برای احراز هویت کاربران در هنگام فشار دادن یا کشیدن تصاویر از رجیستری استفاده می شود. ما باید با استفاده از دستور htpasswd یک فایل رمز ایجاد کنیم. همچنین باید یک پوشه برای ذخیره تصاویر ایجاد کنیم.
mkdir -p ./registry/data # install htpasswd sudo apt install apache2-utils # create a password file. username: busy, password: bee htpasswd -Bbn busy bee > ./registry/registry.password
اکنون می توانیم کانتینر رجیستری را راه اندازی کنیم. اگر این پیام را می بینید، همه چیز همانطور که باید کار می کند:
docker-compose up # successfull run should output something like this: # registry | level=info msg="listening on [::]:5000"
مرحله 3: NGINX را برای مدیریت TLS اجرا کنید
همانطور که قبلا ذکر شد، ما می توانیم از NGINX برای رسیدگی به TLS و ارسال درخواست ها به کانتینر رجیستری استفاده کنیم.
بیشتر بخوانید
Docker Registry برای کار کردن به یک گواهی SSL معتبر و قابل اعتماد نیاز دارد. می توانید از چیزی مانند Let's Encrypt استفاده کنید یا آن را به صورت دستی دریافت کنید. مطمئن شوید که نام دامنه ای دارید که به سرور شما اشاره دارد (در مورد من registry.pliutau.com ). برای این نسخه ی نمایشی، من قبلاً گواهی ها را با استفاده از certbot دریافت کردم و آن را در فهرست راهنمای ./nginx/certs قرار دادم.
از آنجایی که ما رجیستری Docker خود را در یک کانتینر اجرا می کنیم، می توانیم NGINX را در یک کانتینر نیز با گفت ن سرویس زیر به فایل compose.yaml اجرا کنیم:
services: registry: # ... nginx: image: nginx:latest depends_on: - registry volumes: # mount the nginx configuration - ./nginx/nginx.conf:/etc/nginx/nginx.conf # mount the certificates obtained from Let's Encrypt - ./nginx/certs:/etc/nginx/certs ports: - "443:443"
فایل nginx.conf ما می تواند شبیه این باشد:
worker_processes auto; events { worker_connections 1024 ; } http { upstream registry { server registry:5000; } server { server_name registry.pliutau.com; listen 443 ssl; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; location / { # important setting for large images client_max_body_size 1000m; proxy_pass http://registry; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900 ; } } }
آماده رفتن!
پس از این مراحل می توانیم رجیستری و ظروف Nginx خود را اجرا کنیم.
docker-compose up
اکنون، در سمت کلاینت، می توانید تصاویر را از رجیستری خود فشار داده و بیرون بکشید. اما ابتدا باید وارد رجیستری شویم.
docker login registry.pliutau.com # Username: busy # Password: bee # Login Succeeded
زمان آن است که تصویر خود را به رجیستری خود میزبانی کنیم:
docker build -t registry.pliutau.com/pliutau/hello-world:v0 . docker push registry.pliutau.com/pliutau/hello-world:v0 # v0: digest: sha256:a56ea4... size: 738
در سرور خود می توانید تصاویر آپلود شده را در پوشه داده تحلیل کنید:
ls -la ./registry/data/docker/registry/v2/repositories/
گزینه های دیگر
با پیروی از مثال بالا، می توانید رجیستری را در Kubernetes نیز اجرا کنید. یا می توانید از یک سرویس رجیستری مدیریت شده مانند Harbor استفاده کنید که یک رجیستری منبع باز است که ویژگی های امنیتی پیشرفته ای را ارائه می دهد و با Docker و Kubernetes سازگار است.
همچنین، اگر میخواهید یک رابط کاربری برای رجیستری خود میزبانی داشته باشید، میتوانید از پروژهای مانند joxit/docker-registry-ui استفاده کنید و آن را در یک ظرف جداگانه اجرا کنید.
نتیجه گیری
ثبت کانتینرهای خود میزبانی شده به شما این امکان را می دهد که کنترل کاملی بر رجیستری خود و نحوه استقرار آن داشته باشید. در عین حال هزینه نگهداری و ایمن سازی رجیستری نیز به همراه دارد.
دلایل شما برای اجرای یک رجیستری خود میزبان هرچه باشد، اکنون می دانید که چگونه انجام می شود. از اینجا می توانید گزینه های مختلف را با هم مقایسه کنید و بهترین گزینه را انتخاب کنید که متناسب با نیاز شما باشد.
می توانید کد منبع کامل این دمو را در GitHub بیابید. همچنین، می توانید آن را به صورت ویدیو در کانال یوتیوب ما تماشا کنید.
ارسال نظر