Docker ইমেজ immutable (অপরিবর্তনশীল)। একবার বিল্ড হলে, সেগুলো পরিবর্তন হয় না। এটি কনসিস্টেন্সি, প্রেডিক্টেবিলিটি, এবং স্ট্যাবিলিটি নিশ্চিত করে। একই ইমেজ থেকে তৈরি প্রতিটি কন্টেইনার একইভাবে আচরণ করে, এবং ভার্সনিং সুরক্ষিত ও সহজ হয়। কিন্তু যদি আপনাকে একটি চলমান কন্টেইনারের ভিতরে কিছু টুইক করতে হয়, যেমন একটি প্যাকেজ ইনস্টল করা বা একটি কনফিগারেশন আপডেট করা? সেটাই যেখানে docker commit কাজে আসে। এটি একটি চলমান কন্টেইনারে পরিবর্তন ক্যাপচার করে এবং একটি নতুন ইমেজ তৈরি করে আসলটি ছুঁয়ে না। এটি টেস্টিং ফিক্স, দ্রুত ইটারেশন, এবং কাস্টম ইমেজ রোল আউট করার জন্য দুর্দান্ত Dockerfile থেকে scratch রিবিল্ড ছাড়া।
Docker ইমেজ কেন পরিবর্তন হয় না
Docker ইমেজ একাধিক রিড-অনলি লেয়ার দিয়ে গঠিত। আপনি যখন একটি কন্টেইনার চালানেন, Docker একটি পাতলা রাইটেবল লেয়ার যোগ করে টপে যাকে কন্টেইনার লেয়ার বলা হয়। আপনি যে যেকোনো পরিবর্তন করেন সেটি শুধু এই টপ লেয়ারে হয়। একবার কন্টেইনার ডিলিট হলে, সেই লেয়ারের সকল পরিবর্তন গায়েব হয়ে যায়, আসল ইমেজ অপরিবর্তিত থাকে।
এই ডিজাইন নিম্নলিখিত সুবিধা গ্যারান্টি দেয়:
- একই ইমেজ থেকে প্রতিটি কন্টেইনার একইভাবে আচরণ করে, কনসিস্টেন্সি নিশ্চিত করে।
- এক কন্টেইনারে পরিবর্তন অন্যগুলোকে প্রভাবিত করে না, প্রেডিক্টেবিলিটি দেয়।
- আপনি নিরাপদে নির্দিষ্ট ইমেজ ভার্সন ট্যাগ করতে পারেন রিস্ক ছাড়া।
এই ডিজাইন চমৎকার স্ট্যাবিলিটি দেয়, কিন্তু আপনাকে লিমিট করে যখন আপনি একটি চলমান কন্টেইনারে দ্রুত পরিবর্তন করতে চান। সেটাই যেখানে docker commit সাহায্য করে।
একটি চলমান কন্টেইনার থেকে নতুন ইমেজ তৈরি করা
আপনি যখন docker commit কমান্ড চালানেন, Docker একটি চলমান কন্টেইনারের বর্তমান স্টেট ক্যাপচার করে এবং সেটি থেকে একটি নতুন ইমেজ তৈরি করে। এটি কন্টেইনারের ফাইল সিস্টেমের একটি স্ন্যাপশট নেয়, আপনি যে পরিবর্তনগুলো করেছেন সেগুলো—যেমন ইনস্টল করা প্যাকেজ, আপডেট করা কনফিগারেশন, বা মডিফাই করা ফাইল—নতুন ইমেজ লেয়ার হিসেবে সেভ করে। এইভাবে, আসল ইমেজ অপরিবর্তিত থাকে, আপনাকে দ্রুত এক্সপেরিমেন্ট এবং ইটারেট করার সুযোগ দিয়ে।
এটি একটি কাস্টম বেস সেটআপ ভবিষ্যতে পুনরায় ব্যবহারের জন্য সেভ করতে, টেস্টিং sırasında ছোট ফিক্স বা কনফিগারেশন পরিবর্তন প্রয়োগ করতে, বা আপনার টিমের সাথে আপডেটেড ইমেজ শেয়ার করতে Dockerfile স্ক্র্যাচ থেকে রিবিল্ড ছাড়া—সকল জন্য আদর্শ।
আপনি docker commit কমান্ড নিচের সিনট্যাক্স ব্যবহার করে একটি চলমান কন্টেইনার থেকে নতুন ইমেজ তৈরি করতে পারেন:
docker commit [OPTIONS] CONTAINER_ID NEW_IMAGE_NAME[:TAG]
এখানে, CONTAINER_ID হলো আপনি যে কন্টেইনার ক্যাপচার করতে চান তার ID বা নাম, NEW_IMAGE_NAME হলো নতুন ইমেজের জন্য আপনার পছন্দের নাম, এবং TAG অপশনাল, ডিফল্ট হচ্ছে latest।
নোট: docker commit হলো docker container commit-এর একটি লিগ্যাসি এলিয়াস; উভয় একই।
docker commit কমান্ড কিছু অপশন প্রদান করে যা আপনাকে মেটাডেটা যোগ করতে, কনফিগারেশন পরিবর্তন প্রয়োগ করতে, এবং কমিট প্রক্রিয়া কন্ট্রোল করতে দেয়। নিচের টেবিলে সাপোর্টেড সব অপশন সারমর্ম করা হলো:
| Option | Long Form | Description | Example |
|---|---|---|---|
| -a | –author | নতুন ইমেজের মেটাডেটায় লেখকের নাম যোগ করে। | docker commit -a "Anees" my-container my-image |
| -c | –change | Dockerfile ইনস্ট্রাকশন যেমন ENV, LABEL, বা CMD নতুন ইমেজে প্রয়োগ করে। | docker commit -c "ENV APP_ENV=prod" my-container my-image |
| -m | –message | ইমেজে করা পরিবর্তন বর্ণনা একটি সংক্ষিপ্ত মেসেজ যোগ করে। | docker commit -m "Installed curl" my-container my-image |
| -p | –pause | কমিটের সময় কন্টেইনার পজ করে কনসিস্টেন্সি নিশ্চিত করতে (ডিফল্ট: true)। | docker commit --pause=false my-container my-image |
docker commit কীভাবে কাজ করে তা দেখুন
মান লें আপনি একটি Alpine কন্টেইনারে curl ইনস্টল করতে চান Dockerfile রিবিল্ড ছাড়া। এটি করতে, বেস ইমেজ থেকে একটি কন্টেইনার চালান:
docker run -it alpine:latest /bin/sh
একবার কন্টেইনারে ঢুকলে, প্রয়োজনীয় পরিবর্তন করুন:
apk update && apk add curl
এখন কন্টেইনার থেকে এক্সিট করুন:
exit
এতে পর, কন্টেইনারটি একটি নতুন ইমেজ হিসেবে কমিট করুন:
docker commit alpine-with-curl:1.0
আপনার নতুন ইমেজ ভেরিফাই করুন:
docker images
এখন, আপনার কাছে একটি নতুন ইমেজ আছে যেটি কোথাও চালানো যাবে, curl প্রি-ইনস্টলড থাকবে।
আপনার নতুন ইমেজ চালান ক্যাপচার করা পরিবর্তন টেস্ট করতে
আপনার নতুন ইমেজ তৈরি করার পর, আপনি সেটি থেকে একটি কন্টেইনার চালাতে পারেন যেন আপনার পরিবর্তনগুলো সেভ হয়েছে কিনা ভেরিফাই করতে।
docker run -it alpine-with-curl:1.0 /bin/sh
এই কমান্ড alpine-with-curl:1.0 ইমেজ ভিত্তিক একটি কন্টেইনারের ভিতরে একটি ইন্টারেক্টিভ শেল খোলে। একবার ভিতরে গেলে, আপনি চেক করতে পারেন আপনার মডিফিকেশনগুলো ইনট্যাক্ট আছে কিনা।
curl --version
এটি প্রদর্শন করে যে পরিবর্তনগুলো নতুন ইমেজে পার্সিস্টেড।
docker commit বনাম Dockerfile: কোনটি কখন ব্যবহার করবেন
Dockerfile এবং docker commit দুটোই Docker ইমেজ তৈরি করতে দেয়, কিন্তু সেগুলো সম্পূর্ণ ভিন্নভাবে কাজ করে এবং ভিন্ন পরিস্থিতির জন্য উপযুক্ত।
Dockerfile সেরা পছন্দ যখন আপনাকে বিশ্বস্ত এবং রিপিটেবল বিল্ড প্রয়োজন, বিশেষ করে CI/CD পাইপলাইন এবং প্রোডাকশন এনভায়রনমেন্টের জন্য। এটি সব পরিবর্তন কোডে স্পষ্টভাবে ডিফাইন করে রাখে, যাতে সেগুলো টিম কোলাবোরেশনের জন্য সহজে ট্র্যাক, রিভিউ, এবং ভার্সন-কন্ট্রোল করা যায় সময়ের সাথে সাথে। এই পদ্ধতি নিশ্চিত করে যে কেউ পরে ইমেজ বিল্ড করলে একই রেজাল্ট পাবে, যা লং-টার্ম মেইনটেন্যান্স এবং টিম কলাবোরেশনের জন্য ক্রিটিক্যাল।
অন্যদিকে, docker commit দ্রুত ফিক্স, টেস্টিং, বা ছোট আডজাস্টমেন্টের জন্য ভালো কাজ করে যেগুলো আপনি পুরো Dockerfile রি-রাইট বা রিবিল্ড ছাড়া চেষ্টা করতে চান। এটি উপযোগী যখন আপনি এক্সপেরিমেন্ট করছেন, ডিবাগ করছেন, বা ফ্লাইতে একটি পরিবর্তন ভ্যালিডেট করছেন। যাইহোক, যেহেতু পরিবর্তনগুলো কোনো ফাইলে ডকুমেন্টেড নয়, এই মেথড শর্ট-টার্ম ইউজের জন্য আরও উপযুক্ত বরং প্রোডাকশন।
সংক্ষেপে, আপনি docker commit মূলত এক্সপেরিমেন্টেশন বা টেম্পোরারি ফিক্সের জন্য ব্যবহার করতে পারেন। প্রোডাকশন-রেডি ইমেজের জন্য, সর্বদা Dockerfile পছন্দ করুন। Docker-র সর্বোত্তম ফলাফল পেতে, অন্যান্য কী কমান্ডগুলো কন্টেইনার, ইমেজ, এবং ওয়ার্কফ্লো সহজ করে তোলে তা এক্সপ্লোর করা উচিত।