ویرگول
ورودثبت نام
پرنیان راد
پرنیان راد
خواندن ۲ دقیقه·۳ سال پیش

داکر و namespace

لینوکس به هر برنامه در حال اجرا یا process یک عدد یکتا با عنوان process identifier اختصاص میدهد. مجموعه ای از این pid ها که هر کدام به برنامه ای خاص اختصاص دارند pid namespace را تشکیل میدهند; لینوکس ابزاری برای ساخت این pid namespace ها دارد و هرکدام از آنها مجموعه ی کامل از pid ها را دارند به این معنی که در هر namespace میتوانیم pid های 1و2و3و…. را داشته باشیم.

داکر که پیش تر درمورد آن صحبت شده, ابزاری است که با زبان Go نوشته شده و از برخی قابلیت های لینوکس برای پیشبرد اهدافش استفاده کرده است. یکی از این قابلیت ها همین مفهوم namespace است. داکر برای هر container که ساخته میشود namespace جداگانه تعریف میکند, این کار باعث ایزوله سازی پروسس های یک کانتینر از کانتینر دیگر میشود. بدون pid namespace جداگانه, فرایندهایی که داخل یک کانتینر فعال هستند id شان را با فرایندهایی که داخل کانتینرهای دیگر یا حتی در سیستم میزبان فعال هستند به اشتراک میگذارند; در این صورت فرایندی که داخل یک کانتینر فعال است متوجه کاری که فرایندی دیگر در یک کانتینر دیگر, یا حتی سیستم میزبان میکند میشود و حتی میتواند آن را تحت کنترل خود درآورد -که این دقیقا برخلاف وجودیت داکر است!- البته داکر امکان ساخت کانتینری بدون namespace اختصاصی را نیز فراهم میکند که کاربردش برای مواقعی که یک فرایند اعمال system administrator انجام میدهد می باشد.

برای فهم بهتر موضوع یک software conflict ساده را بررسی میکنیم. فرض کنید که یک وب سرور NGINX را بر روی سیستم خود ران کرده اید و در یک پروژه در حال استفاده از آن هستید, حال فراموش کرده اید که پروژه ای در حال استفاده از این وب سرور است و وقتی میخواهید دوباره از آن استفاده کنید به این دلیل که منابع در حال استفاده پروژه ی اول است این امکان برای شما فراهم نمیشود و به خطا برمیخورید!


داکر این موضوع را با تعریف کانتینر و namespace اختصاصی برای هر کدام حل کرده است.


در واقع conflict های زیادی وجود دارند که اغلب به دلیل وابستگی برنامه ها به هم و عدم توانایی آنها در اشتراک گذاری منابع به وجود می آید; برای مثال دو برنامه که میخواهند روی یک پرت اجرا شوند(مانند همین مثالی که بررسی کردیم), دو برنامه میخواهند از دو ورژن مختلف از یک کتابخانه که به صورت سراسری(global) تعریف شده استفاده کنند, برنامه ای نصب و اجرا شده که environment variable هایی که برنامه ی دیگری از آن استفاده میکند را تغییر داده و اکنون برنامه ی اول به مشکل برمی خورد! و مثال های دیگر که با استفاده از مفهوم کانتینر و اختصاصی بودن namespace برای آن, میتوان جلوی این مشکلات را گرفت.

namespacedockercontainerداکر
شاید از این پست‌ها خوشتان بیاید