DevOps و امنیت پیشرفته · Docker

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

خدمات Docker و کانتینرسازی سرور برای تیمی است که می‌خواهد اپلیکیشن روی هر سرور یکسان اجرا شود، انتشار نسخه جدید قابل تکرار باشد و محدودیت دسترسی به Docker Hub از ایران کارش را متوقف نکند. کانفیگ سرور Docker Engine، Docker Compose و رجیستری خصوصی Harbor را روی سرورهای شما راه‌اندازی و ایمن می‌کند.

Docker Engine · Compose Harbor Registry Mirror Ubuntu · Debian · AlmaLinux
چه زمانی به این خدمت نیاز دارید؟

نشانه‌هایی که وقت کانتینرسازی سرویس‌هاست

روی سیستم توسعه کار می‌کند، روی سرور production نه

علت معمولاً تفاوت نسخه زبان برنامه‌نویسی، کتابخانه‌ها یا تنظیمات سیستم‌عامل بین دو محیط است. ایمیج Docker همه وابستگی‌ها را بسته‌بندی می‌کند تا همان چیزی که تست شده، روی سرور اجرا شود.

docker pull روی سرور ایران خطا می‌دهد

Docker Hub به دلیل الزامات صادراتی آمریکا دسترسی از IPهای ایران را مسدود می‌کند و در دوره‌های اختلال اینترنت بین‌الملل، دریافت ایمیج عملاً ممکن نیست. اما کانفیگ سرور این مشکل را حل می‌کند و دسترسی سرورهای شما به تمام سرویس‌های تحریم‌شده را فراهم می‌کند. میرور رجیستری و رجیستری داخلی هم وابستگی استقرار به اینترنت خارج را برطرف می‌کنند.

کانتینرها اجرا می‌شوند، اما کسی نمی‌داند چطور ساخته شده‌اند

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

خدمات Docker

در راه‌اندازی Docker و کانتینرسازی چه انجام می‌دهیم؟

از Dockerfile و فایل Compose اپلیکیشن تا رجیستری خصوصی، امنیت و آماده‌سازی پایش کانتینرها را انجام می‌دهیم تا تیم شما بتواند هر سرویس را با چند دستور مشخص دوباره بسازد.

نصب و راه‌اندازی Docker روی سرور

نصب و تنظیم پایه‌ای که همه کانتینرها روی آن اجرا می‌شوند.

  • نصب Docker Engine و Compose plugin روی Ubuntu، Debian یا AlmaLinux
  • تنظیم محدودیت حجم لاگ کانتینرها تا دیسک سرور پر نشود
  • پیکربندی daemon.json و میرور رجیستری برای سرورهای داخل ایران

کانتینرسازی اپلیکیشن

سرویس شما در ایمیجی بسته‌بندی می‌شود که هر بار یکسان ساخته شود.

  • نوشتن Dockerfile بهینه با multi-stage build و ایمیج پایه سبک
  • جداسازی تنظیمات و secretها از ایمیج با متغیرهای محیطی
  • healthcheck برای تشخیص سرویس ناسالم

Docker Compose برای production

کل سرویس در یک فایل خوانا و نسخه‌دار تعریف می‌شود.

  • تعریف اپلیکیشن، دیتابیس، کش و reverse proxy در یک پروژه Compose
  • ولوم‌های نام‌دار برای داده ماندگار و برنامه بکاپ آن‌ها
  • سیاست restart و محدودیت CPU و حافظه برای هر سرویس

رجیستری خصوصی Harbor و میرور

ایمیج‌های مورد نیاز در رجیستری داخلی می‌مانند و استقرار به Docker Hub وابسته نیست.

  • راه‌اندازی Harbor به‌عنوان رجیستری داخلی سازمان
  • پروژه proxy cache برای نگهداری ایمیج‌های عمومی مورد نیاز
  • کنترل دسترسی کاربران و اسکن آسیب‌پذیری ایمیج‌ها

امنیت کانتینرها

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

  • اجرای سرویس‌ها با کاربر غیر root و حداقل دسترسی
  • جلوگیری از باز شدن ناخواسته پورت‌ها؛ Docker قوانین iptables را مستقل از UFW اضافه می‌کند
  • به‌روزرسانی ایمیج‌های پایه و حذف ایمیج‌های بلااستفاده

مهاجرت سرویس‌ها به Docker

سرویس‌هایی را که مستقیم روی سرور نصب شده‌اند، تدریجی به کانتینر منتقل می‌کنیم.

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

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

کانتینرسازی یعنی اپلیکیشن و همه وابستگی‌هایش، از نسخه زبان برنامه‌نویسی تا کتابخانه‌ها، در یک ایمیج بسته‌بندی شوند و روی هر سروری که Docker دارد به همان شکل اجرا شوند. کانتینر از کرنل سیستم‌عامل میزبان استفاده می‌کند، پس از ماشین مجازی سبک‌تر است و در بیشتر سازمان‌ها داخل ماشین‌های مجازی اجرا می‌شود. Docker Compose چند کانتینر، مثل اپلیکیشن، دیتابیس و reverse proxy، را در یک فایل تعریف می‌کند. نکته‌های زیر به تیمی کمک می‌کند که می‌خواهد سرویس‌هایش را کانتینری کند، Compose را برای production آماده کند یا مشکل دریافت ایمیج روی سرورهای ایران را حل کند.

کدام سرویس‌ها را اول کانتینری کنیم؟

سرویس‌های بدون داده ماندگار، مثل اپلیکیشن وب، Workerها و reverse proxy، ساده‌ترین نقطه شروع هستند، چون با حذف و ساخت دوباره کانتینر چیزی از دست نمی‌رود. دیتابیس هم در کانتینر اجرا می‌شود، اما داده باید در ولوم باشد و بکاپ و تست بازیابی جداگانه داشته باشد. نرم‌افزاری که لایسنسش به سخت‌افزار گره خورده یا به رابط گرافیکی نیاز دارد، گزینه مناسبی برای کانتینر نیست و برای یک سایت ساده روی هاست اشتراکی هم Docker معمولاً لازم نیست. مهاجرت را با یک سرویس کم‌خطر شروع کنید، آن را کنار نصب قبلی آزمایش کنید و بعد ترافیک را جابه‌جا کنید.

Dockerfile و ایمیج قابل تکرار

اگر ایمیج هر بار با نسخه‌های متفاوتی ساخته شود، تفاوت بین محیط تست و production دوباره برمی‌گردد. ایمیج پایه را با تگ نسخه مشخص انتخاب کنید و از latest استفاده نکنید. با multi-stage build ابزارهای کامپایل در مرحله ساخت می‌مانند و ایمیج نهایی کوچک‌تر می‌شود. فایل .dockerignore جلوی کپی شدن پوشه‌های اضافه و فایل‌های محرمانه به ایمیج را می‌گیرد. رمزها و تنظیمات محیطی داخل ایمیج قرار نمی‌گیرند و هنگام اجرا با متغیر محیطی یا فایل به کانتینر داده می‌شوند.

سرویس را با کاربر غیر root اجرا کنید و healthcheck تعریف کنید تا سرویس ناسالم تشخیص داده شود. هر ایمیج را با شماره نسخه یا شناسه commit تگ‌گذاری کنید تا معلوم باشد روی سرور دقیقاً چه نسخه‌ای اجرا می‌شود و بازگشت به نسخه قبلی ممکن باشد. ساخت ایمیج و push آن به رجیستری را به pipeline بسپارید تا هر نسخه از یک مسیر مشخص ساخته شود؛ این بخش در پیاده‌سازی CI/CD طراحی می‌شود.

Docker Compose برای production

فایل Compose باید برای کسی که بعداً سرور را تحویل می‌گیرد خوانا و کامل باشد. پیش از استقرار روی سرور اصلی، این موارد را در فایل بررسی می‌کنیم:

  • تگ نسخه مشخص برای هر ایمیج
  • ولوم نام‌دار برای داده ماندگار و برنامه بکاپ آن
  • سیاست restart و محدودیت CPU و حافظه برای هر سرویس
  • محدودیت حجم لاگ کانتینرها
  • انتشار پورت فقط برای سرویس‌هایی که باید از بیرون در دسترس باشند

لاگ کانتینرها به‌صورت پیش‌فرض بدون محدودیت رشد می‌کند و روی سرورهای پرترافیک دیسک را پر می‌کند، پس حداکثر حجم و تعداد فایل لاگ را در 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 منتشر کنید.

فرآیند اجرای کار

مراحل کانتینرسازی سرویس‌ها با Docker

بررسی اپلیکیشن و سرور

زبان و فریم‌ورک، سرویس‌های وابسته، داده‌های ماندگار و منابع سرور را بررسی می‌کنیم و مشخص می‌کنیم کدام بخش‌ها برای کانتینری شدن مناسب‌اند.

طراحی ایمیج و ساختار Compose

Dockerfile، فایل Compose، شبکه‌بندی بین کانتینرها، ولوم‌ها و محل نگهداری ایمیج‌ها در Harbor یا میرور را طراحی می‌کنیم و با تیم توسعه شما هماهنگ می‌کنیم.

استقرار در محیط تست و production

سرویس را اول در محیط تست اجرا و بررسی می‌کنیم، بعد با برنامه بازگشت روی سرور اصلی مستقر می‌کنیم و ترافیک را منتقل می‌کنیم.

تحویل، مستندسازی و پایش

فایل‌ها را در مخزن کد شما قرار می‌دهیم، دستورات به‌روزرسانی و بازیابی را مستند می‌کنیم و در صورت نیاز لاگ و متریک کانتینرها را به سیستم مانیتورینگ وصل می‌کنیم.

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

شامل این خدمت

  • نصب و پیکربندی Docker Engine و Docker Compose
  • نوشتن یا بازبینی Dockerfile و فایل‌های Compose
  • راه‌اندازی Harbor و میرور رجیستری
  • امن‌سازی کانتینرها و پورت‌های منتشرشده
  • مهاجرت سرویس‌های موجود به کانتینر

خارج از این خدمت

چرا کانفیگ سرور؟

Docker با شناخت سرور، شبکه و شرایط ایران

این خدمت بخشی از خدمات DevOps و امنیت کانفیگ سرور است. کانتینر روی سیستم‌عامل، شبکه و فایروال سرور اجرا می‌شود و تیمی که هر سه را می‌شناسد، مشکلاتی مثل پورت‌های باز ناخواسته، پر شدن دیسک از لاگ کانتینرها یا وابستگی به Docker Hub را پیش از production می‌بیند.

01

راهکار عملی برای محدودیت‌های دسترسی

میرور رجیستری، proxy cache در Harbor و نگهداری ایمیج‌های مورد نیاز در رجیستری داخلی.

02

هر سرویس در فایل Compose نسخه‌دار

هر سرویس با فایل نسخه‌دار تعریف می‌شود تا بازسازی سرور به حافظه یک نفر وابسته نباشد.

03

زنجیره کامل DevOps

کانتینرسازی را می‌توان به CI/CD، مانیتورینگ و در صورت رشد به Kubernetes وصل کرد و همه این خدمات را همان تیم انجام می‌دهد.

04

مشاوره اولیه رایگان

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

سوالات متداول

پرسش‌های رایج درباره Docker و کانتینرسازی

Docker چیست و برای چه کسب‌وکارهایی مناسب است؟

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 برای production کافی است یا Kubernetes لازم است؟

برای یک یا چند سرور و تعداد محدودی سرویس، Docker Compose ساده‌تر و کم‌هزینه‌تر است و به‌خوبی جواب می‌دهد. Kubernetes وقتی توجیه دارد که به مقیاس‌پذیری خودکار، توزیع سرویس روی کلاستر چندسروره و انتشار بدون قطعی در مقیاس بالا نیاز دارید و پیچیدگی عملیاتی بیشتر آن را هم می‌پذیرید. استقرار Kubernetes را هم به‌صورت خدمت مستقل انجام می‌دهیم.

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

اگر داده در ولوم تعریف شده باشد، با حذف یا بازسازی کانتینر از بین نمی‌رود، اما ولوم جایگزین بکاپ نیست. برای دیتابیس‌ها بکاپ منظم و تست بازیابی جداگانه لازم است که در بکاپ و بازیابی بحران طراحی می‌شود.

Docker را روی چه سروری نصب کنیم؟

هر سرور لینوکسی با کرنل و توزیع به‌روز مناسب است و Ubuntu، Debian و AlmaLinux رایج‌ترین انتخاب‌ها هستند. منابع لازم به تعداد و نوع سرویس‌ها بستگی دارد. اگر سرور مناسب ندارید، سرور مجازی ایران گزینه‌ای برای میزبانی سرویس‌های کانتینری است.

سرویس‌های شما را کانتینری کنیم؟

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