জ্যাংগোর সাথে কন্টেইনারে পোস্টগ্রেস ডাটাবেজ ব্যবহার করা
দ্রষ্টব্য — এই আর্টিকেলে জ্যাংগো, পোস্টগ্রেস কিংবা ডকার নয়, বরং এদেরকে কীভাবে একাত্ম করা যায় তার আলোচনা হয়েছে। কাজেই জ্যাংগো এবং ডকারের সাথে হাই হ্যালো থাকাটা কাম্য। পোস্টগ্রেস বা sql ডাটাবেজের সাথে পরিচয় থাকলে ভালো, তবে জরুরি নয়।
ভূমিকা
জ্যাংগোতে প্রজেক্ট ডেভেলপমেন্ট খুবই দ্রুত শুরু করা যায়, কারণ প্রজেক্ট তৈরির সময়ই ডাটাবেজ, এডমিন প্যানেল ইত্যাদি গুরুত্বপূর্ণ কিছু ব্যাপার দেয়া থাকে যাতে আমরা শুরুতে এসবের দিকে মাথা না ঘামিয়ে মূল প্রজেক্ট ডেভেলপ শুরু করতে পারি। জ্যাংগোতে ডিফল্ট ভাবে sqlite3 ডাটাবেজটি দেয়া থাকে, যা একটি লাইটওয়েট এসকিউএল ডাটাবেজ।
ডেভেলপমেন্ট বা ছোটখাটো প্রজেক্টের জন্যে এটা যথেষ্ট হলেও, বড় প্রজেক্টের ক্ষেত্রে প্রডাকশন লেভেলে এটা খুব একটা ভালো পছন্দ নয়। জ্যাংগোতে এর ভালো একটা বিকল্প হতে পারে পোস্টগ্রেসকিউএল(PostgreSQL) । কিন্তু আমাদের হোস্ট মেশিনে শুরুতে পোস্টগ্রেস ইনস্টলেশন এবং কনফিগার করা বেশ ঝামেলার ( অন্তত আমার কাছে খুবই বিরক্তিকর লেগেছিলো)। টুকটাক ডকারের সাথে পরিচয় থাকলে , হোস্ট মেশিনে পোস্টগ্রেস কনফিগার করার চাইতে তা আমরা ডকারের একটা কন্টেইনারের ভেতরে রান করে তার সাথে আমাদের জ্যাংগো এপকে জুড়ে দিতে পারি। এতে করে ডকার আসলে কেন দরকারী, এর উপকারিতা বা কীভাবে দৈনন্দিন ডেভেলপমেন্টে একে ব্যবহার করতে পারি তা সম্পর্কেও পরিষ্কার ধারণা পাওয়া যাবে।
কাজেই বলা যেতে পারে, এই আর্টিকেল মূলত যতোটা না জ্যাংগো বা পোস্টগ্রেস সম্পর্কে, তার চাইতে বেশি ডকার সম্বন্ধে।
আর্টিকেলে ব্যবহৃত সকল কমান্ড বা কোড পাওয়া যাবে এখানে।
জ্যাঙ্গো
জ্যাংগো হচ্ছে পাইথনের ওয়েব ফ্রেমওয়ার্কগুলোর মধ্যে অন্যতম জনপ্রিয় । এই হাই লেভেল ফ্রেমওয়ার্কটির মাধ্যম্যে দ্রুত এবং ক্লিন ডিজাইনের মাধ্যমে ডেভেলপমেন্ট করা যায়। এটি দ্রুতগতির, নিরাপদ এবং স্ক্যালেবল।
পোস্টগ্রেস
পোস্টগ্রেএসকিউএল(Postgres), যা পোস্টগ্রেস নামেও পরিচিত, একটি ফ্রি এবং ওপেনসোর্স রিলেশনাল ডাটাবেজ। এটি এসকিউএল এর সাথে সামঞ্জস্যপূর্ণ এবং তার সাথে আরো বাড়তি ফিচার যুক্ত করেছে।
ডকার
ডকার হচ্ছে ভার্চুয়াল মেমরির নতুন রুপ কন্টেইনারাইজেশনের একটি ইমপ্লিমেন্টেশন। এর সম্বন্ধে যাদের একেবারে ধারণা নেই তারা প্রোগ্রামিং পাতার এই আর্টিকেলগুলো দেখে নিতে পারেন। আশা করি ধারণা ক্লিয়ার হবে।
এবার হাতে ময়লা লাগানোর পালা
ডকারে পোস্টগ্রেস কন্টেইনার সেটাপ
প্রথমে আমরা ডকারের রিপোজিটরি থেকে পোস্টগ্রেস এর অফিসিয়াল ইমেজ আমাদের কম্পিউটারে ডাউনলোড করে নেই।
docker pull postgress
সফলভাবে ডাউনলোড হয়ে গেলে আমরা docker images
কমান্ড দিয়ে আমাদের কম্পিউটারে থাকা ইমেজগুলোর লিস্ট দেখে নিতে পারি।
এবার আমরা postgres ইমেজটির একটি ইন্সট্যান্স কন্টেইনার তৈরি করে তা রান করবো। অর্থাৎ, পোস্টগ্রেসকে আমরা কন্টেইনারের ভেতরে রান করাবো। এজন্যে কমান্ড লাইনে লিখুন
docker run -d -p 5432:5432 -e POSTGRES_HOST_AUTH_METHOD=trust --name django-db postgres
এখানে docker run
এর পরে বেশ অনেকগুলো প্যারামিটার আছে । লম্বা কমান্ড দেখে ঘাবড়ানোর কিছু নেই। আমরা একে একে প্রতিটি প্যারামিটার ব্যবহারের কারণ দেখে নিচ্ছি —
-d
কন্টেইনারটি ডিটাচড মোডে বা ব্যাকগ্রাউন্ডে রান হবে।
-p 5432:5432
পোর্ট বাইন্ডিং। পোস্টগ্রেস ডিফল্টভাবে 5432 পোর্টে চলে। কোলনের পরে ২য় 5432 দিয়ে আমরা বলছি, আমাদের কন্টেইনারের ভেতরেও একই পোর্টে আমরা পোস্টগ্রেস চালাবো। আমরা আমাদের হোস্ট মেশিনের 5432 পোর্টের সাথে (১ম 5432) কন্টেইনারের পোস্টগ্রেস এর পোর্ট(২য় 5432) বাইন্ড করছি। ফলে আমাদের হোস্ট মেশিনের এই পোর্টের সাথে কন্টেইনারের হোস্টের 5432 পোর্ট,যেখানে পোস্টগ্রেস ডাটাবেজ চলবে তার একটা কানেকশন করে দিচ্ছি, যাতে কন্টেইনারের বাইরে থেকেও আমরা এর সাথে যোগাযোগ করতে পারি।
-e POSTGRES_HOST_AUTH_METHOD=trust
একটি এনভায়রনমেন্ট ভ্যারিয়েবল পাঠাচ্ছি । এরমাধ্যমে আমরা পাসওয়ার্ড ছাড়া পোস্টগ্রেস ডাটাবেজে লগিন করতে পারবো। প্রোডাকশন লেভেলে ডাটাবেজের সিকিউরিটির জন্য এটা মোটেও বুদ্ধিমানের কাজ নয়। তবে এই আর্টিকেলে আমরা সিকিউরিটি নিয়ে মাথা ঘামাচ্ছি না।
--name django-db
এটি অপশনাল প্যারামিটার। আমাদের কন্টেইনারটিকে django-db নামে একটি নাম দিচ্ছি আমরা।
postgres
এই যে কন্টেইনার চালানোর জন্য এতো কিছু করছি আমরা , কোন ইমেজ দিয়ে আমরা কন্টেইনার চালাবো? postgres, তাই তো? আমরা অফিসিয়াল ইমেজটি এই নামেই ছিলো। আমরা এখানে ইমেজটির নাম বলে দিচ্ছি।
কমান্ডের পর কন্টেইনার সফলভাবে রান হলে আমরা এই কন্টেইনারের একটি ইউনিক আইডি পাবো। docker ps
কমান্ড দিয়ে আমরা দেখতে পারি যে আমাদের পোস্টগ্রেস কন্টেইনারটি রানিং আছে।
প্রতিটি কন্টেইনার আসলে একটি আইসোলেটেড ভার্চুয়াল মেশিনের মতো। এখন আমরা পোস্টগ্রেস নিয়ে কাজ করতে এর কন্টেইনারের ভেতরে প্রবেশ করবো।
docker exec -it django-db bash
কন্টেইনারের ভেতরে কোনো কমান্ড চালাতে exec
ব্যবহৃত হয়। django-db মানে আমাদের কন্টেইনারের নাম। -it মানে ইন্টারএক্টিভ মোড। অর্থাৎ django_db কন্টেইনারের ভেতরে আমরা Bash কনসোল চালু করবো।
ls
কমান্ড দিয়ে আমরা দেখতে পারি বর্তমান ডিরেক্টরির সকল ফাইল ফোল্ডার। আমরা দেখেই বুঝতে পারছি, এগুলো আমাদের কম্পিউটারেও নেই, আর root@199ad8b4b2c ইউজারটিও আমাদের কম্পিউটারে নেই। কারণ আমরা বর্তমানে একধরণের ভার্চুয়াল এনভায়রনমেন্টের ভেতরে আছি যাকে আমরা কন্টেইনার বলছি।
এবার আমরা পোস্টগ্রেস এর কনসোলে প্রবেশ করবো। এরজন্যে আমরা পোস্টগ্রেস এর ডিফল্ট ইউজার(postgres) ব্যবহার করছি। আপনি চাইলে নতুন ইউজার-পাসওয়ার্ড তৈরি করেও কাজ করতে পারেন।
psql -U postgresCREATE DATABASE db_django;\l
এরপরে আমরা db_django নামে একটি ডাটাবেজ তৈরি করলাম। \l
কমান্ড দিয়ে আমরা দেখতে পাচ্ছি আমাদের ডাটাবেজ তৈরী হয়েছে।
এবার এই ডাটাবেজের সাথে আমাদের জ্যাংগোকে কানেক্ট করার পালা।
জ্যাংগোতে কনফিগার করা
জ্যাংগোর জন্য আমরা এই প্রজেক্টটি ব্যবহার করবো। আপনিও ক্লোন কিংবা ডাউনলোড করতে পারেন, কিংবা নিজের প্রজেক্টেও চেষ্টা করতে পারেন।
আমরা আগেই বলেছি, প্রতিটি কন্টেইনার একটি ভার্চুয়াল মেশিনের মতো। কাজেই, সেই মেশিনেও অনেক হোস্ট থাকে, কন্টেইনারের প্রসেসগুলো নির্দিষ্ট হোস্টে চলে। আমরা জানতে চাই আমাদের পোস্টগ্রেস ডাটাবেজটি কন্টেইনারের ভেতরে কোন হোস্টে রানিং আছে
docker inspect --format '{{ .NetworkSettings.IPAddress }}' c19
এখানে c19 হচ্ছে আমাদের কন্টেইনারের আইডির ১ম ৩ অক্ষর। যেহেতু আইডিটি ইউনিক, তাই পুরোটার বদলে প্রথম ২/৩ তি লেটারই যথেষ্ট।
এরমানে পোস্টগ্রেসের হোস্ট হচ্ছে 172.17.0.2 , এবং তা কন্টেইনারের বাইরের জগতের সাথে যুক্ত হয়েছে 5432 পোর্টে।
এছাড়া আমাদের ডাটবেজটির নাম দিয়েছিলাম db_django, আমাদের ইউজার ছিলো postgres, পাসওয়ার্ড ছাড়াই একসেস করা যাবে।
আমাদের জ্যাংগোর সেটিংসে গিয়ে ডিফল্ট sqlite3 ডাটাবেজটির বদলে আমরা কন্টেইনারে চলমান পোস্টগ্রেস ডাটাবেজটিকে ডিফল্ট হিসাবে কনফিগার করলাম।
আমাদের ডাটাবেজ কনফিগার হয়ে গেছে। এখান যদি আমাদের সেই পোস্টগ্রেস কন্টেইনারটি রানিং থাকে, তবে আমাদের জ্যাংগো প্রজেক্টটিও কন্টেইনারে থাকা db_django ডাটাবেজের সাথে যোগাযোগ করতে পারবে। অর্থাৎ, কন্টেইনারটিও রানিং থাকতে হবে।
যেহেতু আমরা আগের ডাটাবেজের বদলে নতুন ডাটাবেজ সেটাপ করেছি, তাই এটি এখন একদম ফ্রেশ ডাটাবেজ, কোনো টেবিল বা ডাটা নেই।
প্রথমে টেবিলগুলো জেনারেট করি।
python manage.py migrate
টেবিলগুলো সফলভাবে মাইগ্রেট হয়েছে। যেহেতু একমাত্র ডাটাবেজ হিসেবে পোস্টগ্রেসই কনফিগার করা এবং কোনো এররও দেয়নি,তাই আমরা ধরেই নিতে পারি টেবিলগুলো কন্টেইনারের ভেতরে থাকা পোস্টগ্রেসে তৈরি হয়েছে। তবে না দেখে বিশ্বাস করবো কেন?
আবার কন্টেইনারের ভেতরে কনসোলে প্রবেশ করে আমাদের db_django ডাটাবেজের সাথে কানেক্ট করি এবং সব টেবিল লিস্ট করি।
docker exec -it django-db bash
\c db_django
\d
দেখতেই পাচ্ছি, টেবিলগুলো আসলেই তৈরি হয়েছে। এবার কিছু ডাটা যোগ করার পালা।
সুপারইউজার তৈরি করে, ডেভেলপমেন্ট সার্ভার রান করে এডমিন প্যানেলে লগ ইন করি আর আমাদের কমেন্ট মডেলে( টেবিলে) নতুন একটি কমেন্ট যুক্ত করি।
আবার কন্টেইনারে থাকা ডাটাবেজ থেকে posts_comment টেবিলে কুয়েরি চালিয়ে দেখি সব কমেন্টগুলো।
SELECT * FROM posts_comment;
দেখতেই পাচ্ছি, জ্যাংগো থেকে ইনপুট দেয়া ডাটাগুলো কন্টেইনারের ভেতরে থাকা ডাটাবেজে সেভ হয়েছে। অর্থাৎ, আমাদের হোস্ট মেশিনের জ্যাংগো এপটি কন্টেইনারে থাকা ডাটাবেজের সাথে কানেক্ট হয়েছে।
এভাবে আমরা ডকারের মাধ্যমে যেকোনো সার্ভিস রান করতে পারি এবং তার সাথে কন্টেইনারের বাইরে কানেক্ট বা ব্যবহার করতে পারি। এরপরের কয়েকটি পোস্টে আমরা দেখার চেষ্টা করবো পুরো জ্যাংগো প্রজেক্টটিকে একটি ইমেজে রূপান্তরিত করে এই আস্ত প্রজেক্টিকে কীভাবে কন্টেইনার থেকে চালানো যায়, কিংবা এই ইমেজটিকে কীভাবে শিপ বা ডেপ্লয় করা যায়।
আজকে এই পর্যন্তই। ধন্যবাদ।