در این مقاله قصد داریم یک مثال عملی داشته باشیم تا به سادگی از تحریم های داکر عبور کنیم و در عین حال در کمترین زمان ممکن آنچه که اکثر توسعه دهندگان دات نت برای استفاده اولیه داکر جهت توسعه بهتر نیاز دارند رو آموزش بدیم.
خوب ابتدا شروع میکنیم به دور زدن تحریم داکر.
پس از نصب داکر دسکتاپ و داکر کامپوز در ویندوز باید بدونیم که برای دور زدن تحریم داکر روش های مختلفی وجود داره ولی ساده ترین اون استفاده از Mirror-Registery شرکت ابر آروان هستش. این تکنیک به این معنی هستش که ما مستقیما ایمیج های داکر رو از DockerHub نمیگیریم بلکه از یک Mirror سرور دیگه ای ایمیج ها رو میگیریم و اون سرور میدونه که چطوری تحریم ها رو دور بزنه.
برای اینکار اول باید تغییراتی در daemon داکر بوجود بیاریم. و البته چون مقاله ما راجع به ویندوز هستش ما هم روش ویندوزی این کار رو بیان میکنیم که البته هیچ تفاوتی با لینوکس نداره.
فایل daemon.json رو در ویندوز از طریق آدرس زیر پیدا میکنیم.
C:\Users\{username}\.docker\daemon.json
و سپس اون فایل رو ادیت میکنیم به صورت زیر:
در واقع من دو خط به آخر فایل اضافه کردم:
"insecure-registries" : ["https://docker.arvancloud.ir"],
"registry-mirrors": ["https://docker.arvancloud.ir"]
خوب حالا مجدد داکر دسکتاپ رو ریستارت کنید و به Mirror-Registery شرکت ابر آروان متصل شدید. اگر که فرمت فایل json دچار مشکل بشه داکر استارت نمیشه!
حالا از اینجا به بعد میخوایم یه اپلیکیشن ساده دات نتی درست کنیم, اون رو داخل container بالا بیاریم و یک سرویس redis هم داشته باشیم و از docker-compose استفاده کنیم تا از این دو سرویس استفاده کنیم و یک Network ی بین این دو کانتینر بوجود بیاریم!
اول بریم یک ایمیج redis داشته باشیم.
خیلی ساده یک cmd باز میکنیم و مینویسیم:
حالا نوبت اینه که یه اپلیکیشن ساده دات نتی داشته باشیم و از redis هم استفاده کنیم.
1 - یک پروژه دات نت webApi یا همون WeatherForeCast معروف
2 - نصب پکیج StackExchange.Redis
3- تغییر خروجی API
بصورت خلاصه در تصاویر زیر با کمترین تغییری در تمپلیت دات نت این کارها رو انجام دادم.
بعد داخل کنترلر یک بار تاریخ حال رو در redis ست و گت کردم.
حالا بریم سراغ بخش نهایی که ایجاد فایل docker-compose هستش.
من الان دو تا سرویس دارم. یکی webApi و دیگری redis. و هدف این هستش که این دو سرویس رو در 2 کانتینر بالا بیارم و بینشون شبکه ایجاد کنم تا همدیگه رو ببینند.
خیلی ساده, میام سرویس هام رو مشخص میکنم. redis رو که ساختم و پول کردم و بالا هستش. ولی اپلیکیشن رو از طریق داکر فایلی که دارم میخوام بسازمش. docker-compose که در واقع برای composition کانتینرها هستش, به من این آزادی عمل رو داده که یا ID ایمیج رو مشخص کنم و یا دستور العمل ساخت یک کانتینر رو بدم.
در مورد سرویس web من از گزینه دوم استفاده کردم و در قسمت build نوشتم که در همین دایرکتوری یا context، فایلی تحت عنوان dockerfile جهت تهیه image و کانتینر مد نظر قرار بگیره.
پورت های اپلیکیشن رو با آدرس 4102 و 4101 به بیرون expose کردم. سرویس ردیس رو هم توسعه نمیخوام بدم و مستقیما ID ایمیج رو دادم. و بعد شبکه ای رو ایجاد کردم و هر دو سرویس رو داخل اون شبکه با عنوان webapplication2-network اضافه کردم.
اما برای خود اپلیکیشن هم یک داکر فایلی ایجاد کردم به این صورت:
که داکر فایل من شامل استیج های مختلف خودش هست و visual studio با یک کلیک میتونه یک داکر فایل کامل رو بسازه! (Add Docker-Support)
خوب حالا من فایل docker-compose و dockerfile رو در یک دایرکتوری قرار میدم. یعنی root پروژه دات نت. همچنین موقع ساخت پروژه هم گزینه Place Solution Files In The Same Directory رو جهت سهولت کار تیک زدم.
فقط یک نکته اینجا تا اجرای کامل نرم افزار و دور زدن تحریم ها فاصله داریم. اینکه آدرسی که بعنوان connection string ردیس دادیم رو باید به این شکل قرار بدیم:
webapplication1-redis-1:6379
یعنی port ی که به بیرون expose کردیم رو با عنوان کانتینر ردیس ترکیب کردیم و به این آدرس رسیدیم.
و در نهایت دستور docker-compose up رو اجرا میکنیم و از زیبایی های داکر استفاده میکنیم!
نکات مهم:
1- از WSL استفاده کنید تا ایمیج ها نهایت سازگاری رو با محیط پروداکشن لینوکسی داشته باشه.
2 - تمام فایل های solution رو در یک دایرکتوری قرار دهید.
3 - به connection string ردیس که قبلا اشاره شد دقت داشته باشید.
4 - حجم ایمیج اپلیکیشن به همراه سیستم عامل حدود 200 مگابایت شد.
5 - با مطالعه این مقاله قسمت اعظمی از دانشی که یک دات نت دولوپر در خصوص داکر میبایست داشته باشد را دارا هستید.
6 - همانطور که مطرح شد این مقاله جهت ایجاد یک محیط توسعه بوده و ممکن است مناسب محیط پروداکشن نباشد.