آموزش داکر (بخش ششم) — به زبان ساده
در بخش قبلی این سلسله مطالب آموزش داکر به زبان ساده در مورد برخی اصطلاحهای داکر توضیح دادیم. در این بخش به بررسی کاربرد دادهها در داکر میپردازیم. در این مطلب روی Volume-ها در داکر متمرکز خواهیم شد. ما در این سری مطالب آموزشی از استعارههای خوراکیهای مختلف برای تمثیل مفاهیم داکر استفاده کردیم و در این بخش نیز همین مسیر را پیگیری خواهیم کرد. همچنین در نوشته «داکر چیست» نیز به معرفی جامع داکر و ارائه راهنمایی برای شروع به کار با آن پرداخته شده است.
یک مقاله آموزشی جامع دیگر نیز برای آموزش داکر در مجله فرادرس منتشر شده است که مطالعه آن به علاقهمندان پیشنهاد میشود:
همچنین یک مقاله آموزشی جامع و جدیدتر نیز برای آموزش داکر در مجله فرادرس منتشر شده است که مطالعه آن به علاقهمندان پیشنهاد میشود:
دادهها را در داکر میتوان به ادویههای غذا تشبیه کرد. همان طور که ادویهها و چاشنیهای زیادی در دنیا وجود دارد، روشهای بسیار مختلفی نیز برای استفاده از دادهها در داکر وجود دارد.
توجه کنید که این راهنما برای نسخه 18.09.1 موتور داکر و API نسخه 1.39 مربوط است. دادهها در داکر میتوانند موقت یا دائمی باشند. ابتدا به بررسی دادههای موقت میپردازیم.
دادههای موقت
دادهها را میتوان به دو روش به صورت موقت درون یک داکر نگهداری کرد. به طور پیشفرض فایلها از سوی یک اپلیکیشن درون یک کانتینر ایجاد و در لایه قابل نوشتن کانتینر ذخیره میشوند. در این حالت نیاز به راهاندازی هیچ چیزی نیست. این روش کاملاً سریع و البته نامرتب است. کافی است فایلی را ذخیره کنید و به کار خود بپردازید. با این وجود زمانی که کانتینر دیگر موجود نباشد، دادهها نیز از بین میروند.
در صورتی که بخواهیم گزینه بهتری برای ذخیرهسازی دادههای موقت در داکر داشته باشیم، گزینه دیگری نیز وجود دارد. اگر نمیخواهید دادههای شما پس از حذف شدن کانتینر باقی بمانند، میتوانید از درایو tmpfs که یک درایو موقتی است و در حافظه میزبان مستقر میشود، استفاده کنید. درایو tmpfs مزیت عملیات سریعتر خواندن و نوشتن را دارد.
در اغلب موارد میخواهیم که دادهها حتی پس از حذف شدن کانتینر نیز باقی بمانند. در این حالت باید از گزینه ذخیرهسازی دائمی دادهها استفاده کنید.
دادههای دائمی
دو روش برای ذخیرهسازی دادههای دائمی پس از حذف شدن کانتینر وجود دارد. یک روش این است که یک فایل سیستم را به کانتینر bind mount کنیم. در این روش پردازشهای بیرون از داکر نیز میتوانند دادهها را تغییر دهند.
اما پشتیبانگیری، مهاجرت یا اشتراک bind mount-ها با دیگر کانتینرها دشوار است. volume-ها روش بهتری برای نگهداری از دادههای دائمی هستند.
Volume-ها
منظور از یک volume «فایل سیستم»-ای است که روی ماشین میزبان و خارج از هر کانتینری قرار دارد. Volume-ها از سوی داکر ایجاد و مدیریت میشوند و دارای خصوصیاتی به شرح زیر هستند:
- دائمی هستند.
- فایل سیستمهای free-floating که از هر کانتینر دیگر جدا هستند.
- از نظر ورودی و خروجی کارآمد هستند.
- توانایی میزبانی شدن روی ارائه دهنده خدمات ابری ریموت را دارند.
- قابل رمزنگاری هستند.
- قابل نامگذاری هستند.
- میتوانند محتوای از قبل بارگذاری شده از سوی کانتینر داشته باشند.
- تست کردن آنها کارآمد است.
اینها کارکردهای بسیار خوبی هستند. در ادامه نگاهی به طرز ساخت یک Volume میاندازیم.
ایجاد Volume
Volume-ها را میتوان با استفاده از یک داکرفایل یا یک درخواست API ساخت. در ادامه یک دستورالعمل داکرفایل را ملاحظه میکنید که یک volume را در زمان اجرا میسازد:
VOLUME /my_volume
سپس وقتی که کانتینر اجرا شد، داکر volume را با هر دادهای که از قبل در مکان معین شده موجود باشد، میسازد. دقت کنید که اگر یک volume با استفاده از یک داکرفایل ساخته شده باشد، همچنان باید نقطه mount برای volume در زمان اجرا تعیین شده باشد.
همچنین میتوان volume را با استفاده از یک قالببندی آرایه JSON در یک داکرفایل ایجاد کرد. Volume-ها در زمان اجرا باید از خط فرمان وهلهسازی شوند.
دستورهای CLI برای Volume
در ادامه برخی از دستورهای خط فرمان که برای کار با Volume-ها مورد نیاز هستند را توضیح دادهایم.
ایجاد Volume
یک Volume مستقل را میتوان با استفاده از دستور زیر ایجاد کرد:
docker volume create —-name my_volume
بازبینی Volume
Volume-های داکر را میتوان با استفاده از دستور زیر فهرست کرد:
docker volume ls
همچنین با استفاده از دستور زیر میتوان آنها را مورد بازبینی قرار داد:
docker volume inspect my_volume
حذف Volume
در ادامه میتوان volume را با استفاده از دستور زیر حذف کرد:
docker volume rm my_volume
برخی Volume-ها وجود دارند که دیگر از سوی کانتینر مورد استفاده قرار نمیگیرند. همه این Volume-های بیاستفاده را میتوان با استفاده از دستور زیر حذف کرد:
docker volume prun
در ادامه داکر به شما هشدار داده و در مورد اطمینان از حذف Volume-ها سؤال میکند.
اگر آن Volume با هر کانتینری مرتبط باشد، نمیتوانید تا زمانی که خود کانتینر حذف نشده است آن را حذف کنید. حتی در این صورت نیز داکر در برخی موارد درک نمیکند که کانتینر پاک شده است. اگر چنین حالتی پیش آمد، میتوانید از دستور زیر برای پاکسازی همه منابع داکر استفاده کنید:
docker system prune
در ادامه میتوانید آن volume را نیز حذف کنید.
کار با mount-- یا volume--
در اغلب موارد از فلگها برای اشاره به volume-ها استفاده میکنیم. برای نمونه برای ایجاد یک volume همزمان با ایجاد کانتینر میتوان از دستور زیر استفاده کرد:
docker container run --mount source=my_volume، target=/container/path/for/volume my_image
در زمانهای قدیم، یعنی تا پیش از سال 2017، استفاده از فلگ volume— کاملاً مرسوم بود. در ابتدا فلگ v-- یا volume-- برای کانتینرهای مستقل و فلگ mount-- نیز برای استفاده در Docker Swarms متداول بود. با این حال از داکر نسخه 17.06 به بعد میتوانید از mount-- در همه موارد استفاده کنید.
ساختار mount-- تا حدودی طولانیتر است؛ اما به چند دلیل نسبت به volume-- ارجحیت دارد. mount-- تنها روشی است که با آن میتوان با سرویسها کار کرد یا گزینههای درایور volume را تعیین نمود. استفاده از آن نیز سادهتر است.
شما در کدهای موجود موارد زیادی از استفاده از v-- را شاهد خواهید بود. آگاه باشید که قالببندی گزینهها در mount-- و volume-- از هم متفاوت است. در اغلب موارد امکان تعویض v-- در کد موجود با mount--، بدون نیاز به تغییرات دیگر وجود ندارد.
بزرگترین تفاوت این است که در ساختار v-- همه گزینهها در یک فیلد با هم ترکیب میشوند در حالی که در ساختار mount-- آنها از هم جدا شدهاند. در ادامه مثالهای عملی از mount-- را مشاهده میکنید.
فلگ mount---
در این فلگ، گزینهها به صورت جفتهای کلید-مقدار هستند. هر جفت به صورت زیر قالببندی میشود:
- key=value
و بین هر گزینه و گزینه بعد یک کاما درج میشود. گزینههای متداول به صورت زیر هستند:
- type
نوع mount را معین میکند. گزینههای موجود bind ،volume یا tmpfs هستند. این موارد کاملاً مشابه فلگ volume هستند.
- source
منبع mount را معین میکند. در مورد volume-های دارای نام این مقدار همان نام volume خواهد بود. در مورد volume-های بدون نام این گزینه حذف شده است. این کلید را میتوان به صورت کوتاه شده src نیز استفاده کرد.
- destination
مسیر فایل یا دایرکتوری mount شده در کانتینر را تعیین میکند. این کلید را میتوان به صورت dst یا target نیز استفاده کرد.
- readonly
یک volume را به صورت فقط خواندنی (read only) در کانتینر mount میکند. این کلید هیچ مقداری ندارد.
در مثال زیر گزینههای زیادی مورد استفاده قرار گرفته است:
docker run --mount type=volume،source=volume_name،destination=/path/in/container،readonly my_image
جمعبندی
در فهرست زیر دستورهای کلیدی volume-ها را به صورت فشرده ملاحظه میکنید:
- docker volume create
- docker volume ls
- docker volume inspect
- docker volume rm
- docker volume prune
روش استفاده از فلگ mount— در ساختاری به صورت زیر است:
docker run --mount my_options my_image
و گزینههای متداول برای آن نیز به صورت زیر هستند:
- type=volume
- source=volume_name
- destination=/path/in/container
- readonly
اینک شما با شیوه ذخیرهسازی دادهها در داکر آشنا شدهاید. امیدواریم این آخرین مطلب از سلسله مطالب آموزش داکر نیز مورد توجه شما قرار گرفته باشد.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش داکر (Docker) برای توسعهدهندگان
- مجموعه آموزشهای دروس مهندسی کامپیوتر
- آموزش داکر (بخش اول) — از صفر تا صد
- اکوسیستم داکر (Docker) — کامپوننت های رایج
- شبکه بندی و ارتباط ها در اکوسیستم داکر — راهنمای جامع
- زمانبندی و هماهنگی (Orchestration) در اکوسیستم داکر – راهنمای جامع
- داکر چیست ؟ | راهنمای شروع به کار با Docker — رایگان و به زبان ساده
==
سلام. من mount رو نمیفهمم.
میتونیم مشکل منو اینجوری بهش نگاه کنیم:
من میگم که سرویس با داکر میسازیم ولی میخواهیم بهش یک volume رو mount کنیم. حالا قبلا یک volume ساختیم (docker volume) یا سرویس داره (docker service)؟
بخش بعدی که درک نمیکنم اینه که ما برای هر سرویس، مگر نباید یک volume کاملا جدا، از volume بقیهی سرویس ها داشته باشیم تا تداخلی بین volume ها ایجاد نشه. چجوری همچین کاری میکنیم؟ ربط دادن volume به سرویس.
میشه برام قشنگ توضیح بدید یا یک پست جدید در همین موضوع تو فرادرس منتشر کنید. واقعا برام مشکل شده درکش.