Docker-এর ডিফল্ট পুল বদল নেটওয়ার্কগুলোকে নতুন নম্বর দেয় না
default-address-pools বদলালে কেবল নতুন স্বয়ংক্রিয় নেটওয়ার্ক নিয়ন্ত্রিত হয়। আপনার ইতিমধ্যে ব্যবহৃত রেঞ্জগুলো তালিকাভুক্ত করুন, তারপর যা চলছে তার মাইগ্রেশন পরিকল্পনা করুন।
default-address-pools বদলালে আপনার ইতিমধ্যে থাকা নেটওয়ার্কগুলো নতুন নম্বর পায় না, আর এটাই প্রত্যাশা করলে সতর্ক পরিকল্পনা হঠাৎ বিভ্রাটে পরিণত হয়। এই সেটিং নতুন কনফিগারেশনসহ ডেমন পুনরায় চালু হওয়ার পরে তৈরি হওয়া নেটওয়ার্কের স্বয়ংক্রিয় বরাদ্দ নিয়ন্ত্রণ করে। ইতিমধ্যে চলা সবকিছু তার দেওয়া সাবনেট ধরে রাখে, কারণ সেই সাবনেট নেটওয়ার্কের সংরক্ষিত সংজ্ঞার অংশ। কল্পকাহিনীটি সুবিধাজনক, কারণ এটি বলে একটিমাত্র সম্পাদনাই সব ওভারল্যাপ ঠিক করে, কিন্তু বাস্তবতা দুই ভাগের কাজ: সত্যিই খালি একটি রেঞ্জ বেছে নিন, তারপর যেগুলো খালি নয় সেগুলো মাইগ্রেট করুন।
কল্পকাহিনী: পুল একবার বদলালেই ওভারল্যাপ ঠিক হয়
কল্পকাহিনীটির একটি নির্দিষ্ট রূপ আছে। কেউ পড়ে যে Docker-এর ডিফল্ট পুল বদলানো যায়, সেটি বদলায়, ডেমন পুনরায় চালু করে এবং সিদ্ধান্তে আসে যে কন্টেইনার নেটওয়ার্ক আর অফিস VPN-এর সঙ্গে সংঘর্ষ করছে না। পুরনো নেটওয়ার্কটি তখনও আছে, তখনও সংযুক্ত, এবং তখনও সেই ঠিকানাটি ধরে আছে যা সংঘর্ষ ঘটায়।
যা বদলেছে তা হলো বরাদ্দকারীর ভবিষ্যৎ আচরণ, যা সত্যিই উপযোগী এবং সত্যিই সীমিত। স্পষ্ট --subnet ছাড়া তৈরি নতুন নেটওয়ার্ক নতুন পুল থেকে কাটা হয়; পুরনো নেটওয়ার্কগুলো কখনও সেই পুলে ছিলই না। পুনরায় চালু করা নেটওয়ার্ক পুনর্নির্মাণ করে না এবং কন্টেইনার একটির থেকে অন্যটিতে সরায় না। বদলের পরেও লক্ষণ থেকে গেলে বদলটি সত্যিই হয়েছিল, আর রোগনির্ণয় ছিল অসম্পূর্ণ।
বেস রেঞ্জ ও বরাদ্দকৃত প্রিফিক্স
কনফিগারেশনে দুইটি ক্ষেত্র আছে যা সহজেই গুলিয়ে যায়। base হলো সেই রেঞ্জ যা থেকে বরাদ্দকারী কাটে, আর size হলো প্রতিটি বরাদ্দকৃত নেটওয়ার্কের প্রিফিক্স দৈর্ঘ্য, তাই 10.10.0.0/16 বেস ও 24 আকার সেই /16-এর ভিতরে /24 বিতরণ করে। ভূমিকা উল্টে দিলে এমন বরাদ্দ প্যাটার্ন তৈরি হয় যা আপনি চাননি, সাধারণত একটি বিশাল নেটওয়ার্ক বা নিঃশেষিত পুল।
পুল একটি সংরক্ষণ, প্রমাণ নয়। Docker হোস্টের রাউটিং টেবিলে যা দেখতে পায় সেই সংঘর্ষ এড়ায়, আর আপনি যে VPN-এ এখনও সংযুক্ত হননি সেটি দেখতে পায় না।
এই সীমাবদ্ধতাই সচেতনভাবে বেছে নেওয়ার পুরো কারণ। তুলনা করার রেঞ্জগুলো হলো যেগুলোতে হোস্টকে পৌঁছাতে হয়: অফিস LAN, কর্পোরেট VPN-এর অভ্যন্তরীণ সাবনেট, ল্যাব বা স্টেজিং প্রিফিক্স, এবং একই ওভারলে-এ থাকা অন্য যেকোনো কন্টেইনার হোস্ট। ডেমন স্পর্শ করার আগে সেগুলো CIDR হিসেবে লিখে রাখুন, কারণ মাথার তালিকা ঠিক সেই রেঞ্জটিই বাদ দেবে যেটি গুরুত্বপূর্ণ। তারপর এমন বেস বেছে নিন যা কোনোটির সঙ্গে ওভারল্যাপ করে না, এবং তালিকাটি ডিপ্লয়মেন্টের সঙ্গে রাখুন যাতে পরের ব্যক্তি স্মৃতি থেকে এই কাজটি আবার না করে।
বেছে নেওয়ার আগে তালিকা করুন
প্রথমে যা আছে তা তালিকাভুক্ত করুন। docker network ls নেটওয়ার্কগুলো তালিকা করে, আর docker network inspect bridge -f '{{.IPAM.Config}}' নির্দিষ্ট একটি নেটওয়ার্ক যে সাবনেট ব্যবহার করছে তা দেখায়। প্রতিটি ব্যবহারকারী-নির্ধারিত নেটওয়ার্কের জন্য এটি পুনরাবৃত্তি করুন, কারণ Compose প্রকল্প নিজের নেটওয়ার্ক তৈরি করে এবং compose ফাইলে স্পষ্ট --subnet পুলটিকে সম্পূর্ণ এড়িয়ে যায়।
শেষ কথাটিই মাইগ্রেশনের পরেও টিকে থাকে। পুল বদল কাউকে compose ফাইলে 172.18.0.0/16 পিন করতে বাধা দেয় না, আর সংঘর্ষ ভিন্ন একজনের হাতে ফিরে আসে।
যা ইতিমধ্যে আছে তার মাইগ্রেশন
বিদ্যমান নেটওয়ার্ক মাইগ্রেট করা একটি আলাদা, সমর্থিত কাজ। প্রতিটি প্রভাবিত নেটওয়ার্ক নতুন সাবনেট দিয়ে পুনরায় তৈরি করতে হয়, যার অর্থ সেটি ব্যবহারকারী কন্টেইনারগুলো বিচ্ছিন্ন করে আবার সংযুক্ত করা, আর নেটওয়ার্ক পুনরায় তৈরি করলে তার কন্টেইনার সংযুক্তিগুলো সরানোর বদলে মুছে যায়। ভলিউম ও কনফিগারেশন সংরক্ষণ করুন এবং পুনরায় তৈরি করাকে ডেটা রিসেট নয়, ডিপ্লয়মেন্ট হিসেবে দেখুন। রক্ষণাবেক্ষণ উইন্ডোতে কাজটি করুন, কারণ পুনরায় তৈরি নেটওয়ার্কের কন্টেইনারগুলো আপনি পরিকল্পনা করুক বা না করুক পুনরায় চালু হয়।
প্রামাণ্য ডেমন কনফিগারেশন ও পুনরায় চালুর পদ্ধতি অনুসরণ করুন এবং বিঘ্নটি সমন্বয় করুন। একক ডেমনযুক্ত হোস্টে systemctl restart docker কন্টেইনারগুলোকে তাদের পুনরায় চালুর নীতিমালা অনুযায়ী পুনরায় চালু করে, আর এই আচরণটি পরে নয়, আগে জানা উচিত।
তারপর বদলটি যে দুইটি জিনিস ঠিক করার কথা ছিল তা যাচাই করুন। docker network inspect দিয়ে নতুন সাবনেট পরীক্ষা করুন এবং তা বেছে নেওয়া বেসের ভিতরে আছে কি না নিশ্চিত করুন, তারপর ip route get 10.20.30.40 দিয়ে একটি প্রতিনিধিত্বমূলক VPN গন্তব্যের রুট দেখুন এবং নিশ্চিত করুন যে এটি আপনার প্রত্যাশিত জায়গায় যায়, ব্রিজে নয়। সেবা আবিষ্কার ও কন্টেইনার-থেকে-কন্টেইনার যোগাযোগও পরীক্ষা করুন, কারণ ভিন্ন ঠিকানায় পুনরায় তৈরি নেটওয়ার্ক নাম সমাধান এমনভাবে ভাঙতে পারে যা অ্যাপ্লিকেশন বাগের মতো দেখায়।
পরে কী কী এখনও ভাঙে
টেকসই অংশটি হলো রেকর্ড। বরাদ্দের তালিকা, বেছে নেওয়া বেস ও আকার, এবং পুনরায় তৈরি নেটওয়ার্কগুলো ডিপ্লয়মেন্টের সঙ্গে একই জায়গায় রাখুন।
রেঞ্জটি প্রাইভেট হওয়া মানে এটি পুনরায় ব্যবহার করা নিরাপদ নয়। 10.0.0.0/8 প্রাইভেট এবং পথের কোথাও ইতিমধ্যে ব্যবহৃত হওয়ার সম্ভাবনা সবচেয়ে বেশি, তাই উত্তর হলো একটি নির্দিষ্ট সংরক্ষণ, এক ব্লকের প্রতি পক্ষপাত নয়। Docker নেটওয়ার্ক ডকুমেন্টেশন স্বয়ংক্রিয় সাবনেট বরাদ্দ ও পুলের ক্ষেত্রগুলো বর্ণনা করে। রেঞ্জটি বেছে নিন যা আপনার পৌঁছানো দরকার তা থেকে, যা দেখতে গোছানো লাগে তা থেকে নয়।