مقدمه
اپلیکیشنها بهطور کلی به دو دسته تقسیم میشوند: اپلیکیشنهای Stateful، که دادهای ارزشمند برای نگهداری تولید و مدیریت میکنند، و اپلیکیشنهای Stateless، که این کار را نمیکنند. داکر برای هرکدام راهحلی دارد — فضای ذخیرهسازی محلی موقت برای دادههای گذرا، و volume برای هر چیزی که باید فراتر از عمر یک کانتینر باقی بماند.
کانتینرها بدون Volume
هر کانتینر از لایههای انباشته و فقطخواندنی ایمیج ساخته میشود که یک لایه نازک و نوشتنی به نام فضای ذخیرهسازی محلی (Local Storage) روی آنها قرار دارد. هرگونه تغییر فایل داخل یک کانتینر در حال اجرا، در این لایه نوشته میشود که داکر آن را در نمای کلی فایلسیستم کانتینر ادغام میکند. اما این فضای ذخیرهسازی کاملاً به چرخه حیات کانتینر وابسته است — همراه با کانتینر ایجاد و همراه آن حذف میشود، و روی لینوکس معمولاً زیر /var/lib/docker/ ذخیره میشود.
به همین دلیل، کانتینرها باید غیرقابلتغییر (immutable) در نظر گرفته شوند: بهجای تغییر پیکربندی یک کانتینر زنده، روش صحیح این است که یک کانتینر جدید با تغییرات موردنیاز ساخته و تست شود و جایگزین کانتینر قدیمی گردد. این لایه ذخیرهسازی محلی برای دادههای موقتی و غیرماندگار کاملاً مناسب است، اما برای چیزی که باید فراتر از خود کانتینر باقی بماند مناسب نیست.
کانتینرها با Volume
Volumeها این مشکل را با وجود بهعنوان اشیاء مستقل با چرخه حیات مخصوص به خود حل میکنند، که کاملاً از هر کانتینر منفردی جدا هستند. این کار سه مزیت کلیدی ارائه میدهد: volumeها پس از حذف کانتینر باقی میمانند، میتوان آنها را به سیستمهای ذخیرهسازی خارجی تخصصی نگاشت کرد، و چندین کانتینر — حتی روی هاستهای مختلف — میتوانند یک volume مشترک را به اشتراک بگذارند.
ساخت و مدیریت Volumeها
Volumeها اشیاء درجهیک داکر هستند که از طریق زیردستور docker volume مدیریت میشوند:
docker volume create myvolبهطور پیشفرض، داکر از درایور local استفاده میکند، به این معنا که volume فقط برای کانتینرهای روی همان هاست قابلدسترسی است. درایورهای شخصثالث این قابلیت را برای پشتیبانی از ذخیرهسازی ابری یا سیستمهای on-premises مانند SAN و NAS گسترش میدهند. volumeهای موجود را میتوان فهرست و بررسی کرد:
docker volume ls
docker volume inspect myvolخروجی inspect محل واقعی volume در فایلسیستم هاست را نشان میدهد، هرچند دسترسی مستقیم به آن از این طریق روش توصیهشدهای نیست. volumeهای استفادهنشده را میتوان بهصورت جداگانه یا دستهجمعی حذف کرد:
docker volume rm myvol
docker volume prune --allهیچکدام از این دستورات volumeای را که در حال حاضر داخل یک کانتینر mount شده حذف نمیکنند.
استفاده از Volume با کانتینرها
یک volume را میتوان با فلگ --mount داخل یک کانتینر mount کرد. اگر volume نامبردهشده از قبل وجود نداشته باشد، داکر آن را بهطور خودکار ایجاد میکند:
docker run -it --name voltainer --mount source=bizvol,target=/vol alpineدادههای نوشتهشده در مسیر mountشده، حتی پس از حذف کانتینر نیز در volume باقی میمانند. این ویژگی امکان میدهد کانتینر اصلی بهطور کامل حذف شود و همان volume، با تمام دادههای دستنخوردهاش، داخل یک کانتینر کاملاً جدید mount شود:
docker run -it --name newctr --mount source=bizvol,target=/vol alpine shvolumeها همچنین میتوانند داخل یک Dockerfile با دستورالعمل VOLUME تعریف شوند، هرچند نگاشت واقعی به دایرکتوری هاست فقط در زمان استقرار قابل مشخص شدن است، نه در خود Dockerfile.
اشتراکگذاری ذخیرهسازی بین نودها
یکپارچهسازی داکر با سیستمهای ذخیرهسازی خارجی — ذخیرهسازی ابری یا NAS/SAN سازمانی — امکان میدهد همان volume مشترک به کانتینرهای در حال اجرا روی هاستهای کاملاً متفاوت ارائه شود. این کار نیازمند یک درایور volume سازگار و طراحی دقیق اپلیکیشن است، زیرا نوشتن همزمان از کانتینرهای روی نودهای مختلف میتواند در صورت عدم هماهنگی صحیح بهروزرسانیهای داده مشترک، منجر به خرابی داده شود — برای مثال، نوشتن کششده یک کانتینر بهطور خاموش، بهروزرسانی جدیدتر کانتینر دیگری را بازنویسی کند.
نتیجهگیری
Volumeهای داکر روش توصیهشده برای مدیریت هر دادهای هستند که باید فراتر از عمر یک کانتینر باقی بماند. با وجود بهعنوان اشیاء مستقل و درجهیک، آنها امکان میدهند کانتینرها یکبارمصرف و غیرقابلتغییر باقی بمانند، در حالی که دادهای که واقعاً اهمیت دارد، امن، قابلحمل و قابلاشتراک در سراسر چرخه حیات کانتینر باقی میماند.