مدیریت دادهها و Volumeها در Docker
ماهیت موقت کانتینرها (Ephemeral Nature)
لایهی خواندن و نوشتن کانتینرها بهگونهای طراحی شده است که موقت (Ephemeral) باشد. این یعنی:
- اگر کانتینر یک پایگاه داده بدون متصل کردن Volume حذف شود (
docker rm)، دادهها و تغییرات ثبتشده در لایهی کانتینر از بین خواهند رفت. - کانتینرها بهگونهای طراحی شدهاند که در صورت نیاز، بدون نگرانی از دست رفتن دادههای اصلی بتوان آنها را بازآفرینی یا با نسخهی جدید جایگزین کرد (Stateless vs Stateful).
برای حل این مسئله و ذخیرهسازی ماندگار دادهها (Persistent Storage)، داکر ۳ مکانیزم اصلی ارائه میدهد:
انواع ذخیرهسازی در Docker
۱. داکر والیوم (Named Volumes) - گزینهی استاندارد و توصیهشده
والیومها دایرکتوریهایی هستند که مستقیماً توسط داکر مدیریت میشوند (بهطور پیشفرض در مسیر /var/lib/docker/volumes/ روی سرور لینوکس).
- سیستمعامل میزبان یا کاربران معمولی به محتوای آن دسترسی مستقیم ندارند.
- مستقل از چرخهی حیات کانتینرها هستند؛ اگر کانتینر پاک شود، Volume دستنخورده باقی میماند.
- گزینهی استاندارد و توصیهشده برای ذخیرهسازی ماندگار پایگاههای داده (مانند PostgreSQL، MySQL، MongoDB).
۲. بایند مانت (Bind Mounts)
اتصال مستقیم یک دایرکتوری یا فایل دلخواه از هاست لینوکسی به مسیری داخل کانتینر (مانند نگاشت /home/ubuntu/app/src به /app/src).
- هر تغییری در فایلهای سیستم میزبان داخل کانتینر دیده میشود و برعکس.
- گزینهی عالی برای محیطهای توسعه (Live Reload کدهای برنامهنویسی) و قرار دادن فایلهای تنظیماتی سرور (مانند کانفیگ Nginx).
۳. مانت موقت در رم (tmpfs Mount)
ذخیرهسازی فایلها روی حافظهی موقت (RAM) سرور میزبان بدون نوشتن روی دیسک.
- سرعت خواندن و نوشتن فوقالعاده بالا.
- با خاموش شدن کانتینر، دادهها پاک میشوند؛ مناسب نگهداری توکنهای امنیتی موقت یا کشهای پرسرعت.
دستورهای مدیریت Volume
نحوهی اتصال Volume به کانتینر: -v در مقابل --mount
در داکر دو سینتکس برای اتصال فضای ذخیرهسازی وجود دارد:
- سینتکس کلاسیک
-v(کوتاه): - سینتکس مدرن و خواناتر
--mount(پیشنهاد در اتوماسیون و اسکریپتها):
آزمایش عملی: پایداری دیتابیس PostgreSQL با Named Volume
بیایید ماندگاری دادهها را با اجرای یک کانتینر دیتابیس تست کنیم:
گام ۱: اجرای دیتابیس با اتصال یک Volume اختصاصی
گام ۲: ورود به دیتابیس و ایجاد یک جدول و رکورد
داخل محیط psql دستورات SQL زیر را وارد کنید:
گام ۳: حذف کانتینر دیتابیس!
اکنون با اطمینان کانتینر را به اجبار متوقف و حذف میکنیم:
گام ۴: اجرای یک کانتینر کاملاً جدید با همان والیوم قبلی
گام ۵: بررسی بقای دادهها
خروجی نشان میدهد که اطلاعات دقیقاً در جای خود باقی ماندهاند:
با این آزمایش دیدیم که با تخریب کانتینرها هیچ آسیبی به دادههای پایدار وارد نمیشود.
مثال عملی Bind Mount در محیط توسعه
فرض کنید میخواهید صفحهی اول یک وبسرور Nginx را بدون نیاز به ساخت مجدد ایمیج (docker build) به صورت زنده ویرایش کنید:
گام ۱: ساخت فایل اولیه و اجرای کانتینر با Bind Mount
(پسوند :ro دسترسی کانتینر به فایلهای سرور را Read-Only میکند تا امنیت حفظ شود).
گام ۲: تست خروجی اولیه با curl
خروجی زیر دریافت میشود:
گام ۳: تغییر مستقیم محتوای فایل روی هاست و بررسی زنده با curl
اکنون بدون ریستارت یا تغییر کانتینر، فایل index.html را روی هاست تغییر دهید:
مجدداً با curl وضعیت را بسنجید:
خروجی بلافاصله تغییر را نمایش میدهد:
این آزمایش نشان میدهد که با Bind Mount، کانتینر مستقیماً فایلهای مسیر هاست را میخواند؛ به همین دلیل این روش بهترین ابزار برای توسعهی زنده (Live Development) بدون اتلاف وقت برای بازسازی ایمیج است.
منابع یادگیری
ویدیو
- آشنایی و کارهای مقدماتی با داکر قسمت دو از سه — جادی — سناریوی کار با فایلها و ذخیرهسازی پایدار دادهها در داکر
- Learn Docker Storage (Volumes & Bind Mounts) — Network Direction — راهنمای بصری و جامع درک سازوکار انواع Volumeها و Bind Mountها در داکر
مستندات و مقالات
- Manage data in Docker — Official Docs — بررسی انواع ذخیرهسازی در مستندات رسمی