چجوری یه پرایوت رجیستری داکر برای خودم داشته باشم

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

کار پرایوت رجیستری ذخیره کانتینر و تعیین سطوح دسترسی به کانتینر ها هستش

مزیت پرایوت رجیستری نسبت به ریپازیتوری های انلاین مثل gcr.io و docker hub این هستش که خب اونا مارو تحریم کردن باید یه جوری بدون دردسر دورشون بزنیم . مزیت دیگه اینه که زمانی که بخوایم تو پروداکشن از سرور پرایوت خودمون استفاده کنیم نیازی نیست که به اینترنت دسترسی داشته باشیم ، و در نهایت پالیسی شرکت ها مبنی بر اینکه کد و کانتینر حتما و حتما تو زیرساخت خودشون باشه که از سواستفاده های احتمالی که ممکنه ایجاد بشه جلوگیری کنن .

بریم سر اصل مطلب ، قبلا ها میشد به راحتی از روش basic authentication برای احراز هویت استفاده کرد مثل این آموزش احمد طحانی ولی داکر برای بالابردن امنیت این روش رو حذف کرد و جایگزینش یه از یه روش توکن بیس شبیه به Oauth2 استفاده کرده اینشکلی یعنی :

به همین دلیل روش قدیمی منسوخ و باید از یه سرور جهت ISSUER بودن استفاده کرد. خوشبختانه جامعه کاربری داکر بیکار نمونده و برای این قضیه کانتینر docker_auth رو توسعه داده .

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

ساختار پروژه به این صورت هستش

برای شروع با ادیتور مورد علاقمون یه فایل docker-compose.yml میسازیم و این محتویات رو توش کپی میکنیم و yourdomain رو با دامنه مورد علاقه خودتون عوض کنید

registry:
 restart: always
 image: registry:2
 ports:
    - "443:443"
 environment:
   - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem
   - REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem
   - REGISTRY_HTTP_ADDR= :443
   - REGISTRY_AUTH=token
   - REGISTRY_AUTH_TOKEN_REALM=https://yourdomain:5000/auth
   - REGISTRY_AUTH_TOKEN_SERVICE="Docker registry"
   - REGISTRY_AUTH_TOKEN_ISSUER="Acme auth server"
   - REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/fullchain.pem
 volumes:
    - /registry/data:/var/lib/registry
    - /registry/certs:/certs
    - /registry/auth:/auth

dockerauth:
 image: cesanta/docker_auth:stable
 ports:
    - "5000:5000"
 volumes:
    - /registry/config:/config:ro
    - /registry/log/docker_auth:/logs
    - /registry/ssl:/ssl
 command: /config/auth_config.yml
 restart: always

البته که من این پروژه رو تو دایرکتوری registry ساختم شما میتونید ماونت پوینت هارو به پروژه اکنون خودتون تغییر بدین .

فایل auth_config.yml رو هم میتونید تو دایرکتوری config بسازید که محتویاتش باید اینجوری باشه

# A simple example. See reference.yml for explanation for explanation of all options.
server:
 addr: ":5000"
 certificate: "/ssl/fullchain.pem"
 key: "/ssl/privkey.pem"

token:
 realm: "https://127.0.0.1:5000/auth"
 rootcertbundle: "/ssl/fullchain.pem"
 issuer: "Acme auth server" # Must match issuer in the Registry config.
 expiration: 900

users:
 # Password is specified as a BCrypt hash. Use htpasswd -B to generate.
 "admin":
 password: "$2y$05$LO.vzwpWC5LZGqThvEfznu8qhb5SGqvBSWY1J3yZ4AxtMRZ3kN5jC" # badmin
 "test":
 password: "$2y$05$WuwBasGDAgr.QCbGIjKJaep4dhxeai9gNZdmBnQXqpKly57oNutya" # 123
acl:
  - match: {account: "admin"}
 actions: ["*"]
 comment: "Admin has full access to everything."
  - match: {account: "user"}
 actions: ["pull"]
 comment: "User \"user\" can pull stuff."
 # Access is denied by default.

تو قدم بعدی ssl certificate خودمون میسازیم به دایرکتوری های ssl و certs لینک میکنیم .

و تو قدم آخر

docker compose up -d 

برای اضافه کردن کاربر به تنظیمات کافی هستش از این کامند جهت ساختن رمز برای کاربر استفاده کنید و مثل کانفیگ بالا سطح دسترسی رو اونجوری تو فایل auth_config.yml تعیین کنید

docker run --entrypoint htpasswd registry:2 -Bbn "user" "password"

در نهایت همه این ها تو گیتهابم هستش و میتونید برای سناریو های پیچیده تر مثلا LDAP و google sgin in برای مدیریت کانتینتر های خودتون استفاده کنید.