با وجود venv بازم لازمه داکر یادبگیرم؟

جمعه 21 مرداد 1401 توسط Reganto

در گروه تلگرامی کاربران جنگو فارسی کاربری به نام A Boy Has No Name سوالی در رابطه با الزام یادگیری داکر با وجود ابزاری مانند venv پرسیده بود که پاسخ آن را برای استفاده دیگران این‌جا هم ذکر می‌کنم.

سوال چه بود؟

سوال را می‌توانید در اینجابیابید.

اگر تلگرام ندارید:‌ با وجود venv بازم لازمه داکر یادبگیرم؟

پاسخ من به این سوال

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

  • اگر پروژه X به نسخه 1.1 یک پکیج نیاز داشته باشه و پروژه Y به نسخه مثلا 2.3 از همین پکیچ « دقت کنید که ما تنها امکان نصب یک نسخه از یک پکیج را به صورت system wide خواهیم داشت»

  • در بعضی از سیستم‌ عامل‌ها «لینوکس رو مطمئنم بقیه رو نه» بخش‌هایی از سیستم‌عامل وابسته به بعضی از پکیج‌های پایتون هستند. حالا فرض کنید بخش X از سیستم‌عامل به نسخه 1.2 از یک پکیج و پروژه‌ای ما به نسخه 1.5 همون پکیج وابسته باشه! اینجا تداخل پیش میاد و با نصب نسخه 1.5 از پیکج مورد نظر ما،‌ عملکرد یک بخش از سیستم‌عامل با مشکل رو به رو میشه

  • ما در پایتون با مفهومی به نام transitive dependency سروکار داریم.«A->B, B->C» با ایجاد یک محیط ایزوله به راحتی می‌تونیم یک lock file از وابستگی‌‌ها و ورژن‌ او‌ن‌ها داشته باشیم. این لاک‌فایل بازتولید محیط توسعه در یک سیستم دیگر رو خیلی راحت می‌کنه

  • ...

حالا که با چرایی ساخت محیط ایزوله آشنا شدیم باید ببینیم دسته‌بندی محیط‌‌های ایزوله به چه صورت هست؟

  • Application level isolation

  • System level isolation

پکیج‌های مثل venv،‌ virtualenv و ... در دسته اول قرار می‌گیرند. این ابزارها مفسر پایتون و پکیج‌های مورد نیاز را در یک محیط ایزوله اما غیرپرتابل قرار می‌دهند. غیرپرتابل از این جهت که با تغییر دایرکتوری محیط ایزوله عملا محیط ایزوله بلااستفاده خواهد شد. «‌در venv/bin/ یک ls -ltrh بگیرید و ببینید مفسر به کجا لینک شده». استفاده از این محیط‌های مجازی در سیستم‌های دیگر نیز عملا بلاموضوع است. اما برای پروژه‌های کوچک تا متوسط با وابستگی‌های کم،‌این ابزار‌ها گزینه‌ای مناسب هستند.

در سطح دوم، ما به دلایلی «مثلا همکار شما nginx را با فلان فلگ کامپایل کرده و شما نیاز دارید با همان تنظیمات nginx را داشته باشید - تیم از یک دیتابیس خاص استفاده می‌کنه و بقیه موارد مربوط به external dependencies» مایلیم تمام سیستم عامل « یا دست کم بخش‌هایی از سیستم‌ عامل و ابزار‌های مورد استفاده» را به صورت ایزوله داشته باشیم. برای اینکار دو نوع ابزار وجود دارد:

  • Classic virtualization

  • Lightweight virtualization «Containerization»

در دسته اول ابزار‌هایی مثل Virtualbox، VMWare، ‍‍Vagrant و ... قرار می‌گیرند و در دسته دوم ابزارهایی مانند Docker، Rocket و ...

یک جایی نیاز هست که تمام اعضای تیم بر روی یک محیط یکسان « با internal dependencies و external dependencies مشابه» کار کنند که در این صورت از Classic virtualization و ابزارهای مرتبط استفاده می‌شود. در این‌جا ما با یک محیط کاملا ایزوله و خودکفا ;) سروکار داریم.

اما در دسته دوم ما با ایزوله سازی محیط user-space به صورت مفهوم کانتیتر بر روی یک انجین سروکار داریم. در این صورت سیستم‌عامل به صورت یک external dependency ایزوله نمی‌شه.

در هر صورت تمام این بحث‌ها به خاطر پرتابل بودن محیط توسعه و دردسر‌های مربوط به اون هست. هر کدوم‌ از این طرز‌تفکر‌ها و ابزارهای مربوط‌ به اون‌ها تریدآف‌هایی دارند اما به خاطر مفهوم Scale Out شیفت تکنولوژی به سمت Docker هست. venv رو مجبورید استفاده کنید! یک حدی از داکر رو هم خوبه که بلد باشید و بیشتر از اون رو مگر اینکه به مباحث DevOps و حوزه‌های مرتبط علاقه‌مند باشید.

اگر مایل هستید راجع‌به این موضوع بیشتر بدونید فصل دوم کتاب Expert Python Programming رو پیشنهاد می‌کنم.