Docker Desktop ব্যবহারকারী একটি Mac-এ, Compose-এর একটি named volume একটি অস্থায়ী কন্টেইনারে মাউন্ট করে এবং আপনার Mac-এর একটি ফোল্ডারে tar আর্কাইভ লিখে ব্যাকআপ নিন। কন্টেইনারগুলি সরানোর আগে ভলিউমের নাম পরীক্ষা করুন, এটিতে লিখতে পারে এমন পরিষেবাগুলি বন্ধ করুন, আর্কাইভ তৈরি করুন এবং ফাইলটি তৈরি হয়েছে কিনা তা নিশ্চিত করুন। একটি সাধারণ docker compose down named volume-গুলিকে বজায় রাখে; docker compose down --volumes সংশ্লিষ্ট প্রজেক্ট ভলিউমগুলি সরিয়ে দেয়, তাই ব্যাকআপ সম্পূর্ণ না হওয়া পর্যন্ত এটি চালাবেন না।

১. Compose ভলিউম এবং এর মাউন্ট পাথ শনাক্ত করুন

Terminal-এ, প্রজেক্টের Compose ফাইল ধারণকারী ডিরেক্টরিতে যান। সার্ভিসের মাউন্টটি খুঁজুন, যেমন db-data:/var/lib/postgresql/data, এবং volumes:-এর অধীনে এর সাথে মিল থাকা শীর্ষ-স্তরের ডিক্লেয়ারেশনটি দেখুন। বাম দিকের অংশ, db-data, হলো Compose কী (key); কোলনের পরের কন্টেইনার পাথটি হলো যেখানে অ্যাপ্লিকেশন ডেটা দেখতে পায়। Compose একটি প্রজেক্ট প্রিফিক্স সহ প্রকৃত Docker ভলিউম তৈরি করতে পারে, যেখানে কনফিগার করা একটি name: এটিকে একটি কাস্টম নাম দিতে পারে। Docker-এর Compose ভলিউম সংক্রান্ত রেফারেন্স এই নামকরণের নিয়মগুলি বর্ণনা করে।

বর্তমান Compose প্রজেক্ট দ্বারা ব্যবহৃত ভলিউমগুলির তালিকা দেখুন:

docker compose volumes

নির্দিষ্ট Docker ভলিউমটি শনাক্ত করতে সেই আউটপুট এবং Compose ফাইলটি ব্যবহার করুন। প্রজেক্টটি যদি একাধিক Compose ফাইল, প্রোফাইল বা কাস্টম প্রজেক্ট নাম ব্যবহার করে, তবে স্ট্যাক চালু করার সময় যে অপশনগুলি ব্যবহার করা হয়েছিল, পরিদর্শনের সময়ও একই অপশন ব্যবহার করুন। শুধুমাত্র YAML কী দেখে প্রকৃত ভলিউম নাম অনুমান করবেন না। docker volume ls সমস্ত Docker ভলিউম দেখাতে পারে, তবে এতে সম্পর্কহীন প্রজেক্টের ভলিউমও অন্তর্ভুক্ত থাকতে পারে।

২. আর্কাইভ তৈরির আগে ডেটা রাইট করা বন্ধ করুন

ফাইল কপি করার সময় যদি ডাটাবেস পরিবর্তিত হতে থাকে, তবে ফাইলসিস্টেমের আর্কাইভটি একটি সামঞ্জস্যপূর্ণ ডাটাবেস ব্যাকআপ নাও হতে পারে। প্রথমে অ্যাপ্লিকেশনটি স্বাভাবিকভাবে বন্ধ করুন; একটি Compose স্ট্যাকের ক্ষেত্রে, docker compose stop কন্টেইনার এবং ভলিউমগুলি বজায় রেখেই এর পরিষেবাগুলি বন্ধ করে। ডাটাবেসের যদি অ্যাপ্লিকেশন-নির্দিষ্ট ডাম্প বা ব্যাকআপ পদ্ধতি থাকে, তবে ট্রানজ্যাকশন-স্তরের সামঞ্জস্যের প্রয়োজন হলে সেটি ব্যবহার করুন, এবং আপনার যদি ফাইল-স্তরের কপির প্রয়োজন হয় তবে অতিরিক্তভাবে একটি ভলিউম আর্কাইভও তৈরি করুন।

এই পর্যায়ে docker compose down --volumes এড়িয়ে চলুন। Compose-এর নথিপত্রে উল্লেখ রয়েছে যে down ডিফল্টভাবে প্রজেক্টের কন্টেইনার এবং নেটওয়ার্কগুলি সরিয়ে দেয়, এবং --volumes উপযুক্ত named এবং anonymous ভলিউমগুলিও সরিয়ে দেয়। বাহ্যিক (external) ভলিউমগুলি down দ্বারা সরানো হয় না। Docker-এর compose down রেফারেন্স এই পার্থক্য ব্যাখ্যা করে।

৩. Mac-এর একটি ফোল্ডারে একটি tar ব্যাকআপ তৈরি করুন

নিচের উদাহরণে ধরে নেওয়া হয়েছে যে প্রকৃত Docker ভলিউমটির নাম myproject_db-data। আপনার শনাক্ত করা সঠিক নামটি দিয়ে এই মানটি প্রতিস্থাপন করুন। এটি বর্তমান Mac ডিরেক্টরিতে db-data-backup.tar সংরক্ষণ করে। Docker Desktop একটি Linux VM-এর ভেতরে Docker Engine চালায়, তাই named volume-এর ডেটা Docker দ্বারা পরিচালিত হয়; এই পদ্ধতিটি Linux VM স্টোরেজ পাথের উপর নির্ভর না করে একটি অস্থায়ী কন্টেইনারের মাধ্যমে এটি কপি করে। Docker-এর ভলিউম গাইড এই হেল্পার-কন্টেইনার এবং tar পদ্ধতির বিবরণ দেয়, এবং Docker Desktop-এর Mac সেটিংস সংক্রান্ত নথিপত্র Linux VM এবং হোস্ট ফাইল শেয়ারিংয়ের বর্ণনা দেয়।

volume_name='myproject_db-data'
backup_dir="$PWD"
backup_file='db-data-backup.tar'

docker run --rm \
  --mount "type=volume,source=$volume_name,target=/source,readonly" \
  --mount "type=bind,source=$backup_dir,target=/backup" \
  alpine sh -c 'tar -C /source -cf "/backup/'"$backup_file"'" .'

আর্কাইভটি $PWD দ্বারা নির্দেশিত ডিরেক্টরিতে লেখা হয়, তাই কমান্ডটি চালানোর আগে পর্যাপ্ত খালি জায়গা রয়েছে এমন একটি অবস্থান বেছে নিন। কপি করার সময় দুর্ঘটনাবশত পরিবর্তন রোধ করতে হেল্পার কন্টেইনারে ভলিউমটি রিড-অনলি (read-only) হিসেবে মাউন্ট করা হয়; এটি নিজে অন্যান্য কন্টেইনারের ডেটা রাইট করা থামায় না, যে কারণে প্রথমে রাইটারগুলি বন্ধ করা জরুরি। কমান্ডটি কাজ করার জন্য Docker Desktop চালু থাকা এবং bind mount-এর জন্য Mac ফোল্ডারটি অ্যাক্সেসযোগ্য হওয়া প্রয়োজন। মাউন্ট ব্যর্থ হলে, ফোল্ডারটির জন্য Docker Desktop-এর ফাইল-শেয়ারিং অ্যাক্সেস পরীক্ষা করুন।

আর্কাইভটি তৈরি হয়েছে কিনা এবং এর আকার যুক্তিসঙ্গতভাবে অশূন্য (non-zero) কিনা তা পরীক্ষা করুন:

ls -lh "$backup_file"

এটি শুধুমাত্র নিশ্চিত করে যে একটি ফাইল তৈরি হয়েছে, এর ভেতরের ডেটা পুনরুদ্ধারযোগ্য অ্যাপ্লিকেশন ব্যাকআপ কিনা তা নয়। আর্কাইভটি Docker-পরিচালিত ভলিউমের বাইরে কোথাও রাখুন এবং ডেটা মুছে ফেলার আগে এটি আপনার সাধারণ ব্যাকআপ গন্তব্যে কপি করার বিষয়টি বিবেচনা করুন।

৪. আপনার টার্গেট যাচাই করার পরেই কেবল কন্টেইনারগুলি সরান

আর্কাইভটি সুরক্ষিত হয়ে গেলে, প্রজেক্টের কন্টেইনারগুলি সরান:

docker compose down

এটি ডিফল্টভাবে named volume টিকে অপরিবর্তিত রাখে। আপনার উদ্দেশ্য যদি ভলিউমটিও মুছে ফেলা হয়, তবে প্রথমে প্রজেক্ট এবং ভলিউমের নাম পুনরায় যাচাই করুন, তারপর আপনি যখন সেই ডেটা মুছে ফেলতে পুরোপুরি প্রস্তুত কেবল তখনই docker compose down --volumes ব্যবহার করুন। কাস্টম নামযুক্ত বা বাহ্যিক ভলিউমের লাইফসাইকেল আচরণ ভিন্ন হতে পারে; অপশনটি প্রতিটি ভলিউমকে প্রভাবিত করবে এমনটা ধরে নেওয়ার চেয়ে Compose-এর সংজ্ঞা এবং Docker-এর কমান্ড রেফারেন্স দেখে নিন।

রিস্টোর করার বিবেচ্য বিষয়

Docker-এর নির্দেশিত ভলিউম ওয়ার্কফ্লো গন্তব্য ভলিউমটি মাউন্ট করে এবং সেটিতে আর্কাইভটি এক্সট্র্যাক্ট করে একটি tar আর্কাইভ রিস্টোর করে। ডাটাবেস ফাইলের ক্ষেত্রে, ডাটাবেস সার্ভিস বন্ধ থাকা অবস্থায় একটি নতুন বা ইচ্ছাকৃতভাবে খালি করা ভলিউমে রিস্টোর করুন, এবং ডাটাবেস ইমেজের ওনারশিপ ও ইনিশিয়ালাইজেশন সংক্রান্ত প্রয়োজনীয়তাগুলি অনুসরণ করুন। আপনার এখনও প্রয়োজন এমন ডেটা রয়েছে এমন ভলিউমের উপর এটি এক্সট্র্যাক্ট করবেন না: বিদ্যমান ফাইলগুলির সাথে আর্কাইভের সংঘাত হতে পারে, এবং tar এক্সট্র্যাকশন কোনো নিরাপদ মার্জ কৌশল নয়। আপনার যদি ডাটাবেস-সামঞ্জস্যপূর্ণ রিকভারি পয়েন্টের প্রয়োজন হয়, তবে সাধারণ ফাইল আর্কাইভের পাশাপাশি, বা এর পরিবর্তে, ডাটাবেসের নিজস্ব ব্যাকআপ এবং রিস্টোর প্রক্রিয়া ব্যবহার করুন।

সূত্রসমূহ