آشنایی با Volumeها در داکر
Volume ها در داکر
نتورک داکر در سالهای اخیر توانسته است توجه برنامهنویسان زیادی را به خود جلب کند. این شبیهسازی لایهی اپلیکیشن شبکه بهعنوان جایگزینی سبکتر برای ماشین مجازی (Virtual Machine) به بازار معرفی شد و عملکرد موفقیت آمیزی از لحاظ جلب رضایت مهندسان نرمافزار داشت. با نتورک داکر برنامهنویسی تیمی بهمراتب راحتتر میشود. اما استفاده از آن چالشهای مخصوصبهخود را هم دارد. برای مثال اطلاعات مهمترین سرمایه شرکتهای دیجیتال بوده و حفاظت از آنها بسیار مهم است. داکر بهصورت پیشفرض اطلاعات را در لایهای ذخیره میکند که با از بین رفتن حامل کد (کانتینر) از بین خواهد رفت. در چنین شرایطی نیاز ویژهای برای ذخیره کردن اطلاعات روی یک فضای امن حس میشود. یکی از راههای رفع این نیاز استفاده از Volume ها در داکر است که در ادامه آن را بهطور کامل توضیح خواهیم داد.
مدیریت اطلاعات در داکر و روش های مختلف آن
زمانی که شما از یک داکر استفاده میکنید، تمام فایلهای ایجاد شده در یک لایه read-write ذخیره میشوند. این لایه به شما امکان نوشتن و خواندن را میدهد اما فقط تا زمانی که کانتینر وجود داشته باشد. اگر کانتینر به هردلیلی از بین برود، اطلاعات شما هم از بین خواهند رفت. گاهی هم اطلاعات موجود در یک کانتینر برای راهاندازی فرآیندی در یک کانتینر دیگر لازم است. در این موارد نیاز داریم که یک کپی از اطلاعاتمان داشتهباشیم. اینجا است که داکر روشهایی را برای تهیه نسخه پشتیبان از فایلها پیشروی شما قرار میدهد.
دو گزینهی اصلی که توسط داکر برای ذخیره فایلها روی هاست ارائه میشوند، volumeها و bind mountها هستند. برای کسانی که از سیستمعامل لینوکس استفاده میکنند، یک روش دیگر با نام tmpfs mount هم وجود دارد. اگر داکر را روی ویندوز اجرا کردهاید، روش سوم برای شما named pipe نام دارد. در شکل زیر تفاوت این سه روش در ذخیرهسازی فایل روی هاست را مشاهده میکنید:
انواع روش های ذخیره اطلاعات در هاست
- Volumeها اطلاعات را در بخشی با نام «منطقه داکر» (Docker Area) ذخیرهسازی میکنند. دلیل نامگذاری این بخش مدیریت شدن آن توسط داکر است. بهعبارتدیگر، فرآیندهای خارج از داکر اجازه دسترسی به فایلهای این بخش را ندارند. Volume بهترین راه ذخیره و نگهداری اطلاعات در داکر بهحساب میآید.
- Bind Mountها ممکن است روی هر قسمتی از هاست ذخیره شوند. مسیر ذخیرهسازی آنها ممکن است مسیرهای مهم سیستم باشد. فرآیندهای خارج از داکر که روی هاست داکر انجام میشوند و همچنین کانتینرهای دیگر میتوانند در فایلهای ذخیره شده توسط Bind Mount در هر زمان تغییر ایجاد کنند.
- tmpfs Mountها روی حافظه فیزیکی کامپیوتر میزبان ذخیره میشوند. tmpfs هیچگاه در مسیرهای مهم کامپیوتر ذخیره نخواهند شد.
کاربرد Volume ها در داکر
توسعهدهندگان داکر از Volumeها بهعنوان بهترین روش ذخیره و محافظت از اطلاعات داکر یاد میکنند. تفاوت volume با روشهای دیگر مثل bind mounts و tmpfs در وابسته نبودن volume به سیستمعامل است. Volumeها در بخشی از هاست ذخیره میشوند که مستقیما توسط خود نتورک داکر اداره میشود. از جمله مزایای کلیدی استفاده از Volume ها میتوان به موارد زیر اشاره کرد:
- خیلی ساده میتوان از Volumeها بکاپ گرفت و آنها را به سیستم دیگری منتقل کرد.
- شما از طریق کدنویسی یا استفاده از وبسرویس داکر میتوانید Volumeها را مدیریت کنید.
- Volumeها روی هر دو سیستم عامل لینوکس و ویندوز بدون مشکل کار میکنند (محدود به سیستمعامل نیستند).
- Volumeها در زمان به اشتراک گذاشته شدن میان چند کانتینر، امنیت بالاتری را ارائه میدهند.
- درایورهای Volume به شما اجازه ذخیره Volumeها روی هاستهای از راه دور یا سرویسهای ابری را برای رمزنگاری محتوای آنها (یا اضافه کردن کاربردهای دیگر) میدهند.
- میتوان فضای Volumeهای جدید را برای یک کانتینر از قبل رزرو کرد.
- سرعت عملکرد سیستم با استفاده از Volumeها به مراتب بیشتر از زمانی است که Bind mount ها یا روشهای دیگر به کار گرفته میشوند.
- استفاده از Volumeها باعث افزایش اندازه کانتینر نمیشود چون که آنها خارج از چرخه حیات کانتینر وجود دارند.
کار با Volume ها در داکر
در این بخش میخواهیم مبانی کار با Volumeها در داکر را توضیح دهیم. قبل از همه چیز لازم است دستور ایجاد Volume در داکر را یاد بگیریم:
docker volume create [OPTIONS] [VOLUME]
با این دستور یک Volume با نامی تصادفی ایجاد میشود. برای تعیین مشخصات باید از دستورات زیر استفاده کرد:
دستور | پیشفرض | عملکرد |
--driver , -d |
local |
مشخص کردن نام درایور Volume |
--label |
تنظیم اطلاعات متا | |
--name |
تعیین نام Volume | |
--opt , -o |
تنظیمات درایور |
یکی از ویژگیهای مهم Volume این است که چند کانتینر بهصورت همزمان میتوانند به آن متصل باشند و بدون مشکل فایلها را جابهجا یا ویرایش کنند. دقت داشته باشید که نام تمام Volumeها در هر درایور باید باید منحصربهفرد باشد. اگر این نکته را در نامگذاری خود در نظر نگیرید، با پیام زیر روبرو خواهید شد:
A volume named "hello" already exists with the "some-other" driver. Choose a different volume name
گزینه های درایور
بعضی درایورها گزینههایی برای شخصیسازی ساخت Volume دارند. گزینههای درایور با دو پرچم o- و opt– جابهجا میشوند. به مثال زیر توجه کنید:
$ docker volume create --driver fake \
--opt tardis=blue \
--opt timey=wimey \
foo
این گزینهها بسته به نوع درایور ممکن است تغییرات مختلفی را روی Volume اعمال کنند یا حتی هیچکاری انجام ندهند.
دستورات مرتبط با Volume ها در داکر
دستور | عملکرد |
docker Volume | مدیریت Volume ها |
docker volume create | ساخت یک Volume |
docker volume inspect | نمایش اطلاعات جزیی درباره یک یا چند Volume |
docker volume ls | فهرست کردن Volume ها |
docker volume prune | پاک کردن تمام Volume های بلااستفاده و محلی |
docker volume rm | پاک کردن یک یا چند Volume |
تفاوت بین پرچم های v- و mount–
در زمان کدنویسی برای کار با Volumeها در داکر میتوان از این دو پرچم استفاده کرد. با این تفاوت که پرچم v- در زمان کار با سرویسها قابل استفاده نیست. در مثال زیر میخواهیم با استفاده از یک Volume، یک کانتینر را راهاندازی کنیم. این کار را یکبار با پرچم v– و بار دیگر با پرچم mount– انجام میدهیم.
mount–
$ docker run -d \
--name devtest \
--mount source=myvol2,target=/app \
nginx:latest
v–
$ docker run -d \
--name devtest \
-v myvol2:/app \
nginx:latest
تمام کدهای کار با volume (بهجز موارد کار با سرویسها) را میتوان با هر دو پرچم نوشت و تفاوتی در نتیجه وجود نخواهد داشت. با قطعه کد زیر هم میتوانید از ایجاد موفقیت آمیز Volume اطمینان حاصل کنید:
"Mounts": [
{
"Type": "volume",
"Name": "myvol2",
"Source": "/var/lib/docker/volumes/myvol2/_data",
"Destination": "/app",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
برای متوقف کردن کانتینر و پاک کردن داکر هم میتوان از کد زیر استفاده کرد:
$ docker container stop devtest
$ docker container rm devtest
$ docker volume rm myvol2
راه اندازی یک سرویس با Volume
زمانی که یک سرویس را راهاندازی کرده و یک Volume را تعریف میکنید، هر کانتینر حامل سرویس، Volume محلی خود را دارد. اگر از درایور local استفاده کرده باشید، امکان بهاشتراکگذاشتن اطلاعات بین کانتینرها وجود ندارد. دقت داشته باشید که تنها بعضی از درایورهای Volume از ذخیره اشتراکی پشتیبانی میکنند. در مثال بعدی قصد داریم یک سرویس nginx با چهار ماکت ایجاد کنیم که همگی از Volume محلی myvol2 استفاده میکنند.
docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=myvol2,target=/app \
nginx:latest
برای مطمئن شدن از آغازبهکار سرویس از دستور زیر استفاده میشود:
$ docker service ps devtest-service
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
۴d7oz1j85wwn devtest-service.1 nginx:latest moby Running Running 14 seconds ago
با دستور زیر هم سرویس پاک شده و تمام عملیات متوقف میشوند:
docker service rm devtest-service
کلام آخر
نتورک داکرها ابزاری کاربردی و مهم برای برنامهنویسی تیمی بهحسابمیآیند. با استفاده از نتورک داکر دیگر لازم نیست تمام موارد لازم برای اجرای یک کد را روی کامپیوتر شخصی خود داشته باشید، بلکه کافی است به سرور متصل شده و کد را روی یک شبیهسازی سیستمعامل اجرا کنید. داکر بهعنوان جایگزینی سبک و سریع برای ماشین مجازی ارائه شده است و تا گوی سبقت را نیز از رقیب مهم و محبوب خود تا حدودی ربوده است.
یکی از مهمترین نگرانیهای مدیران پروژه و برنامهنویسان در استفاده از داکر، حفاظت از اطلاعات سازمان و تیم است. چون که داکر بهطورپیشفرض، فایلها را در محلی ذخیره میکند که هر لحظه ممکن است از بین برود. برای همین سازندگان داکر به فکر ارائه راههایی برای ذخیره امن فایلها روی هاست افتادند. بهترین راهی که برای ذخیره امن و دائمی فایلها در کنار دسترسی سریع به آنها وجود دارد، استفاده از Volume ها در داکر است. در این مقاله کوشیدیم کاربرد Volume، تفاوت آن با دیگر روشهای ذخیره فایل در داکر و مبانی کار با آن از طریق کدزنی را به شما نشان دهیم.