روی سیستم توسعه کار میکند، روی سرور production نه
علت معمولاً تفاوت نسخه زبان برنامهنویسی، کتابخانهها یا تنظیمات سیستمعامل بین دو محیط است. ایمیج Docker همه وابستگیها را بستهبندی میکند تا همان چیزی که تست شده، روی سرور اجرا شود.
خدمات Docker و کانتینرسازی سرور برای تیمی است که میخواهد اپلیکیشن روی هر سرور یکسان اجرا شود، انتشار نسخه جدید قابل تکرار باشد و محدودیت دسترسی به Docker Hub از ایران کارش را متوقف نکند. کانفیگ سرور Docker Engine، Docker Compose و رجیستری خصوصی Harbor را روی سرورهای شما راهاندازی و ایمن میکند.
علت معمولاً تفاوت نسخه زبان برنامهنویسی، کتابخانهها یا تنظیمات سیستمعامل بین دو محیط است. ایمیج Docker همه وابستگیها را بستهبندی میکند تا همان چیزی که تست شده، روی سرور اجرا شود.
Docker Hub به دلیل الزامات صادراتی آمریکا دسترسی از IPهای ایران را مسدود میکند و در دورههای اختلال اینترنت بینالملل، دریافت ایمیج عملاً ممکن نیست. اما کانفیگ سرور این مشکل را حل میکند و دسترسی سرورهای شما به تمام سرویسهای تحریمشده را فراهم میکند. میرور رجیستری و رجیستری داخلی هم وابستگی استقرار به اینترنت خارج را برطرف میکنند.
کانتینرها با docker run دستی و بدون فایل Compose ساخته شدهاند، ولومها بکاپ ندارند و ایمیجها تگ latest دارند. بازسازی چنین سروری پس از خرابی به حدس و گمان وابسته است.
از Dockerfile و فایل Compose اپلیکیشن تا رجیستری خصوصی، امنیت و آمادهسازی پایش کانتینرها را انجام میدهیم تا تیم شما بتواند هر سرویس را با چند دستور مشخص دوباره بسازد.
نصب و تنظیم پایهای که همه کانتینرها روی آن اجرا میشوند.
سرویس شما در ایمیجی بستهبندی میشود که هر بار یکسان ساخته شود.
کل سرویس در یک فایل خوانا و نسخهدار تعریف میشود.
ایمیجهای مورد نیاز در رجیستری داخلی میمانند و استقرار به Docker Hub وابسته نیست.
کانتینر بهخودیخود مرز امنیتی کامل نیست.
سرویسهایی را که مستقیم روی سرور نصب شدهاند، تدریجی به کانتینر منتقل میکنیم.
کانتینرسازی یعنی اپلیکیشن و همه وابستگیهایش، از نسخه زبان برنامهنویسی تا کتابخانهها، در یک ایمیج بستهبندی شوند و روی هر سروری که Docker دارد به همان شکل اجرا شوند. کانتینر از کرنل سیستمعامل میزبان استفاده میکند، پس از ماشین مجازی سبکتر است و در بیشتر سازمانها داخل ماشینهای مجازی اجرا میشود. Docker Compose چند کانتینر، مثل اپلیکیشن، دیتابیس و reverse proxy، را در یک فایل تعریف میکند. نکتههای زیر به تیمی کمک میکند که میخواهد سرویسهایش را کانتینری کند، Compose را برای production آماده کند یا مشکل دریافت ایمیج روی سرورهای ایران را حل کند.
سرویسهای بدون داده ماندگار، مثل اپلیکیشن وب، Workerها و reverse proxy، سادهترین نقطه شروع هستند، چون با حذف و ساخت دوباره کانتینر چیزی از دست نمیرود. دیتابیس هم در کانتینر اجرا میشود، اما داده باید در ولوم باشد و بکاپ و تست بازیابی جداگانه داشته باشد. نرمافزاری که لایسنسش به سختافزار گره خورده یا به رابط گرافیکی نیاز دارد، گزینه مناسبی برای کانتینر نیست و برای یک سایت ساده روی هاست اشتراکی هم Docker معمولاً لازم نیست. مهاجرت را با یک سرویس کمخطر شروع کنید، آن را کنار نصب قبلی آزمایش کنید و بعد ترافیک را جابهجا کنید.
اگر ایمیج هر بار با نسخههای متفاوتی ساخته شود، تفاوت بین محیط تست و production دوباره برمیگردد. ایمیج پایه را با تگ نسخه مشخص انتخاب کنید و از latest استفاده نکنید. با multi-stage build ابزارهای کامپایل در مرحله ساخت میمانند و ایمیج نهایی کوچکتر میشود. فایل .dockerignore جلوی کپی شدن پوشههای اضافه و فایلهای محرمانه به ایمیج را میگیرد. رمزها و تنظیمات محیطی داخل ایمیج قرار نمیگیرند و هنگام اجرا با متغیر محیطی یا فایل به کانتینر داده میشوند.
سرویس را با کاربر غیر root اجرا کنید و healthcheck تعریف کنید تا سرویس ناسالم تشخیص داده شود. هر ایمیج را با شماره نسخه یا شناسه commit تگگذاری کنید تا معلوم باشد روی سرور دقیقاً چه نسخهای اجرا میشود و بازگشت به نسخه قبلی ممکن باشد. ساخت ایمیج و push آن به رجیستری را به pipeline بسپارید تا هر نسخه از یک مسیر مشخص ساخته شود؛ این بخش در پیادهسازی CI/CD طراحی میشود.
فایل Compose باید برای کسی که بعداً سرور را تحویل میگیرد خوانا و کامل باشد. پیش از استقرار روی سرور اصلی، این موارد را در فایل بررسی میکنیم:
لاگ کانتینرها بهصورت پیشفرض بدون محدودیت رشد میکند و روی سرورهای پرترافیک دیسک را پر میکند، پس حداکثر حجم و تعداد فایل لاگ را در daemon.json یا خود فایل Compose تعیین کنید. ولوم داده را از چرخه عمر کانتینر جدا نگه میدارد، اما جای بکاپ را نمیگیرد. برای دیتابیسها خروجی منظم و تست بازیابی لازم است که در بکاپ و بازیابی بحران طراحی میشود. سیستمعامل میزبان هم باید جداگانه سختسازی شود، چون کانتینر بهخودیخود مرز امنیتی کامل نیست.
Docker Hub دسترسی از IPهای ایران را مسدود میکند، دسترسی به بعضی رجیستریهای دیگر هم ممکن است محدود یا ناپایدار باشد و Docker Hub برای pull بدون احراز هویت محدودیت نرخ هم دارد. کانفیگ سرور مشکل دسترسی به تمام سرویسهای تحریمشده را حل میکند. با این حال اگر استقرار به این دسترسی وابسته باشد، روزی که اینترنت بینالملل مختل است نسخه جدید منتشر نمیشود و سرور خراب هم بازسازی نمیشود. تنظیم registry-mirrors در daemon.json فقط برای ایمیجهای Docker Hub اعمال میشود. ایمیجهایی که از ghcr.io یا quay.io میآیند، با پروژه proxy cache در Harbor یا تغییر آدرس ایمیج در فایل Compose مدیریت میشوند.
روش پایدارتر این است که ایمیجهای مورد نیاز هر سرویس در Harbor نگهداری شوند. Harbor کنترل دسترسی کاربران و اسکن آسیبپذیری ایمیجها را هم دارد و ایمیجهای داخلی سازمان را کنار ایمیجهای عمومی نگه میدارد. پس از راهاندازی، یک بار استقرار کامل را روی سروری آزمایش کنید که به رجیستریهای خارجی دسترسی ندارد تا وابستگی پنهانی باقی نمانده باشد.
تعداد سرویسها و وابستگیهایشان، اینکه Dockerfile باید از صفر نوشته شود یا فقط بازبینی شود، حجم دادهای که به ولوم منتقل میشود و نیاز به Harbor و میرور پایه برآورد هستند. تعداد محیطها، مثل تست و production، هم زمان کار را بیشتر میکند. برای برآورد، زبان و فریمورک اپلیکیشن، فهرست سرویسها، سیستمعامل سرور و محل نگهداری کد را بفرستید تا پس از مشاوره اولیه رایگان قیمت اعلام شود. اگر تعداد سرورها و سرویسها رشد کند و به توزیع خودکار روی چند سرور نیاز پیدا کنید، مرحله بعد استقرار و مدیریت Kubernetes است.
Docker هنگام انتشار پورت قوانین iptables خودش را اضافه میکند و این پورتها ممکن است با وجود فعال بودن UFW از اینترنت باز بمانند. پورت سرویسهای داخلی مثل دیتابیس را منتشر نکنید یا آن را فقط روی 127.0.0.1 منتشر کنید.
زبان و فریمورک، سرویسهای وابسته، دادههای ماندگار و منابع سرور را بررسی میکنیم و مشخص میکنیم کدام بخشها برای کانتینری شدن مناسباند.
Dockerfile، فایل Compose، شبکهبندی بین کانتینرها، ولومها و محل نگهداری ایمیجها در Harbor یا میرور را طراحی میکنیم و با تیم توسعه شما هماهنگ میکنیم.
سرویس را اول در محیط تست اجرا و بررسی میکنیم، بعد با برنامه بازگشت روی سرور اصلی مستقر میکنیم و ترافیک را منتقل میکنیم.
فایلها را در مخزن کد شما قرار میدهیم، دستورات بهروزرسانی و بازیابی را مستند میکنیم و در صورت نیاز لاگ و متریک کانتینرها را به سیستم مانیتورینگ وصل میکنیم.
این خدمت بخشی از خدمات DevOps و امنیت کانفیگ سرور است. کانتینر روی سیستمعامل، شبکه و فایروال سرور اجرا میشود و تیمی که هر سه را میشناسد، مشکلاتی مثل پورتهای باز ناخواسته، پر شدن دیسک از لاگ کانتینرها یا وابستگی به Docker Hub را پیش از production میبیند.
میرور رجیستری، proxy cache در Harbor و نگهداری ایمیجهای مورد نیاز در رجیستری داخلی.
هر سرویس با فایل نسخهدار تعریف میشود تا بازسازی سرور به حافظه یک نفر وابسته نباشد.
کانتینرسازی را میتوان به CI/CD، مانیتورینگ و در صورت رشد به Kubernetes وصل کرد و همه این خدمات را همان تیم انجام میدهد.
ساختار اپلیکیشن و سرور فعلی را در تلگرام شرح دهید تا مسیر کانتینرسازی را پیش از هر تعهدی با شما مرور کنیم.
برای درک قوانینی که Docker هنگام انتشار پورت روی سرور میسازد.
آموزشمفاهیم bridge، NAT و مسیریابی که شبکه کانتینرها روی آنها ساخته شده است.
آموزشپیشزمینه مقایسه ماشین مجازی و کانتینر برای انتخاب درست.
Docker ابزاری است که اپلیکیشن و همه وابستگیهایش را در یک ایمیج بستهبندی میکند و بهصورت کانتینر ایزوله اجرا میکند. برای تیمهایی که چند سرویس، چند محیط تست و production یا انتشار مکرر دارند بیشترین فایده را دارد؛ برای یک سایت ساده روی هاست اشتراکی معمولاً لازم نیست.
ماشین مجازی یک سیستمعامل کامل با کرنل مستقل روی hypervisor اجرا میکند، اما کانتینر Docker از کرنل سیستمعامل میزبان استفاده میکند و فقط اپلیکیشن و کتابخانههایش را ایزوله میکند. کانتینر سبکتر است و سریعتر اجرا میشود، ولی ایزولهسازی ماشین مجازی قویتر است و در عمل بسیاری از کانتینرها داخل ماشینهای مجازی اجرا میشوند. برای راهاندازی بستر مجازی، خدمات مجازیسازی سرور را ببینید.
Docker Hub دسترسی از IPهای ایران را مسدود کرده و برای pull بدون احراز هویت هم محدودیت نرخ دارد و اختلالهای اینترنت بینالملل هم به این مشکل اضافه میشود. ما این مشکل را حل میکنیم و دسترسی به Docker Hub و تمام سرویسهای تحریمشده دیگر را برایتان فراهم میکنیم. برای پایداری بیشتر، میرور رجیستری هم تنظیم میشود و ایمیجهای مورد نیاز در رجیستری خصوصی مثل Harbor میمانند تا استقرار به دسترسی لحظهای به اینترنت خارج وابسته نباشد.
نه. تنظیم registry-mirrors در Docker فقط برای ایمیجهای Docker Hub اعمال میشود. ایمیجهایی که از رجیستریهای دیگر مثل ghcr.io یا quay.io دریافت میشوند، با پروژه proxy cache در Harbor یا تغییر آدرس ایمیج در فایل Compose مدیریت میشوند.
برای یک یا چند سرور و تعداد محدودی سرویس، Docker Compose سادهتر و کمهزینهتر است و بهخوبی جواب میدهد. Kubernetes وقتی توجیه دارد که به مقیاسپذیری خودکار، توزیع سرویس روی کلاستر چندسروره و انتشار بدون قطعی در مقیاس بالا نیاز دارید و پیچیدگی عملیاتی بیشتر آن را هم میپذیرید. استقرار Kubernetes را هم بهصورت خدمت مستقل انجام میدهیم.
اگر داده در ولوم تعریف شده باشد، با حذف یا بازسازی کانتینر از بین نمیرود، اما ولوم جایگزین بکاپ نیست. برای دیتابیسها بکاپ منظم و تست بازیابی جداگانه لازم است که در بکاپ و بازیابی بحران طراحی میشود.
هر سرور لینوکسی با کرنل و توزیع بهروز مناسب است و Ubuntu، Debian و AlmaLinux رایجترین انتخابها هستند. منابع لازم به تعداد و نوع سرویسها بستگی دارد. اگر سرور مناسب ندارید، سرور مجازی ایران گزینهای برای میزبانی سرویسهای کانتینری است.
بگویید اپلیکیشن با چه زبانی نوشته شده، چند سرویس دارد و روی چه سروری اجرا میشود. در مشاوره اولیه رایگان، ساختار Docker پیشنهادی و راه دسترسی پایدار به ایمیجها را با شما مرور میکنیم.