داکر چطور کار می کند؟

محتوی این نوشته برای تیر ۱۳۹۴ است که به دلیل انتقال وبلاگم به ویرگول دوباره بازنشر می‌کنم.یکی از تکنولوژی های جدیدی که خیلی لینوکسی ها در موردش صحبت می کنند و دوستش دارند داکره،من هم چند وقت پیش کمی در مورد اینکه واقعا چیه و چطوریه خوندم و فکر می کنم بد نباشه اینجا بنویسم. https://www.docker.com/ بطور خلاصه داکر یک مجازی سازی سبک وزنه،خیلی سبک وزن تر از محصولات قبلی مثل VMware و ...احتمالا نیگاه کردن به این اسلاید برای بحث بد نباشه و بتونید دلایل وجود چنین چیزی رو متوجه بشید.در اینکه مجازی سازی واقعا چجوری کار می کنه چیزهای فوق العاده ای هست،مثلا trap-and-emulate و اینکه چطوری بازده رو تا این حد بالا نگه می دارد.ولی در مورد داکر!یکی از دلایل کندی روش های مجازی سازی قبلی وجود کرنل سیستم عامل مهمان بود،مثلا من روی سیستم عامل Debian مجازی ساز نصب می کنم و سیستم مجازی کی درست می کنم از centos داره استفاده می کنه،خوب کرنل برای سیستم عامل مجازی هم load شده و همین باعث overhead میشه،راه حل استفاده از کرنل سیستم عامل میزبان هست.این کارو میشه با LXC انجام داد،یعنی مجازی سازی که از کرنل مشترک استفاده می کنه و پشتیبان های خوبی مثل گوگل و IBM و ... داره،ولی ممکنه LXC Container رو نشه همه جاهایی که LXC نصب باشه اجرا کرد، بعضی جاها کمی وابسته به محیط عمل می کنه.مشکلی که Docker حل کرده دقیقا همینجاست،یعنی طراحی یک نوع API که همه جا یکی و Docker Container رو میشه روی تمام سیستم هایی که Docker نصب هست اجرا کرد.نسخه های اولیه داکر از LXC استفاده می کردند،ولی مثل اینکه نسخه های فعلی با موتوری که خودشون توسعه دادند جایگزین شده.ولی اینکه دقیقا چطوری کار می کنه؟برای این قضیه با از قبل ۴ تا قابلیت رو در مورد لینوکس بدونیم.۱-Kernel Namespacesاین قابلیت باعث میشه فرضی که یک process از PID خودش داره با چیزی که واقعا هست متفاوت باشه،مثلا وقتی getid رو یک process صدا میزنه یک id بگیره،در صورتی که واقعا id متفاوتی در سیستم میزبان داره.بطور مثال PID پردازش /sbin/init همیشه باید ۱ باشه،ولی من می تونم یک process دیگه ازش اینجا کنم که PID مخالف ۱ داشته باشه،ولی خودش و تمام fork هایی که ایجاد می شند یا subprocess ها PID این پردازش رو ۱ بدونند.$ ps -eaf UID PID PPID C STIME TTY TIME CMD root 1 0 0 Jun24 ? 00:00:02 /sbin/init root 2 0 0 Jun24 ? 00:00:00 [kthreadd]۲ - CGroupCGroup باعث میشه بتونیم میزان منابعی که به هر process اختصاص پیدا می کنه رو محدود کنیم،مثلا فلان پردازش حق استفاده از حداکثر ۱۰٪ توان CPU و ۵۰ مگابایت از حافظه رو داره.(شاید این جواب در stackoverflow بتونه مفید باشه)۳ - Chrootبا Chroot می تونیم بفهمونیم که پوشه ریشه رو برای یک پردازش و همه فرزندهاش کجا باشه،اینکار کمک می کنه که به بقیه فایل ها دسترسی نداشته باشه و فقط توی همون پوشه و زیرپوشه هاش به شن بازی مشغول باشه.(شاید این نوشته بهتر به فهمیدن chroot کمک کنه)۴ - AUFSفرض کنید بتوینم چندتا پوشه رو به یکجا mount کنیم و موقع confilict فایلی که جدیدتره یا دیرتر mount شده رو ببینیم،اینطوری می تونیم به حالت inceramental یا افزایشی یک فایل سیستم داشته باشیم،چیزی که دقیقا داکر داره استفاده میکنه.یعنی پوشه های f1,f2,f3,f4 رو یکجا mount می کنیم و موقع خواندن اگر چیزی که می خواستیم در f4 نبود میریم سراغ f3 ،اگر در f3 نبود،میریم سراغ f2 و به همین ترتیب.موقع نوشتن هم فقط روی لایه بالاتر یا همون f4 می نویسیم.اینطوری می تونیم خیلی راحت لایه هایی رو حذف یا اضافه کنیم.داکر دقیقا از AUFS استفاده می کنه و بعد با mount کردن layer ها یک image درست می کنه،بعد از اون یک لایه دیگه روی اون درست می کنه که تغییراتی که ما اعمال می کنیم،مثلا وقتی apt-get upgrade میزنیم،روی لایه آخر نوشته میشه و با commit کردن اون container باعث میشیم که اون layer ذخیره بشه.امیدوارم کمی مفید بوده باشه و هرجا اشتباه کرده بودم لطفا بهم اطلاع بدید.