Docker কন্টেইনারها ছোট ছোট সফটওয়্যার বক্সের মতো, অর্থাৎ আপনি সেগুলো কম্পিউটার থেকে কম্পিউটারে কপি এবং মুভ করতে পারেন। যাইহোক, এটাকে প্রায়শই আলোচনা করা হয় না, সম্ভবত বড় অর্গানাইজেশনরা তাদের নিজস্ব রিপোজিটরি সেট আপ করে, যেখানে তারা তাদের নিজস্ব ইমেজ কাস্টমাইজ করে এবং তাদের সার্ভারগুলোর জুড়ে বিতরণ করে যেমন তারা ফিট বুঝে। কিন্তু আপনাকে যদি কখনো কখনো এক বা একাধিক কন্টেইনার মুভ করতে হয় তবে আপনাকে নিজস্ব ডিস্ট্রিবিউশন লাইন সেট আপ করার ঝামেলায় পড়তে হয় না।
হয়তো আপনি আপনার লোকাল কম্পিউটারে একটি Docker ইনস্ট্যান্সে কাজ করেছেন এবং সেটিকে একটি অধিক শক্তিশালী সার্ভারে মুভ করার সিদ্ধান্ত নিয়েছেন। অথবা হয়তো আপনি শুধু আপনার কাস্টমাইজড কন্টেইনার একাধিক কম্পিউটারে ডিপ্লয় করতে চান, "কপি এবং পেস্ট" করুন এটি চারপাশে। অন্য সময় আপনি একটি ক্লাউড-কম্পিউটিং প্রোভাইডার থেকে असন্তুষ্ট হয়ে অন্য একটা স্যুইচ করতে চান। যাইহোক পরিস্থিতি, এটি করার জন্য একটি তুলনামূলকভাবে সিম্পল প্রসিডিউর আছে যা নিচে ডিটেল করা হয়েছে।
সোর্স হোস্ট থেকে কন্টেইনার ইমেজ সেভ করুন
কন্টেইনার প্রথমে স্টপ করা আবশ্যক নয়, কিন্তু এটি হাই রিকমেন্ডেড যে আপনি এটি করুন। আপনি আপনার Docker ইনস্ট্যান্সের ডেটার একটি স্ন্যাপশট নেবেন। যদি এটি রানিং অবস্থায় থাকে যখন আপনি এটি করছেন, তবে একটি ছোট চান্স আছে কিছু ফাইল আপনার স্ন্যাপশটে ইনকমপ্লিট হয়ে যাবে। কেউ ৫০০MB ফাইল আপলোড করছেন সোচুন। ২৫০MB আপলোড হলে, আপনি docker commit কমান্ড ইস্যু করেন। আপলোড তারপর চালু থাকে, কিন্তু আপনি যখন অন্য হোস্টে এই Docker ইমেজ রিস্টোর করবেন, তবে ৫০০MB-র মধ্যে ২৫০MB মাত্র উপলব্ধ হতে পারে।
তাই, যদি পারেন, প্রথমে ইনস্ট্যান্সটি স্টপ করুন।
docker stop NAME_OF_INSTANCE
একটি Docker কন্টেইনার একটি জেনেরিক, ইনিশিয়াল ইমেজ থেকে বিল্ড হয়। সময়ের সাথে সাথে, আপনি এই বেস ইমেজে আপনার নিজস্ব পরিবর্তন যোগ করেন। কন্টেইনারের ভেতরে চলমান প্রসেসগুলোও তাদের নিজস্ব ডেটা সেভ করতে পারে বা অন্যান্য পরিবর্তন আনতে পারে। এই সবটি সংরক্ষণ করতে, আপনি এই নতুন স্টেটকে একটি নতুন ইমেজে কমিট করতে পারেন।
মনে রাখবেন যদি ইনস্ট্যান্সটি বর্তমানে রানিং থাকে, এই অ্যাকশন এটি পজ করবে যতক্ষণ না এর কন্টেন্ট সেভ হয়। আপনি আপনার কন্টেইনারে খুব বেশি ডেটা যোগ করে থাকলে, এই অপারেশন বেশি টাইম নেবে কমপ্লিট হতে। যদি এটি একটি সমস্যা হয়, আপনি এই পজ এড়াতে পারেন docker commit -p=false NAME_OF_INSTANCE mycontainerimage নেক্সট কমান্ডের বদলে এন্টার করুন। যাইহোক, এটি করবেন না যদি না অত্যন্ত আবশ্যক হয়। ইনকনসিস্টেন্ট/ইনকমপ্লিট ডেটাওয়ালা ইমেজ তৈরির চান্স এই কেসে বেড়ে যায়।
এই টিউটোরিয়ালে, ফলাফলস্বরূপ ইমেজের জন্য একটি জেনেরিক নাম বেছে নেওয়া হয়েছে, mycontainerimage। আপনি চাইলে এই নাম পরিবর্তন করতে পারেন। যদি করেন, তবে মনে রাখবেন পরবর্তী সব কমান্ডে যেখানে এটি পাবেন সেখানে রিপ্লেস করুন।
docker commit NAME_OF_INSTANCE mycontainerimage
এখন, এই ইমেজটি একটি ফাইলে সেভ করুন এবং কমপ্রেস করুন।
docker save mycontainerimage | gzip > mycontainerimage.tar.gz
এরপর, আপনার পছন্দের ফাইল ট্রান্সফার মেথড ব্যবহার করে mycontainerimage.tar.gz কপি করুন সেই হোস্টে যেখানে আপনি আপনার কন্টেইনার মাইগ্রেট করতে চান।
ডেস্টিনেশন হোস্টে কন্টেইনার ইমেজ লোড করুন
আপনি যেখানে ইমেজ ট্রান্সফার করেছেন সেখানে লগ ইন করার পর, এটিকে Docker-এ ইম্পোর্ট করুন।
gunzip -c mycontainerimage.tar.gz | docker load
যেহেতু আপনি এখানে এই কন্টেইনারটি কখনো ইনিশিয়ালাইজ করেননি, আপনি এখনও docker start দিয়ে শুরু করতে পারবেন না। বদলে, সেম কমান্ড ইস্যু করুন যা আপনি przeszłośćে ব্যবহার করেছিলেন, যখন আপনি প্রথমে এই Docker ইনস্ট্যান্সটি রান করেছিলেন। একমাত্র পার্থক্য এখন হলো আপনি ভবিষ্যতে যেই ইমেজটি ব্যবহার করেছিলেন তার বদলে "mycontainerimage" ব্যবহার করবেন।
নেক্সট কমান্ডটি শুধু একটি উদাহরণ; এটি কপি পেস্ট করবেন না যদি না এটি আপনার জন্য প্রযোজ্য হয়। (প্রথমবার ইমেজ রান করার সময় কোনো স্পেশাল প্যারামিটার দরকার ছিল না)
docker run -d --name=PICK_NAME_FOR_CONTAINER mycontainerimage
বিপরীত, নিচের উদাহরণটি এমন একটি কমান্ড যেখানে --publish প্যারামিটার দরকার ছিল হোস্ট মেশিনের পোর্ট ৮০ কন্টেইনারের পোর্ট ৮০-এ ফরোয়ার্ড করার জন্য:
docker run -d --name=http-server --publish 80:80 mycontainerimage
এরপর, আপনি এই কন্টেইনারটি নরমালি স্টপ এবং স্টার্ট করতে পারেন, docker stop এবং docker start কমান্ড দিয়ে।
ফাইল তৈরি ছাড়া ইমেজ ট্রান্সফার
কখনো কখনো আপনি mycontainerimage.tar.gz ফাইল তৈরি করার ধাপ বাদ দিতে চাইতে পারেন। হয়তো আপনার পর্যাপ্ত ডিস্ক স্পেস নেই যেহেতু কন্টেইনারে অনেক ডেটা আছে। আপনি সেভ, কমপ্রেস, ট্রান্সফার, আনকমপ্রেস এবং লোড ইমেজ ডেস্টিনেশন হোস্টে এক কমান্ডে করতে পারেন। উপরের সেকশনে আলোচনা করা docker commit কমান্ড রান করার পর, আপনি এটি ব্যবহার করতে পারেন:
docker save mycontainerimage | gzip | ssh root@203.0.113.1 'gunzip | docker load'
এটি উইন্ডোজ থেকেও কাজ করা উচিত, যেহেতু এখন এতে বিল্ট-ইন SSH ক্লায়েন্ট আছে (PuTTY আর দরকার নেই)।
এরপর, আপনার পরিস্থিতির প্রযোজ্য docker run কমান্ড দিয়ে চালিয়ে যান।
উপসংহার
docker save এবং docker load কন্টেইনার কখনো কখনো মুভ করার জন্য একটি আডহক সলিউশন হিসেবে গরেট। কিন্তু মনে রাখবেন, আপনি যদি এটি ঘন ঘন করেন, তবে আপনি আপনার নিজস্ব প্রাইভেট রিপোজিটরি সেট আপ করতে চাইতে পারেন।
Image Credit: Air Force Medical Service
docker save এবং docker load কন্টেইনার কখনো কখনো মুভ করার জন্য একটি আডহক সলিউশন হিসেবে গরেট। কিন্তু মনে রাখবেন, আপনি যদি এটি ঘন ঘন করেন, তবে আপনি আপনার নিজস্ব প্রাইভেট রিপোজিটরি সেট আপ করতে চাইতে পারেন।
Image Credit: Air Force Medical Service