ভলিউম: কন্টেইনার ডেটা আসলে কোথায় থাকে
নেমড ভলিউম ও বাইন্ড মাউন্টের পার্থক্য, ডিস্কে এগুলো আসলে কোথায় থাকে, এবং কন্টেইনার পুনরায় তৈরি করার সময় ডেটাবেস হারানো এড়ানোর উপায়।
আপডেট: ২৩ আগস্ট, ২০২৬
একটি কন্টেইনার ডিসপোজেবল। এর ভেতরে লেখা সবকিছুই এর সাথে হারিয়ে যায়। ডেটা অবশ্যই বাইরে থাকতে হবে, এবং এর জন্য ঠিক দুটি উপায় আছে: একটি নেমড ভলিউম এবং একটি হোস্ট ডিরেক্টরি বাইন্ড মাউন্ট।
দুটি উপায় এবং কখন কোনটি ব্যবহার করবেন
services:
db:
image: postgres:17
volumes:
- db-data:/var/lib/postgresql/data # named volume
app:
image: nginx:1.27
volumes:
- ./site:/usr/share/nginx/html:ro # directory bind mount
- ./nginx.conf:/etc/nginx/nginx.conf:ro
volumes:
db-data:
একটি নেমড ভলিউম Docker নিজেই তৈরি ও সংরক্ষণ করে, /var/lib/docker/volumes/<name>/_data-তে। এর ভেতরের পারমিশন ইমেজ স্বয়ংক্রিয়ভাবে সেট করে। এভাবেই ডেটাবেস এবং অভ্যন্তরীণ সার্ভিসের স্টেট রাখা হয়।
একটি ডিরেক্টরি বাইন্ড মাউন্ট হলো মেশিনের ডিস্কের একটি সাধারণ পাথ। এভাবেই আপনি কনফিগারেশন ফাইল, ওয়েবসাইটের স্ট্যাটিক অ্যাসেট এবং সার্টিফিকেট সরবরাহ করেন: এগুলো এডিটরে সম্পাদনা করা এবং রিপোজিটরিতে রাখা সুবিধাজনক।
:ro ফ্ল্যাগ মাউন্টটিকে রিড-অনলি করে। কন্টেইনারের যেখানেই লেখার অ্যাক্সেস প্রয়োজন নেই সেখানে এটি ব্যবহার করুন — এটি সস্তা সুরক্ষা।
সবকিছু আসলে কোথায় সংরক্ষিত থাকে
docker volume ls
docker volume inspect db-data
docker inspect -f '{{json .Mounts}}' <container> | python3 -m json.tool
sudo du -sh /var/lib/docker/volumes/* | sort -h | tail
ডিস্ক স্পেস শেষ হয়ে গেলে সবার আগে যে কমান্ডটি চালাবেন সেটি হলো শেষেরটি। আরও বিস্তারিত: ডিস্ক স্পেস।
docker compose down -vএবংdocker volume pruneভলিউম স্থায়ীভাবে মুছে ফেলে। কন্টেইনার বন্ধ থাকা অবস্থায় ডেটাবেসসহ একটি ভলিউম "অব্যবহৃত" দেখায় এবং ক্লিনআপের আওতায় পড়ে। পরিষ্কার করার আগে তালিকাটি দেখুন:docker volume ls -f dangling=true।
কপি করা এবং মাইগ্রেশন
একটি ডিসপোজেবল কন্টেইনার দিয়ে একটি নেমড ভলিউম কপি করা:
docker run --rm -v db-data:/from -v $(pwd):/to alpine \
tar czf /to/db-data.tar.gz -C /from .
পুনরুদ্ধার:
docker volume create db-data
docker run --rm -v db-data:/to -v $(pwd):/from alpine \
tar xzf /from/db-data.tar.gz -C /to
ডেটাবেসের ক্ষেত্রে, এই পদ্ধতি কেবল কন্টেইনার বন্ধ থাকলেই উপযুক্ত: চলমান ডেটাবেসের ফাইল-লেভেল কপি অসামঞ্জস্যপূর্ণ হতে পারে। ডেটাবেসের নিজস্ব টুল — pg_dump, mysqldump — দিয়ে ডাম্প করা ভালো। দেখুন ঠিক কী কপি করবেন।
পারমিশন
বাইন্ড মাউন্টের সাথে সবচেয়ে সাধারণ ভুল হলো মালিকের অমিল। কন্টেইনারের ভেতরে প্রসেসটি নিজস্ব UID-তে চলে, এবং হোস্ট root হিসেবে তৈরি করা একটি ফাইল তার কাছে অগম্য।
docker compose exec app id
sudo chown -R 1000:1000 ./data
অনেক ইমেজ PUID/PGID ভেরিয়েবল গ্রহণ করে — ডিরেক্টরির মালিক পরিবর্তন করার চেয়ে এটি বেশি সুবিধাজনক।
সাধারণ ভুল
- কন্টেইনারের ভেতরে ডেটা লেখা হয়েছে। আপডেটের সময় আপনি কন্টেইনারটি পুনরায় তৈরি করেছেন — ডেটা হারিয়ে গেছে। যাচাই করুন:
docker diff <container>এর ফাইলসিস্টেমে কী পরিবর্তন হয়েছে তা দেখাবে; সেখানে বড় আকারের লেখা একটি সতর্ক সংকেত। - আপনি ইমেজের একটি অ-খালি পাথের উপরে একটি ডিরেক্টরি বাইন্ড-মাউন্ট করেছেন। ইমেজের বিষয়বস্তু লুকিয়ে যায়, এবং সার্ভিসটি তার ফাইল খুঁজে পায় না।
- বাইন্ড মাউন্টে একটি রিলেটিভ পাথ। এটি বর্তমান ডিরেক্টরি থেকে নয়, বরং
compose.yamlধারণকারী ডিরেক্টরি থেকে রিজলভ হয়। অন্য জায়গা থেকে চালালে একটি নতুন খালি ডিরেক্টরি তৈরি হবে। - OS পুনঃইনস্টলের সময় ভলিউম ভুলে যাওয়া। পুনঃইনস্টল সম্পূর্ণ ডিস্ক মুছে ফেলে। কপিটি অবশ্যই এই মেশিনে নয় এমন জায়গায় সংরক্ষণ করতে হবে।