سید مجید هاشمی
سید مجید هاشمی
خواندن ۹ دقیقه·۵ سال پیش

راه اندازی قدم به قدم Docker Private Registry

داکر ریجیستری چیست ؟

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

داکر رجیستری در حقیقت انبار (repository) ی از ایمیج های مختلف با ورژن های مختلف هست که این امکان را به کاربران میده تا با دسترسی به این انبار از ایمیج های مد نظر خودشون استفاده کنن و container شون رو اجرا کنن.

در حال حاضر DockerHub یکی از قوی ترین repository های موجود برای کاربران داکر هست که می تونن به راحتی ایمیج هایی که میخوان رو ازش بگیرن. حتی این امکان وجود داره که با ساخت اکانت ، registry خودتون رو در این repository راه اندازی کنید . اما بیشتر سازمان ها و شرکت ها ترجیح میدن registry داخلی (local) خودشون رو داشته باشن تا کنترل و مدیریت قوی تری روی تمامی image هاشون داشته باشن .برای این کار نیاز هست یه docker private registry راه اندازی بشه.شاید مهمترین و اصلی ترین مزیت private registry نسبت به public registry در این باشد که مدیریت ایمیج ها کاملا در اختیار سازمان/شرکت هاست.

راه اندازی داکر رجیستری داخلی

خب بازم با فرض اینکه داکر رو نصب دارید و آماده هستید برای ساخت یک کانتینر ، راه اندازی یک رجیستری داخلی رو شروع می کنیم . در واقع registry خودش یک ایمیج هست که به صورت container و با دستور زیر راه اندازی میشه :

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

قاعدتاً بعد از اجرای این دستور شما با خطای "Unable to find image 'registry:2' locally" مواجه میشید و برای رفع این خطا باید با استفاده از اکانتی که در سایت داکرهاب ساختید روی سرورتون لاگین کنید . برای این کار می تونید از دستور ساده زیر استفاده کنید :

$ docker login

خب بعد از اینکه با موفقیت لاگین کردین دوباره دستور ساخت کانتینر رجیستری رو اجرا کنید . بعد از اینکه پروسه pull شدن ایمیج registry تموم شد شما می تونید با کامند "docker ps" کانیتنر ایجاد شده رو ببینید :

CONTAINER ID IMAGE STATUS PORTS NAMES 5f74098ecd3b registry:2 Up 4 seconds 0.0.0.0:5000->5000/tcp local_registry

حالا برای تست رجیستری یک image اوبونتو رو از داکر هاب گرفته (pull) و بعد از اصلاح tag اون رو درون رجیستری داخلی مون push می کنیم .

$ docker pull ubuntu

خروجی دستور "docker images" رو با هم ببینیم :

REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest 775349758637 5 weeks ago 64.2MB registry 2 f32a97de94e1 9 months ago 25.8MB

با این دستور tag ایمیج مورد نظرمون رو تغیبر میدیم :

$ docker image tag ubuntu localhost:5000/myubuntu

همونجور که میبینید ساختار تغییر و افزودن tag به ایمیج به صورت "hostname:port/imagename:ver" هست . حالا دیگه وقتشه که ایمیج اختصاصی خودمون رو درون رجیستری داخلی push کنیم :

$ docker push localhost:5000/myubuntu

و در نهایت خروجی دستور "docker images" :

REPOSITORY TAG IMAGE ID SIZE ubuntu latest 775349758637 64.2MB localhost:5000/myubuntu latest 775349758637 64.2MB

سوالی که شاید براتون پیش بیاد اینکه این image در کدام مسیر درون کانتینر رجیستری قرار گرفته؟ برای فهمیدن این موضوع به کانتینر local_registry وارد میشیم و محتویات مسیر زیر رو چک می کنیم :

$ docker exec -it local_registry /bin/sh / # ls /var/lib/registry/docker/registry/v2/repositories/ myubuntu

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

$ docker inspect local_registry | grep -i mounts -A10 &quotMounts&quot: [ { &quotType&quot: &quotvolume&quot, &quotName&quot: &quot44558ee189235a5...&quot, &quotSource&quot: &quot/var/lib/docker/volumes/44558ee189235a5.../_data&quot, &quotDestination&quot: &quot/var/lib/registry&quot, &quotDriver&quot: &quotlocal&quot, &quotMode&quot: &quot&quot, &quotRW&quot: true, &quotPropagation&quot: &quot&quot } $ ls /var/lib/docker/volumes/44558ee189235a5.../_data/docker/registry/v2/repositories /myubuntu

نکته : در صورت نیاز می تونید مسیر های مورد نظر رو تغییر بدید ، برای این کار در زمان اجرا کردن کانتینر رجیستری از سوییچ "v /yourpath/registry:/var/lib/registry-" استفاده کنید.

ساخت رجیستری با دسترسی خارجی

یک داکر رجیستری در محیط عملیاتی باید توسط پروتکل هایی مثل TLS امن سازی بشه و مکانیزم های دسترسی به اون رعایت بشه . در محیط هایی که از چند نود(node) داکر استفاده میشه ، همه نود ها باید به رجیستری دسترسی داشته باشن . برای این منظور نیاز هست که رجیستری بر بستر پروتکل امن TLS تنظیم بشه و به نود ها سرویس بده . این کار رو مرحله به مرحله جلو میبریم :

قدم اول : ساخت گواهی self-signed

همونجور که گفتیم برای برقراری ارتباط امن بین رجیستری داخلی و نود های داکر و ایجاد بستر امن بین اونها می بایست از پروتکل های امن مثل TLS استفاده کرد. برای این منظور از opelssl برای ساخت گواهی self-signed استفاده می کنیم . برای این کار نیاز دارید که پکیج openssl روی سرورتون نصب باشه . برای ادامه مراحل زیر رو دنبال کنید :

$ mkdir /etc/certs $ cd /etc/certs $ openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt

در پروسه ساخت گواهی سوالاتی از شما پرسیده میشه که با توجه به اطلاعات خودتون بهش پاسخ بدید . بعد از تموم شدن ساخت گواهی شما دو فایل با پسوند crt. و key. خواهید داشت .

قدم دوم : اجرای رجیستری بر روی پورت 443

خب قدم بعدی برای داشتن یک داکر رجیستری امن ، اجرای کانیتنر رجیستری بر روی پورت 443 و استفاده از پورتکل های امن سازی هست . حتماً میدونید که قبلش باید کانتینر رجیستری قبلی رو متوقف و یا پاک کنید . برای ساخت کانتینر جدید بر روی پورت 443 دستور کمی متفاوت خواهد بود :

$ docker run -d --restart=always --name registry -v /etc/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key -p 443:443 registry:2

خب تقریبا چیز عجیب و غریبی در دستور نیست . از سوییچ "v-" برای تعریف environment variable ها استفاده کردیم . به این صورت که فایل های Certificate رو از مسیر جاری سرور میزبان (host) به درون کانتینر اصطلاحاً bind mount کردیم و گفتیم که می خواییم این کانتینر بر روی پورت 443 اجرا بشه .

خب در این مرحله یک ایمیج رو tag میزنیم و به رجیستری جدیدمون push می کنیم :

$ docker tag alpine localhost:443/alpine:new_v1 $ docker push localhost:443/alpine:new_v1

بعد از اینکه همچنان گواهی ساخته شده ما قابل قبول نخواهد بود به دلیل اینکه به صورت پیش فرض در داکر استفاده از پروتکل امن TLS فعال نیست و ارتباطات بین docker daemon و docker client بر بستر امن HTTPS نمی باشد .

اما کانتینری که در دستور بالا اجرا کردیم اولین قدم برای فراهم کردن بستر امن ارتباطی هست و در حقیقت در دستور run فقط فایل های مربوط به Certificate رو به کانتینر معرفی کردیم تا ازشون استفاده کنه . اما قدم بعدی تنظیم docker daemon برای استفاده از گواهی های ساخته شده اس.

قدم سوم : معرفی گواهی ها به Docker Daemon

برای معرفی گواهی های Custom (اختصاصی) به docker daemon باید در مسیر مشخص تمامی نود ها برید و دایرکتوری به نام registry hostname بسازید و فایل ca.crt رو در اون قرار بدید و سرویس داکر رو ریستارت کنید :

$ mkdir -p /etc/docker/certs.d/localhost:443/ $ cp /etc/certs/ca.crt /etc/docker/certs.d/localhost:443/ $ systemctl restart docker

برای اطمینان از صحت عملکرد یه ایمیج رو داخل رجیستریمون push می کنیم :

$ docker push localhost:443/alpine:new_v1

و حالا برای گرفتنش از رجیستری داخلی مون ایمیج رو pull می کنیم :

$ docker pull localhost:443/alpine:new_v1

همونطور که خواهید دید نسخه جدید تر ایمیج مورد نظر از رجیستری داخلی مون بارگزاری میشه.

به زودی در بخش دوم این آموزش نحوه ی راه اندازی ساز و کار احراز هویت (Authentication) نود ها برای دسترسی به local registry رو با هم بررسی می کنیم . موفق باشید

منبع :

https://docs.docker.com/registry/deploying/

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