خیلی ساده رجیستری خودتون رو داشته باشید

docker registry
docker registry

داکر ریجیستری از اجزای اصلی سرویس داکر می‌باشد. ریجیستری یک مخزن است که ایمیج‌های داکر در آن قرار داده می‌شود. معمولا به دو صورت عمومی و خصوصی ارائه می‌شود. یکی از بهترین و معروف‌ترین رجیستری‌های داکر، مربوط به همین کمپانی به نام داکر هاب است که به صورت پیش‌فرض برای سرویس داکر این ریجیستری تنظیم شده است. نکته‌ی مهم اینکه شما می‌توانید در این رجیستری ثبت‌نام کنید و برای خودتون ریپوزیتوری مخصوص خود را داشته باشید.

قبلا تنها امکان ایجاد رجیستری عمومی در این سایت بود اما در حال حاضر می‌توانید ریپوزیتوری به صورت خصوصی داشته باشید. یعنی قبلا تمام ایمیج‌هایی که در این رجیستری قرار می‌دادید در اختیار عموم قرار می‌گرفت اما در حال حاضر این امکان وجود دارد که ریپوزیتوری خصوصی نیز داشته باشید. حتما بهتون پیشنهاد می‌کنم که در این سایت ثبت‌نام کنید و برای خودتون اینجا رجیستری داشته باشید.

hub.docker.com
hub.docker.com

اما به صورت کلی هر شرکت یا هر پروژه‌ای برای خودش می‌تواند یک رجیستری خصوصی و محلی داشته باشد. در این مستند سعی بر آن شده تا یک رجیستری کامل خصوصی ایجاد کنیم تا در پروژه‌های خودمون از آن استفاده کنیم.

برای شروع می‌توان به همین سادگی یک رجیستری با کمترین کانفیگ و ساده‌ترین حالت ایجاد کرد.

docker run -d -p 5000:5000 --restart=always --name registry registry:2

حالا بر روی پورت 5000 روی سرور خودمون یک ریجیستری محلی داریم. با استفاده از دستورات زیر می‌توانیم یک ایمیج را داخل این رجیستری قرار بدیم. ابتدا ایمیج ubuntu رو دریافت کرده و سپس آن را tag می‌کنیم و بعد از آن در رجیستری خودمون قرار می‌دهیم.

docker pull ubuntu:16.04
docker tag ubuntu:16.04 localhost:5000/my-ubuntu
docker push localhost:5000/my-ubuntu

اما این ریجیستری برای یک پروژه‌ی محلی مناسب است و کفایت می‌کند اما نیاز است که ما ایمیج‌های خود را در جاهای مختلف و در محیط‌های مختلف داشته باشیم. از این رو نیاز است تا رجیستری خود را به صورت public اما با دسترسی محدود داشته باشیم. به ادامه این مطلب توجه کنید.

اول یک‌سری آپشن مهم و کاربردی به دستور docker run خود اضافه می‌کنیم. این کانفیگ‌ها بسیار مهم و کارگشا می‌باشد.

انتخاب volume: خیلی مهم است که همواره دیتای داخل کانتینر به بیرون منتقل شود و بر روی استوریج مطمئنی نگهداری شود. v /mnt/registry:/var/lib/registry- با استفاده از این آپشن شما می‌توانید دیتای داخل رجیستری خود را بر روی یک استوریج مجزا از کانتینر ذخیره نمایید.

استفاده از آدرس مخصوص: با استفاده از این آپشن می‌توانیم پورت رجیستری را روی IP مشخصی که مد نظر خودمان است bind کنیم.

-e REGISTRY_HTTP_ADDR=0.0.0.0:5001

راه‌اندازی رجیستری به صورت TLS: این نکته‌ خیلی مهم است که رجیستری ما به صورت TLS راه‌اندازی شود. برای این کار نیاز است تا از آپشن‌های زیر استفاده شود.

-v "$(pwd)"/certs:/certs
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 

احراض هویت: یکی از موارد مهم در ایجاد رجیستری خصوصی، ایجاد سطح دسترسی و کاربر می‌باشد. نیاز است تا حتما این امکان را بر روی رجیستری خود نیز داشته باشیم. برای این موضوع ابتدا فایل htpasswd را ایجاد کرد سپس آن را به ایمیج رجیستری وارد کرده تا از آن استفاده کند. در ادامه نحوه‌ی استفاده از آن نمایش داده می‌شود.

mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd

ابتدا فایل مورد نظر را ایجاد کرده و سپس user و pass مد نظر خود را که در این مثال testuser و testpassword می‌باشد را در فایل مد نظر قرار می‌دهیم.

بعد از آن ایمیج مد نظر خود را با آپشن‌های زیر راه‌اندازی کرده و در آن نوع authentication را htpasswd قرار داده و مسیر آن را مشخص و از آن استفاده می‌کنیم.

docker run -d -p 5000:5000 \
--restart=always --name registry \
-v "$(pwd)"/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-v "$(pwd)"/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2

اگر خواسته باشیم که رجیستری خود را با docker compose راه‌اندازی کنیم می‌توانیم از این فایل استفاده کنیم.

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /path/data:/var/lib/registry
    - /path/certs:/certs
    - /path/auth:/auth

در برخی از پروژه‌ها هم TLS و Authentication رو بر عهده‌ی سرویس‌های دیگه همانند nginx قرار می‌دهند که این سرویس اون موارد رو هندل می‌کند.

البته رجیستری‌های خیلی خوبی وجود دارند که به شما همزمان که CLI می‌دهند می‌توانید از UI آنها نیز استفاده کنید. از این رو پیشنهاد می‌کنم که این موارد را نیز بررسی نمایید. به عنوان مثال Jfrog یکی از بهترین‌ها می‌باشد که می‌توانید از آن استفاده کنید.