Docker Volumes & Persistence: ডেটা স্থায়ী করার উপায় 💾
ডকার কন্টেইনার ডিফল্টভাবে "Ephemeral" বা অস্থায়ী। অর্থাৎ, কোনো কন্টেইনার ডিলিট করে দিলে তার ভেতরের সব ডেটাও মুছে যায়। কিন্তু ডাটাবেস বা ইউজার ফাইলের মতো গুরুত্বপূর্ণ ডেটা আমাদের স্থায়ীভাবে সেভ রাখা প্রয়োজন। এর জন্যই ডকার Volumes এবং Bind Mounts ব্যবহার করা হয়।
১. Volume কি এবং কেন প্রয়োজন?
Volume হলো ডকার কন্টেইনারের বাইরের একটি স্টোরেজ যা হোস্ট মেশিনের ডকার ম্যানেজড ডিরেক্টরিতে থাকে।
- কেন প্রয়োজন: কন্টেইনার স্টপ বা ডিলিট হয়ে গেলেও ডেটা হারায় না। একাধিক কন্টেইনারের মধ্যে ডেটা শেয়ার করা যায়।
২. ভলিউমের প্রকারভেদ (Volume Types)
ডকারে প্রধানত তিন ধরনের ভলিউম রয়েছে:
ক) Named Volumes (সবচেয়ে জনপ্রিয়)
ডকার নিজেই এই ভলিউম ম্যানেজ করে। আপনি শুধু একটি নাম দেন (যেমন: db_data)। এটি প্রোডাকশন এনভায়রনমেন্টের জন্য সেরা।
- লোকেশন:
/var/lib/docker/volumes/(Linux-এ)।
খ) Anonymous Volumes
এগুলোর কোনো নির্দিষ্ট নাম থাকে না। কন্টেইনার ডিলিট হলে এগুলো সাধারণত হারিয়ে যায় (যদি না যত্ন করে রাখা হয়)। টেম্পোরারি স্টোরেজের জন্য ব্যবহৃত হয়।
গ) Bind Mounts
হোস্ট মেশিনের যেকোনো ফোল্ডার বা ফাইল কন্টেইনারের সাথে সরাসরি কানেক্ট করা হয়। ডেভেলপমেন্টের সময় এটি সবচেয়ে বেশি ব্যবহৃত হয় (হট রিলোডিং-এর জন্য)।
- লোকেশন: হোস্ট মেশিনের যেকোনো জায়গা (যেমন:
C:\my-projectবা/home/user/app).
ঘ) tmpfs Mounts (শুধুমাত্র Linux-এ)
এটি ডেটা হোস্ট বা কন্টেইনারের ডিস্কে সেভ না করে সরাসরি হোস্ট মেশিনের RAM বা মেমোরিতে সেভ করে। কন্টেইনার স্টপ হলে এই ডেটা হারায়। এটি পাসওয়ার্ড বা সেনসিটিভ ডেটা সাময়িকভাবে রাখার জন্য খুব দ্রুত কাজ করে।
৩. Volume Drivers
ডিফল্টভাবে ডকার local ড্রাইভার ব্যবহার করে। তবে বড় প্রজেক্টে ডেটা ক্লাউড বা রিমোট স্টোরেজে রাখার জন্য বিভিন্ন ড্রাইভার ব্যবহার করা যায়:
- Cloud Drivers: AWS EBS, Azure File Storage, GCE Persistent Disk.
- Network Drivers: NFS, Samba/CIFS.
- SSHFS: SSH-এর মাধ্যমে অন্য সার্ভারের স্টোরেজ ব্যবহার করা।
৪. গুরুত্বপূর্ণ ভলিউম কমান্ড (CLI)
| কাজ | কমান্ড |
|---|---|
| Create Volume | docker volume create my_vol |
| List Volumes | docker volume ls |
| Inspect Volume | docker volume inspect my_vol |
| Remove Volume | docker volume rm my_vol |
| Remove Unused | docker volume prune |
৪. প্র্যাকটিক্যাল ব্যবহার উদাহরণ
Named Volume ব্যবহার করে কন্টেইনার চালানো:
docker run -d --name mydb -v my_data:/var/lib/mysql mysql:latestএখানে my_data হলো একটি Named Volume।
Bind Mount ব্যবহার করে ডেভেলপমেন্ট চালু করা:
docker run -d --name myapp -v $(pwd):/app node:alpineএখানে বর্তমান ফোল্ডার ($(pwd)) সরাসরি কন্টেইনারের /app ফোল্ডারে মাউন্ট করা হয়েছে।
৫. Bind Mount vs Named Volume
| ফিচার | Named Volume | Bind Mount |
|---|---|---|
| ম্যানেজমেন্ট | ডকার ম্যানেজ করে | ইউজার নিজে ম্যানেজ করে |
| পোর্টেবিলিটি | অনেক বেশি | হোস্টের পাথ-এর ওপর ডিপেন্ডেন্ট |
| ব্যবহার | প্রোডাকশন/ডাটাবেস | লোকাল ডেভেলপমেন্ট |
IMPORTANT
প্রোডাকশন ডাটাবেজের জন্য সবসময় Named Volumes ব্যবহার করুন। আর কোড পরিবর্তনের সাথে সাথে কন্টেইনার রিফ্রেশ করার জন্য Bind Mounts ব্যবহার করুন।