مدیریت داده‌های ماندگار در داکر با Volume

کانتینرها به‌طور پیش‌فرض یک لایه نوشتنی موقت دریافت می‌کنند که با حذف کانتینر از بین می‌رود — این برای داده‌های موقتی خوب است، اما برای هر چیزی که ارزش نگهداری دارد ریسک‌آور است. این مقاله توضیح می‌دهد که volumeهای داکر چگونه داده‌های ماندگار را از چرخه حیات کانتینر جدا می‌کنند و نحوه ساخت، استفاده و اشتراک‌گذاری امن آن‌ها را بررسی می‌کند.

Docker Volumeداده ماندگار, اپلیکیشنStateful

~4 دقیقه مطالعه · آخرین به‌روزرسانی ۱۴ شهریور ۱۴۰۵

مقدمه

اپلیکیشن‌ها به‌طور کلی به دو دسته تقسیم می‌شوند: اپلیکیشن‌های 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 sh

volumeها همچنین می‌توانند داخل یک Dockerfile با دستورالعمل VOLUME تعریف شوند، هرچند نگاشت واقعی به دایرکتوری هاست فقط در زمان استقرار قابل مشخص شدن است، نه در خود Dockerfile.

اشتراک‌گذاری ذخیره‌سازی بین نودها

یکپارچه‌سازی داکر با سیستم‌های ذخیره‌سازی خارجی — ذخیره‌سازی ابری یا NAS/SAN سازمانی — امکان می‌دهد همان volume مشترک به کانتینرهای در حال اجرا روی هاست‌های کاملاً متفاوت ارائه شود. این کار نیازمند یک درایور volume سازگار و طراحی دقیق اپلیکیشن است، زیرا نوشتن هم‌زمان از کانتینرهای روی نودهای مختلف می‌تواند در صورت عدم هماهنگی صحیح به‌روزرسانی‌های داده مشترک، منجر به خرابی داده شود — برای مثال، نوشتن کش‌شده یک کانتینر به‌طور خاموش، به‌روزرسانی جدیدتر کانتینر دیگری را بازنویسی کند.

نتیجه‌گیری

Volumeهای داکر روش توصیه‌شده برای مدیریت هر داده‌ای هستند که باید فراتر از عمر یک کانتینر باقی بماند. با وجود به‌عنوان اشیاء مستقل و درجه‌یک، آن‌ها امکان می‌دهند کانتینرها یک‌بارمصرف و غیرقابل‌تغییر باقی بمانند، در حالی که داده‌ای که واقعاً اهمیت دارد، امن، قابل‌حمل و قابل‌اشتراک در سراسر چرخه حیات کانتینر باقی می‌ماند.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

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

مدل امنیتی داکر بر پایه دفاع چندلایه ساخته شده و فناوری‌های شناخته‌شده kernel لینوکس را با تنظیمات پیش‌فرض معقول ترکیب می‌کند. این مقاله توضیح می‌دهد که namespaceها، control groupها، capabilityها، Mandatory Access Control و seccomp چگونه در کنار هم کانتینرها را ایزوله و ایمن می‌کنند.

ادامه

شبکه‌های Overlay در داکر چگونه کار می‌کنند؛ نگاهی به VXLAN

شبکه‌های overlay امکان می‌دهند کانتینرهای روی هاست‌های مختلف طوری با هم ارتباط برقرار کنند که گویی یک شبکه مسطح مشترک دارند، و ستون فقرات بیشتر اپلیکیشن‌های میکروسرویس ابرمحور را تشکیل می‌دهند. این مقاله نحوه ساخت، رمزنگاری و تست یک شبکه overlay داکر روی یک کلاستر Swarm را بررسی کرده و فناوری تونل‌زنی VXLAN پشت آن را توضیح می‌دهد.

ادامه

اتصال کانتینرهای داکر به VLAN و توزیع بار با Swarm

فراتر از شبکه‌های ساده bridge، داکر امکاناتی برای اتصال مستقیم کانتینرها به VLANهای فیزیکی موجود، تفکیک خودکار نام سرویس‌ها و توزیع ترافیک در سراسر یک کلاستر Swarm ارائه می‌دهد. این مقاله درایور macvlan، سرویس داخلی Service Discovery و مکانیزم Ingress Load Balancing در Swarm را بررسی می‌کند.

ادامه

شبکه‌سازی در داکر؛ آشنایی با CNM، Libnetwork و شبکه‌های Bridge

شبکه‌سازی در داکر بر پایه یک طراحی باز به نام Container Network Model ساخته شده که توسط libnetwork پیاده‌سازی و با درایورهای قابل‌جایگزینی گسترش می‌یابد. این مقاله تئوری پشت شبکه داکر را بررسی کرده و نحوه ساخت و تست شبکه‌های bridge تک‌هاست، از جمله تفکیک نام و نگاشت پورت را توضیح می‌دهد.

ادامه

استقرار و مدیریت کلاستر چندنودی با Docker Swarm

Docker Swarm گروهی از نودهای داکر را به یک کلاستر امن و بسیار در دسترس با قابلیت ارکستریشن داخلی تبدیل می‌کند. این مقاله ساخت یک swarm چندنودی، استقرار یک اپلیکیشن میکروسرویس به‌صورت اعلانی و انجام به‌روزرسانی‌های تدریجی بدون از دست دادن سازگاری با وضعیت مطلوب را بررسی می‌کند.

ادامه

ساخت و اجرای اپلیکیشن‌های WebAssembly به‌عنوان کانتینر داکر

WebAssembly (Wasm) به‌عنوان جایگزینی سبک‌وزن برای کانتینرهای سنتی در حال ظهور است، و داکر اکنون از ساخت، اشتراک‌گذاری و اجرای اپلیکیشن‌های Wasm با ابزارهای آشنا پشتیبانی می‌کند. این مقاله نوشتن یک اپلیکیشن ساده Wasm با Spin، کانتینری کردن آن با داکر و اجرای آن به‌عنوان کانتینر Wasm را بررسی می‌کند.

ادامه