আশা করি আপনি কখনো এই আর্টিকেল পড়ার প্রয়োজন হবে না, এবং আপনি শুধু এখানে আছেন কারণ আপনি বোর হয়ে গেছেন অথবা ভুল ধরনের সার্চ করেছেন। অথবা আপনি আসলে এমন একটি ইস্যু ফেস করছেন যেখানে আপনার ডকার কন্টেইনারগুলোর ইন্টারনেট অ্যাক্সেস আর নেই, যদিও সেগুলো কিছুদিন আগে ভালো কাজ করত, এবং আপনি আপনার এনভায়রনমেন্টে কোনো পরিবর্তন আনেননি।
এটি একটি ভ্যাগ প্রোবলেম স্টেটমেন্ট처럼 শোনা যায়, কিন্তু এটি হঠাৎ আমার সম্মুখীন হয়েছিল। আমার কন্টেইনারগুলোর নেটওয়ার্ক অ্যাক্সেস ছিল না, এরর লিক Temporary failure resolving URL। এটি নেম রেজোলিউশনের সাথে ইস্যু মনে হচ্ছিল, এবং এটি আমাকে এক্সট্রা বাগ করছিল, কারণ এটি হোনা উচিত ছিল না। কিন্তু আমরা নিজেদের অগ্রसर করছি। টেস্ট হোস্ট: Ubuntu with systemd—লেটার জন্য গুরুত্বপূর্ণ। ধীরে ধীরে চলি।
সমস্যা বিস্তারিত
আপনি আপনার সিস্টেমে ডকার কনফিগার করেছেন। এটি ভালো কাজ করছে। আপনার একাধিক ইমেজ, একাধিক কন্টেইনার আছে, এবং আপনি অ্যাডভান্সড নেটওয়ার্ক রুলও ব্যবহার করেছেন, এবং সবকিছু পেরফেক্ট আর্ডারে মনে হচ্ছে। তারপর, আপনি লক্ষ্য করেন যে আপনি আপনার কন্টেইনারগুলিতে কিছু এক্টিভিটি আর করতে পারছেন না, যেমন আপডেট বা প্যাকেজ ইনস্টলেশন। এটি ডিবাগ করার সেরা উপায় হলো একটি রানিং কন্টেইনার ইনস্ট্যান্সে একটি শেল আটাচ করা, যেমন আমি ইন্ট্রো গাইডে ব্যাখ্যা করেছিলাম। সত্যিই, একটি রানিং কন্টেইনারের ভিতরে, আপনি কিছুটা এমন দেখবেন:
# apt-get update Err:1 https://archive.ubuntu.com/ubuntu bionic InRelease Temporary failure resolving 'archive.ubuntu.com' 0% [Connecting to security.ubuntu.com]
এটি একটি DNS সমস্যা (নেম রেজোলিউশন) দেখাচ্ছে। কন্টেইনারটি ডোমেন নামকে IP ঠিকানায় রেজলভ করতে পারছে না, এবং তাই সার্ভারগুলোতে সংযোগ করে ডেটা নিতে পারছে না, যেমন আপডেট। এখানে দুটি ইস্যু আছে। একটি, সমস্যাটি হঠাৎ কেন উপস্থিত হলো? দুটি, আমাদের আসলে নেটওয়ার্ক ফিক্স করতে হবে। এখন, আমি আপনাকে দেখাতে চাই কীভাবে এটি ট্রাবলশুট করতে হয় একটি এলিগ্যান্ট পদ্ধতিতে।
সমাধান
প্রথমে, বুঝি কেন ইস্যুটি ঘটল। এখানে কোনো তাত্ক্ষণিক উত্তর নেই, কিন্তু কিছু জিনিস দেখতে পারেন আপনার ইমিডিয়েট এনভায়রনমেন্টের বাইরেও। উদাহরণস্বরূপ, আপনার হোস্ট পরিবর্তন হয়নি, কিন্তু নেটওয়ার্ক হয়েছে—রাউটার, নেটওয়ার্ক পলিসি, DNS সার্ভার själোস্বয়। যেহেতু আপনি আপনার ইমিডিয়েট সেটআপের বাইরে যা হচ্ছে সেটি কন্ট্রোল করতে পারবেন না সাধারণত, সমস্যাটি কোথায় আছে সেটি বের করার সেরা উপায় হলো ধাপে ধাপে প্রোবলেম আইসোলেশন।
- যদি আপনার হোস্ট সিস্টেমে নেটওয়ার্ক আছে এবং URL রেজলভ করতে পারে না, তবে আপনাকে সেটি প্রথমে সাজাতে হবে। আপনার হোস্ট এবং ডেস্টিনেশনের মধ্যে, এবং যেকোনো নেটওয়ার্ক ইনফ্রাস্ট্রাকচার যা মাঝপথে আছে, সেখানে সবচেয়ে সম্ভবত একটি সমস্যা আছে।
- যদি আপনার হোস্ট সিস্টেমে নেটওয়ার্ক আছে এবং সঠিকভাবে URL রেজলভ করতে পারে, তবে ইস্যুটি স্পেসিফিক্যালি ডকার কন্টেইনার কীভাবে URL রেজলভ করে সেটি রেলেটেড। এখানেই আমাদের পরবর্তীতে ফোকাস করতে হবে।
- চেক করুন ডকার নেটওয়ার্ক ইন্টারফেস আপ এবং রানিং কিনা (`ip` বা `ifconfig` কমান্ড দিয়ে)। না হলে, আপনাকে সেটি প্রথমে ফিক্স করতে হবে পরবর্তী ধাপে যাওয়ার আগে।
ifconfig docker0
- চেক করুন কন্টেইনার ইনস্ট্যান্সের একটি IP ঠিকানা আছে কিনা। না হলে, আপনাকে সেটি ফিক্স করতে হবে।
docker inspect| grep -i "ipaddr"
- চেক করুন কন্টেইনারের ভিতর থেকে একই রেজাল্ট পাচ্ছেন কিনা (যদি সম্ভব হয় `ip` বা `ifconfig` দিয়ে)। যদি রেজাল্ট পূর্বের কমান্ডের সাথে মেলে না, আপনাকে সেটি ফিক্স করতে হবে।
- চেক করুন আপনি কন্টেইনারকে বাইর থেকে পিং করতে পারছেন কিনা (এবং বিপরীতেও, যদি `ping` কমান্ড উপলব্ধ থাকে)। যদি পিং কাজ করে, এটি সম্ভবত একটি ভালো ইন্ডিকেশন যে নেটওয়ার্ক সঠিকভাবে কনফিগার্ড আছে, এবং কোনো ফায়ারওয়াল রুল ট্রাফিক ব্লক করছে না (সবচেয়ে সম্ভব)।
নেম রেজোলিউশন
যদি সব চেক কোনো স্ট্রেঞ্জ প্রোবলেম বা এরর রিটার্ন না করে, পরবর্তী ধাপ হলো DNS রেজোলিউশনে ফোকাস করা। এর কনফিগারেশন `/etc/resolv.conf` কনফিগারেশন ফাইলে থাকবে। এটি ফিজিক্যাল লিনাক্স ইনস্ট্যান্স, ভার্চুয়াল মেশিন এবং কন্টেইনার—Sabke জন্য সত্য। আপনি সম্ভবত লক্ষ্য করবেন কন্টেইনারটি কিছুটা এরকম ব্যবহার করছে:
... # See man:systemd-resolved.service(8) for details about the supported modes # of operation for /etc/resolv.conf. search xyz nameserver X.Y.Z.W ...
নেমসার্ভার IP অ্যাড্রেসগুলো সবচেয়ে সম্ভবত একটি এক্সটার্নাল IP অ্যাড্রেস (যেমন আপনার ISP) বা লোকালহোস্ট (127.0.0.X)। প্রশ্ন হলো: কি এগুলো আপনার হোস্টের `/etc/resolv.conf` ফাইলের সাথে মেলে?
উত্তর হলো, আপনার হোস্টের `/etc/resolv.conf` ফাইলে লোকালহোস্ট ডিফাইন করা থাকবে সবচেয়ে সম্ভব। এখন আপনার কন্টেইনারে সেটি ট্রাই করুন। `resolv.conf` ফাইল এডিট করুন এবং `nameserver` লাইনে IP ঠিকানাকে হোস্টের মান = লোকালহোস্ট দিয়ে রিপ্লেস করুন। যদি এটি আপনার ইস্যু সমাধান করে, খুব ভালো। কিন্তু সবচেয়ে সম্ভবত, এটি হবে না।
তবে, এই পয়েন্টে, আপনার হোস্টে নেটওয়ার্ক কানেক্টিভিটির সাথে কোনো প্রোবলেম নেই। তাই আমাদের আপনার এনভায়রনমেন্টের আসল DNS সার্ভার ঠিকানা বের করতে হবে। এবং এটি আরও জটিল হয়ে যায় এই ফ্যাক্ট দ্বারা যে অধিকাংশ আধুনিক লিনাক্স ডিস্ট্রিবিউশন systemd ব্যবহার করে। প্লট থিকেনস।
systemd-র সাথে DNS বের করুন
তাহলে হ্যাঁ। আমাদের নেমসার্ভার কী সেটি বের করতে হবে, এবং আমাদের সেটির জন্য একটি systemd কমান্ড ব্যবহার করতে হবে। সবচেয়ে সম্ভবত, আপনার সিস্টেমে systemd থাকলে, আপনি systemd-resolveও ব্যবহার করছেন, নেটওয়ার্ক নেম রেজোলিউশন ম্যানেজার এবং সার্ভিস। কনফিগারেশন স্টোরড থাকে `/etc/systemd/resolved.conf`-এ। কিন্তু আপনি কমান্ড লাইন থেকে রেজাল্টও পেতে পারেন `systemd-resolve` কমান্ড দিয়ে:
systemd-resolve --status
Link 3 (wlp59s0)
Current Scopes: DNS
LLMNR setting: yes
MulticastDNS setting: no
DNSSEC setting: no
DNSSEC supported: no
DNS Servers: 10.50.34.1
2001:64c:1462:b023::1
DNS Domain: dedoimedo
এখানে কী আছে? অনেক আকর্ষণীয় জিনিস। কিন্তু যা সত্যিই मैटर করে সেটি হলো লাইন যা পড়ে `DNS Servers`। এটিই আমরা চাই। এই IP অ্যাড্রেস কন্টেইনার `/etc/resolv.conf` ফাইলে রাখুন এবং আবার চেষ্টা করুন। আপনার নেটওয়ার্ক আবার কাজ করা উচিত।
তবে কেন এই সমস্যা?
এখন, আমরা আবার কেন নিয়ে আলোচনা করতে পারি। আপনি যদি `systemd-resolve` ডকুমেন্টেশন দেখেন, এটি সম্ভব যে আপনার সিস্টেমে কিছু পরিবর্তন হয়েছে (সম্ভবত একটি রেগুলার আপডেটের জন্যও) যার কারণে সিলেক্টেড মোড অফ অপারেশন নেম রেজোলিউশনের সাথে কিছু কনফ্লিক্ট তৈরি করেছে। বিশেষ করে, যদি আমরা দেখি `/etc/resolv.conf` কীভাবে হ্যান্ডেল করা হয়, তবে প্রথম মোড বলে:
systemd-resolved maintains the /run/systemd/resolve/stub-resolv.conf file for compatibility with traditional Linux programs. This file may be symlinked from /etc/resolv.conf. This file lists the 127.0.0.53 DNS stub (see above) as the only DNS server. It also contains a list of search domains that are in use by systemd-resolved. The list of search domains is always kept up-to-date. Note that /run/systemd/resolve/stub-resolv.conf should not be used directly by applications, but only through a symlink from /etc/resolv.conf. This file may be symlinked from /etc/resolv.conf in order to connect all local clients that bypass local DNS APIs to systemd-resolved with correct search domains settings. This mode of operation is recommended.
যদি এই সমীকরণের একটি লিংক ভাঙে, বা কিছু পরিবর্তন হয়, তবে ডকার সার্ভিসে আসলে কী হচ্ছে সেটি নির্ধারণ করতে পারে না, এবং আপনি নেম রেজোলিউশন ছাড়া ফিনিশ করেন। তাই রেজোলিউশন [sic] হলো আসল নেটওয়ার্ক DNS অ্যাড্রেস প্রদান করা, যা কন্টেইনারগুলো বুঝতে এবং ব্যবহার করতে পারে। এটি আমার দিকে থেকে কিছুটা スペ큘েটিভ, কিন্তু আমি মনে করি এটি কফি সঠিক।
উপসংহার
হয়ে গেলো, আরেকটি মিস্টারি ডিমিস্টেড, আরেকটি উইন্ডস্ক্রিন ডিমিস্টিফাইড। অথবা কিছু। আমি হাফ-ম্যাজিক সমাধান পছন্দ করি না, কিন্তু আপনার একটি সুপার-কমপ্লেক্স, লেয়ার্ড সিস্টেম ইনফ্রাস্ট্রাকচার থাকলে, কখনো কখনো সমাধানগুলো প্রোবলেমের মতই খারাপ হয়। না সেটি মানে সেগুলো ইস্যু ফিক্স করে না—অর্থাৎ আপনার কম ভিজিবিলিটি এবং কন্ট্রোল আছে সেসবের চেয়ে যা আপনি রেসপেক্টফুলি ডিজার্ভ করেন। কিন্তু এটি লিনাক্সের—এবং সব IT-এর—ভবিষ্যৎ—এন্ডলেস অ্যাবস্ট্রাকশন।
টপিকের ওপর, আশা করি এই ছোট গাইড আপনাকে আপনার কন্টেইনার অ্যাডভেঞ্চারের জন্য একটি আপেক্ষিকভাবে দ্রুত এবং পেইনলেস ফিক্স দেবে। আপনি যদি ডকার ব্যবহার করেন, এবং কন্টেইনার ইনস্ট্যান্সের ভিতরে নেম রেজোলিউশন আর কাজ না করে, তবে সম্ভবত আপনাকে উপরের টিপস এবং ট্রিকস টেস্ট করা উচিত—এবং তারপর আপনার নিজের ইমেজ বিল্ড করুন সঠিক ফিক্স inplace-এ, যাতে আপনাকে একই জিনিসের জন্য বারবার লড়াই করতে না হয়। এবং তাহলে, চলে গেলো, দি এন্ড।
চিয়ার্স।