پارسال با ابزار Docker آشنا شدم و برای اینکه مفاهیم از کلم نپره یه دوره‌ آموزشی با عنوان آشنایی و استفاده از داکر تهیه کردم، استقبال خوبی هم ازش شد 😊 همان طور که می‌دانید شرکت داکر سرویس داکر هاب را برای ایران مسدود کرده و عملاً با IP ایران نمی‌توانیم ایمیجی دریافت کنیم 😐 دوستان زیادی از جمله میلاد خیلی پگیر این موضوع هستند، با تمام این تلاش‌ها چون قوانین تحریماتی آمریکا هنوز پا برجاست، شرکت داکر همانند سایرین نمی‌تواند مغایر قانون رفتار کند!

نحوه‌ی درآمد شرکت داکر به گونه‌ای است که تمام هسته‌ی نرم‌افزاری خودش را به صورت متن‌باز در گیت‌هاب قرار می‌دهد، یکی از این مخزن‌ها distribution است، که خیلی به کار ما می‌آید چرا که هم از طرف داکر تحریم هستیم و هم اینکه برایمان سخت است که برای private image ها بخواهیم پول دلاری پرداخت کنیم.

کانفیگ و پیاده سازی Private Registry در ورژن ۲ آن خیلی راحت شده، البته اگر داکیومنت آن را بخوانید نحوه‌ی کانفیگ آن یکم بد توضیح داده شده، در ادامه خیلی ساده مراحل کار توضیح داده می‌شود.

یک گواهی TLS می‌خواهیم

قبل از هر چیز به یک گواهی TLS احتیاج داریم، فرقی نمی‌کنه گواهی معتبر باشد یا نه ؟ در نحوه‌ی کارکرد آن تائثیری ندارد، ولی بهتر است شما از یک گواهی معتبر استفاده کنید، خوشبختانه به‌ راحتی می‌توانید از طریق letsencrypt گواهی معتبر رایگان دریافت کرد، برای اطلاعات بیشتر در مورد نحوه‌ی ایجاد کردن گواهی معتبر به این آدرس بروید، خیلی سخت نیست!

ساختن دایرکتوری‌های مورد نیاز

$ tree /registry/
/registry/
├── auth
│   └── htpasswd
├── certs
│   ├── server.crt
│   └── server.key
├── data
└── docker-compose.yml

در نظر گرفتن یک نام‌کاربری و رمز عبور برای کاربری که می‌خواهد به این registry وصل بشود

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

اجرای private registry به وسیله‌ی docker-compose

$ vim /registry/docker-compose.yml

registry:
  restart: always
  image: registry:2
  ports:
    - 443:443
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/server.crt
    REGISTRY_HTTP_TLS_KEY: /certs/server.key
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: basic-realm
    REGISTRY_HTTP_ADDR: :443
    REGISTRY_HTTP_SECRET: topsecretphase
  volumes:
    - /registry/data:/var/lib/registry
    - /registry/certs:/certs
    - /registry/auth:/auth
$ docker-compose up -d

نحوه‌ی لاگین کردن به private registry

$ docker login https://docker.example.com

نحوه‌ی Tag کردن یک ایمیج و ارسال آن به registry

$ docker pull golang:1.6 && docker.example.com/testuser/golang
$ docker push docker.example.com/testuser/golang

خوب پس کار زیاد سختی هم نبود، تازه شما می‌توانید کار جالب‌تری هم انجام بدهید، private registry یک قابلیتی دارد به عنوان mirror که برای کش کردن ایمیج‌ها در سرور داخلی یک شرکت در نظر گرفته شده است تا base image هایی که کارمندان یک شرکت استفاده می‌کند در آن registry کش بشود، خوب وقتی شما چنین قابلیتی را می‌بینید صددرصد با خود می‌گویید چه خوب !! می‌شود از این خصوصیت برای دوز زدن تحریم استفاده کرد، یه سرور خارجی داشته باشیم همه‌ی base image ها داخل آن کش بشود و بعد از اینجا بهش متصل بشویم، درسته این ایده تقریباً عملی هست، ولی مشکلی که وجود دارد این است که داکر برای جستجو داخل image ها و به طور کلی index کردن آن به دامین index.docker.com متصل می‌شود، پس باز تحریم این جا جلوی شما را می‌گیرد، ولی خوب همین که بتوانید از طریق آن base image ها با حجم بالا را بدون proxy دریافت کنید، بد نیست، پس اگه فقط index.docker.com را بزارید پشت proxy دیگه کل مشکل تحریم بر طرف خواهد شد.(امیدوارم به زودی زود تحریم‌های فناوری برداشته بشود!)

اجرای private registry در حالت mirror

برای اجرای private registry در حالت mirror کافیه این فایل را ایجاد کرده و بعد با docker-compose اجرا کنید

$ vim /registry/docker-compose.yml
registry:
  restart: always
  image: registry:2
  ports:
    - 443:443
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/server.crt
    REGISTRY_HTTP_TLS_KEY: /certs/server.key
    REGISTRY_HTTP_ADDR: :443
    REGISTRY_HTTP_SECRET: topsecretphase
    REGISTRY_PROXY_REMOTEURL: https://registry-1.docker.io
  volumes:
    - /registry/data:/var/lib/registry
    - /registry/certs:/certs
    - /registry/auth:/auth
$ docker-compose up -d

در سمت کلاینت باید docker deamon با این آپشن‌ها اجرا بشود، برای اطلاعات بیشتر به این آدرس بروید.

$ vim /etc/default/docker
DOCKER_OPTS="--registry-mirror=https://docker. example.com"
$ service docker restart

نکته: برای این که ببینید در هنگام گرفتن یک base image چه اتفاقی می‌افتد باید docker daemon را در حالت دیباگ اجرا کنید، اگه دقت کنید هنگام جستوجو، داکر به index.docker.com رجوع می‌کند که تحریم است، ولی به هنگام گرفتن یک base image اولویت با registery ای است که شما تنظیم کرده‌اید پس اگر آن base image در رجیستری شما نبود اول از docker hub گرفته می‌شود و بعد به کلاینت منتقل می‌شود!