
داکر چیست و چگونه کار می کند؟
docker دستورات را از طریق یک REST API به شبح dockerd ارسال می کند که
تصاویر را می سازد و کانتینرهایی را از آنها اجرا می کند.چرا وجود دارد. Docker به شما امکان میدهد یک برنامه را با تمام وابستگیهای آن (کتابخانهها، پیکربندی، زمان اجرا) در یک آرتیفکت - یک تصویر - بستهبندی کنید و آن را به طور یکسان روی لپتاپ توسعهدهنده، در CI و در مرحله تولید اجرا کنید. این مشکل کلاسیک "روی ماشین من کار می کند" را حل می کند.
کانتینرها در مقابل ماشین های مجازی. یک VM سخت افزار را مجازی می کند و کل سیستم عامل مهمان را با هسته خود ارسال می کند. کانتینر یک فرآیند مجزا است که از هسته میزبان استفاده می کند. در نتیجه، ظروف سبک تر هستند، در کسری از ثانیه شروع می شوند و از منابع کمتری استفاده می کنند. اما یک ظرف یک VM سبک وزن نیست: به هسته میزبان گره خورده است و مرز جداسازی آن ضعیف تر از VM است. یک VM دارای ایزولهسازی سختافزاری است، در حالی که آسیبپذیری در هسته مشترک میتواند به طور بالقوه از یک کانتینر فرار کند - این معادل سرعت و چگالی است. میزبان باید با نوع کانتینر مطابقت داشته باشد: کانتینرهای لینوکس به هسته لینوکس نیاز دارند، کانتینرهای ویندوز به هسته ویندوز نیاز دارند. در macOS و Windows، Docker Desktop به طور شفاف یک VM کوچک لینوکس (مثلاً از طریق WSL2) اجرا میکند، بنابراین کانتینرهای لینوکس در آنجا هسته آن VM را به اشتراک میگذارند، نه هسته سیستمعامل شما.
معماری (مشتری-سرور). براساس مستندات Docker:
- مشتری
dockerراه اصلی تعامل کاربران با داکر است. دستوراتی مانندdocker runبه دیمون ارسال می شود. - دیمون
dockerd"کارهای سنگین" ساخت، اجرا و توزیع کانتینرها را انجام می دهد و اشیایی مانند تصاویر، کانتینرها، شبکه ها و حجم ها را مدیریت می کند. - مشتری از طریق یک REST API از طریق یک سوکت یونیکس یا یک رابط شبکه با دیمون صحبت می کند، بنابراین آنها می توانند روی ماشین های مختلف اجرا شوند.
- یک رجیستری تصاویر را ذخیره می کند. عمومی پیش فرض Docker Hub است.
تصاویر و کانتینرها. یک قیاس مفید: یک تصویر مانند یک کلاس (یا یک برنامه روی دیسک) است و یک کانتینر نمونه ای از آن است (یک فرآیند در حال اجرا). می توانید چندین کانتینر را از یک تصویر شروع کنید.
- یک تصویر یک الگوی فقط خواندنی با دستورالعمل هایی برای ایجاد یک ظرف است که از لایه ها ساخته شده است. توسط Dockerfile تعریف شده است. وقتی آن را تغییر می دهید، فقط لایه های تغییر یافته دوباره ساخته می شوند.
- کانتینر یک نمونه قابل اجرا از یک تصویر است. در بالای لایههای فقط خواندنی تصویر، یک لایه نازک قابل نوشتن (کپی در نوشتن) اضافه میکند. هر چیزی که در آنجا نوشته شده است با حذف ظرف از بین می رود - دقیقاً به همین دلیل است که داده های پایدار به حجم نیاز دارند.
نحوه عملکرد ایزوله (زیر کاپوت). dockerd هسته را مستقیماً فراخوانی نمی کند - مدیریت چرخه حیات کانتینر را به containerd واگذار می کند که یک زمان اجرا OCI را فراخوانی می کند. در داکر پیشفرض runc است، اما زمان اجرا قابل اتصال است (crun، gVisor، کاتا و غیره). جداسازی واقعی از ویژگی های هسته لینوکس می آید:
- فضاهای نام منابع را جدا می کند (در صفحه man7 8 نوع وجود دارد: PID، شبکه، mount، UTS، IPC، کاربر، cgroup، زمان). یک فرآیند فقط PID های خود، پشته شبکه خود و غیره را می بیند.
- cgroups (گروه های کنترل) استفاده از منابع (CPU، حافظه، I/O) را محدود و حساب می کند.
پیگیری های متداول. لایه های تصویر ذخیره می شوند. docker compose برنامه های چند کانتینری را اجرا می کند. داده ها از طریق حجم ها باقی می مانند (یک ظرف به طور پیش فرض زودگذر است). و OCI فرمت تصویر (مشخصات تصویر)، زمان اجرا (مشخصات زمان اجرا) و پروتکل توزیع رجیستری (مشخصات توزیع) را استاندارد میکند - این سه ویژگی اکوسیستم را با هم سازگار نگه میدارند.
