راه‌اندازی پراکسی برای داکر

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

از این موضوع که بگذریم، هر کاری راه حلی داره و راه حل این کاری که من انجام دادم اینجوریه که یه سرور خصوصی ارزون قیمت توی خارج از کشور خریدم و یه داکر رجیستری روش بالا آوردم و با استفاده از letsencrypt هم یه certificate ساختم و عملا یه پراکسی برای داکر سرورهای داخل کشوری که دارم ایجاد کردم. توی این مطلب هم میخوام کاری که انجام دادم رو برای شما شرح بدم تا شما هم اگر این مشکل رو دارید، مشکلتون حل بشه.

همین‌طور که می‌دونید یه نرم‌افزاری هست به اسم docker registry که میتونه برای شما یه مخزن image خصوصی ایجاد کنه که شما دیگه نیاز نداشته باشید به ازای هر بار دانلود هر image توی داکر روی هر سرور، کلی هزینه پهنای باند و ... بدید. یکی از روش‌هاش که مشکل بالا رو حل نمیکنه اینه که اون image رو دانلود کرده باشید یا خودتون روی سرورتون ساخته باشید و همون image رو روی سروری که نرم‌افزار docker registry هست به اصطلاح push کنید. و از اون به بعد برای دانلود از آدرس اون سرور استفاده کنید به جای سرور داکر هاب. این خیلی خوبه اما این مشکل رو حل نمی‌کنه که ما داخل کشور هستیم و نمی‌تونیم از سایت داکر هاب چیزی رو pull (یا همون دانلود) کنیم. استفاده از VPN و ... به سرورهای خارجی هم کار سختیه، چون با توجه به اتفاقات اخیر، همه چیز کُنده و خیلی از مواقع دانلود ناموفقی دارید و به هدفتون نمی‌رسید.

اول یه سرور (VPS) تهیه کنید. من ترجیحم سیستم‌عامل دبیانه ولی با هر سیستم‌عامل لینوکسی که راحتید کار کنید (و نتیجه‌اش هم اینکه مثلا مسیر فایل‌هاتون تو سرورهای centos یا redhat رو خودتون باید کشف کنید و من فقط سیستم‌عامل‌های برمبنای دبیان رو مثال میزنم).

بعدش به روشی که توی سایت داکر گفته شده، داکر رو روی اون سرور نصب کنید. برای اینکه کار رو راحت کنیم، docker-compose رو هم نصب کنید.

یه دایرکتوری بسازید به اسم docker-registry-proxy-cache و داخل اون یه دایرکتوری به اسم config.

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

$ mkdir -p docker-registry-proxy-cache/config
$ sudo docker run -it --rm --entrypoint cat registry:2 /etc/docker/registry/config.yml /home/user/docker-registry-proxy-cache/config/config.yml

این دستور رو اجرا کنید تا تنظیمات registry پیش‌فرض رو براتون تو مسیری که میخواید، کپی می‌کنه.

برای اینکه کاملا بفهمه، یه کار دیگه هم انجام بدید و این خطوط رو به انتهای فایل config.yml اضافه کنید:

proxy:
  remoteurl: https://registry-1.docker.io

تو همون مسیر، یه فایل دیگه به اسم docker-compose.yml بسازید و اینو داخلش قرار بدید:

version: '3'
services:
 registry:
 restart: always
 image: registry:latest
 ports:
      - 443:443
 volumes:
      - ./config:/etc/docker/registry:ro
      - ./data:/var/lib/registry:rw
 environment:
      - REGISTRY_HTTP_ADDR=0.0.0.0:443
      - REGISTRY_HTTP_TLS_CERTIFICATE=/etc/docker/registry/domain.crt
      - REGISTRY_HTTP_TLS_KEY=/etc/docker/registry/domain.key

حالا به یه certificate نیاز دارید تا بتونید بدون دردسر و امن کار کنید و اینکه داکر برای اینکه سرورتون ناامنه، غر نزنه. برای اینکار بهترین و ارزان‌ترین روش، استفاده از letsencrypt ئه. با این دستور letsencrypt رو نصب کنید:

$ sudo apt-get install -y letsencrypt

یه نکته‌ای اینجا هست. یا یه دامنه از قبل ثبت کردید و این سرور رو روی یه A record روی DNS تنظیم کردید و قابل دسترسه، مثل registry.example.com یا اینکه میخواید از آی‌پی سرورتون استفاده کنید. چون letsencrypt اجازه نمیده روی آی‌پی certificate ازش درخواست کنید، می‌تونید از یه wildcard DNS استفاده کنید. من برای این کار از nip.io استفاده کردم. روش کارش هم خیلی ساده‌اس و کافیه آدرس آی‌پی سرورتون رو به این شکل وارد کنید و به یه A record تبدیلش کنید. فرض بر اینکه سرورتون آی‌پیش 8.8.8.8 هستش:

8.8.8.8.nip.io

برای تستش هم کافیه یه ping ساده بزنید.

حالا می‌تونید با استفاده از certbot که همراه letsencrypt نصب می‌شه، این دستور رو اجرا کنید و یه certificate معتبر از letsencrypt دریافت کنید:

# certbot certonly --standalone --preferred-challenges https -d 8.8.8.8.nip.io

تبریک میگم، certificate جدید توی مسیر زیر ذخیره شده، یه سری بهش بزنید:

# cd /etc/letsencrypt/live/8.8.8.8.nip.io/

یه سری فایل هست که ما به سه تاش نیاز داریم. این دستورات رو اجرا کنید تا certificate و private key شما توی مسیر دایرکتوری که بالا ساختید کپی بشه:

# cp privkey.pem /home/user/docker-registry-proxy-cache/config/domain.key
# cp cert.pem chain.pem > /home/user/docker-registry-proxy-cache/config/domain.crt

حالا کافیه که این دستور رو توی مسیر دایرکتوری اجرا کنید تا پراکسی‌تون ساخته و اجرا بشه:

# docker-compose up -d

اگر همه چیز خوب پیش بره، یه docker registry ساختید و می‌تونید ازش استفاده کنید. برای اینکه سرورتون رو تست کنید کافیه یه مرورگر باز کنید و آدرس زیر رو داخلش وارد کنید:

https://8.8.8.8.nip.io/v2/_catalog

این آدرس imageهایی هست که قراره بعداً دانلود بشه که الان خالیه.

حالا میمونه سرور(های) داخلیمون که قراره از این پراکسی استفاده کنن. کافیه یه فایل تو مسیر زیر درست کنید و اطلاعات سرور رو داخلش اضافه کنید:

# nano /etc/docker/daemon.json
{
    "registry-mirrors": ["https://8.8.8.8.nip.io"]
}

و در نهایت داکر رو ریستارت کنید و سعی کنید که یه image رو pull کنید:

# service docker restart
# docker pull alpine:latest

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