ডকারের অদ্ভুত বিশ্ব আরও অন্বেষণ করার সময়। এ পর্যন্ত আমাদের দুটি টিউটোরিয়াল হয়েছে, একটি ছিল প্রযুক্তির গভীর পরিচয়, যেখানে আমরা ডকার সম্পর্কে সব কিছু শিখেছিলাম—কিভাবে সার্ভিস চালাতে হয়, পোর্ট এক্সপোজ করা, ডকারফাইল দিয়ে ইমেজ কমিট ও বিল্ড করা, এবং আরও কিছু টিপস। তারপর আমরা `supervisord` ব্যবহার করেছিলাম ইনিট স্ক্রিপ্ট এবং `systemd`-র বিকল্প হিসেবে।
আজ আমরা নেটওয়ার্কিং নিয়ে শিখব। কন্টেইনারها সাথে কীভাবে সংযোগ করব, কন্টেইনার থেকে হোস্ট অ্যাক্সেস করা, এবং সবচেয়ে গুরুত্বপূর্ণ—এক কন্টেইনার থেকে অন্য কন্টেইনারে কীভাবে সংযোগ করব, আগে থেকে টপোলজি না জানেও। এটি khá আকর্ষণীয় হবে। আগের দুটি গাইডের মতো এখানেও ধাপে ধাপে সব কিছু বিস্তারিত ব্যাখ্যা করা হবে। চলুন শুরু করা যাক।
সामগ্রী সারাংশ
- সেটআপ
- হোস্ট থেকে কন্টেইনার নেটওয়ার্কিং
- সংক্ষিপ্ত সার
- কন্টেইনার থেকে হোস্ট নেটওয়ার্কিং
- কন্টেইনার থেকে কন্টেইনার নেটওয়ার্কিং
- কন্টেইনার লিংক!
- হোস্টস ফাইল
- নাম দিয়ে সার্ভারের সাথে সংযোগ
- আরও পঠন
- উপসংহার
সেটআপ
প্রথমে আমরা কিছু কন্টেইনার তৈরি করব। পূর্বের টেস্ট থেকে আমাদের ইমেজগুলো আছে, তাই স্ক্র্যাচ থেকে শুরু করার দরকার নেই। আমরা তিনটি কন্টেইনার চালাব, প্রতিটির নিজস্ব SSH এবং Apache সার্ভিস থাকবে। নিরাপত্তা দিকটি উপেক্ষা করছি কারণ ফোকাস নেটওয়ার্কিং-এ।
এখানে একটি নতুন জিনিস করব যা গতবার করিনি—কন্টেইনারها নাম দেব সুনির্দিষ্ট করার জন্য। এটি `--name` অপশন দিয়ে করা হয়। উদাহরণস্বরূপ:
docker run -d -ti -p 22 -p 80 --name net3 image-4:latest
আমাদের তিনটি ইনস্ট্যান্সের IP ঠিকানাগুলো দেখে নিই:
[root@localhost ~]# docker inspect net1 | grep -i ipaddr "IPAddress": "172.17.0.5", [root@localhost ~]# docker inspect net2 | grep -i ipaddr "IPAddress": "172.17.0.6", [root@localhost ~]# docker inspect net3 | grep -i ipaddr "IPAddress": "172.17.0.7",
এই হলো আমাদের টেস্টের প্রাথমিক কনফিগারেশন। একই হোস্টে তিনটি কন্টেইনার চলছে, সবার নিজস্ব সার্ভিস এবং এক্সপোজড পোর্ট। এখন আমরা কিছু মজার কাজ শুরু করতে পারি।
হোস্ট থেকে কন্টেইনার নেটওয়ার্কিং
এটি সহজ অংশ, এবং সত্য বলতে গেলে আগের এক্সারসাইজে আমরা এটি করেছি। আমরা SSH দিয়ে কন্টেইনারها সাথে সংযোগ করেছিলাম, এবং `telnet` দিয়ে পোর্ট টেস্ট করেছিলাম। হ্যাঁ, `netcat (nc)`-ও ভালো কাজ করে। সংযোগ করার দুটি উপায় আছে। একটি, আপনি সরাসরি কন্টেইনারের IP ঠিকানা ব্যবহার করে অ্যাক্সেস করতে পারেন, যেমন আমরা আগে করেছি।
ssh 172.17.0.5 The authenticity of host '172.17.0.5 (172.17.0.5)' can't be established. ECDSA key fingerprint is 00:4b:de:91:60:e5:22:cc:f7:89:01:19:3e:61:cb:ea. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '172.17.0.5' (ECDSA) to the list of known hosts. root@172.17.0.5's password:
দুটি, আপনি হোস্ট-ম্যাপড পোর্টও ব্যবহার করতে পারেন যা কন্টেইনারের সার্ভিস পোর্টের সাথে মিলে যায়। `docker ps` আউটপুটের PORTS কোলাম দেখলে:
0.0.0.0:49162->22/tcp, 0.0.0.0:49161->80/tcp net1 0.0.0.0:49163->22/tcp, 0.0.0.0:49164->80/tcp net2 0.0.0.0:49165->22/tcp, 0.0.0.0:49166->80/tcp net3
উপরের উদাহরণে, `net1` নামের কন্টেইনারের পোর্ট ২২, হোস্টের পোর্ট ৪৯১৬২-এ ম্যাপ করা হয়েছে, মানে `docker0` ইন্টারফেস, যা ডিফল্টভাবে `172.17.42.1/16` নেটওয়ার্ক এসাইন করা থাকে। আমরা দেখি:
telnet 172.17.42.1 49163 Trying 172.17.42.1... Connected to 172.17.42.1. Escape character is '^]'. SSH-2.0-OpenSSH_6.6.1
এখন, দ্বিতীয় পদ্ধতি কেন ব্যবহার করবেন, যেটা আরও জটিল এবং মনে রাখতে কঠিন? উত্তর হলো, যদি আপনি ডাইনামিক ম্যাপিং না ব্যবহার করে নির্দিষ্ট হোস্ট পোর্ট বরাদ্দ করেন, তবে আপনার কন্টেইনার নেটওয়ার্কের একটি স্পষ্ট টপোগ্রাফি থাকে। আর যদি কন্টেইনারها বাইরের থেকে অ্যাক্সেসযোগ্য করতে চান, তবে IP ফরওয়ার্ডিং এবং NAT দরকার। `docker0` ইন্টারফেস ব্যবহার করলে কম এবং সহজ `iptables` নিয়ম লাগে।
আপনি `iptables -L` কমান্ড চালিয়ে DOCKER চেইন চেক করে যাচাই করতে পারেন। `-p` অপশন দিয়ে কন্টেইনার চালালে নতুন নিয়ম অটোমেটিক্যালি যোগ হয়।
Chain DOCKER (1 references) target prot opt source destination ACCEPT tcp -- anywhere 172.17.0.5 tcp dpt:http ACCEPT tcp -- anywhere 172.17.0.5 tcp dpt:ssh ACCEPT tcp -- anywhere 172.17.0.6 tcp dpt:ssh ACCEPT tcp -- anywhere 172.17.0.6 tcp dpt:http ACCEPT tcp -- anywhere 172.17.0.7 tcp dpt:ssh ACCEPT tcp -- anywhere 172.17.0.7 tcp dpt:http ACCEPT tcp -- anywhere 172.17.0.8 tcp dpt:ssh ACCEPT tcp -- anywhere 172.17.0.8 tcp dpt:http
তবে নিরাপত্তা বাধা না থাকলে ডাইনামিক পদ্ধতিটি খুবই উপকারী, কারণ কন্টেইনার শুরু করার সময় পোর্ট ম্যাপিং জানার দরকার নেই। আপনি রিয়েল-টাইমে `docker ps` আউটপুট পার্স করে তথ্য পেতে পারেন। কিন্তু সার্ভিসের জন্য প্রায়শই স্ট্যাটিক IP এবং পরিচিত পোর্ট সেট করা ভালো।
সংক্ষিপ্ত সার
এটি কিছুটা বিভ্রান্তিকর হতে পারে, তাই সংক্ষেপে রিক্যাপ করি। যেকোনো ডকার হোস্টে একটি `docker0` বা অনুরূপ ব্রিজ থাকে, সাধারণত `/16` সাবনেটের সাথে, যদিও আপনি নাম, সাবনেট বা পুরো নেটওয়ার্ক পরিবর্তন করতে পারেন। এর পিছনে অনেক কন্টেইনার থাকতে পারে, প্রতিটির নিজস্ব প্রাইভেট IP এবং এক বা একাধিক এক্সপোজড পোর্ট।
যদি আপনি এই কন্টেইনারها এবং তাদের পোর্টের সাথে সংযোগ করতে চান, তবে কয়েকটি অপশন আছে। আপনি সরাসরি সংযোগ করতে পারেন, কিন্তু তার জন্য IP ফরওয়ার্ডিং, NAT এবং প্রতিটির জন্য ফায়ারওয়াল নিয়ম লাগে, এবং IP ঠিকানাগুলো জানতে হয়।
যদি হোস্ট ইন্টারফেস (`docker0`) এবং হোস্ট পোর্ট পদ্ধতি ব্যবহার করেন, তবে আপনাকে জানার দরকার নেই কন্টেইনারها কীভাবে চলছে। আপনার জানতে হবে শুধু হোস্ট পোর্ট থেকে কন্টেইনার পোর্টের ম্যাপিং। অর্থাৎ, আপনি যদি একাধিক হোস্ট নোডের মধ্যে কন্টেইনারها অ্যাক্সেসযোগ্য করতে চান, তবে শুধু হোস্ট ইন্টারফেস (`docker0`) অন্য হোস্টদের কাছে দৃশ্যমান করানো যথেষ্ট। এটি IP ফরওয়ার্ডিং, NAT এবং ফায়ারওয়াল নিয়মগুলো সহজ করে দেয়। উদাহরণস্বরূপ:
0.0.0.0:30001->22/tcp net1 0.0.0.0:30007->22/tcp net4 0.0.0.0:30008->22/tcp net5
উপরের উদাহরণে আপনি তিনটি ভিন্ন কন্টেইনারের SSH-এ সংযোগ করতে পারেন। যদি वन-টু-वन ম্যাপিং ব্যবহার করেন (যেমন ২২:২২), তবে আপনি কার্যকরভাবে শুধু একটি কন্টেইনারের একটি সার্ভিসে সীমাবদ্ধ থাকবেন। এটি আপনার হোম রাউটারের মতো। আপনাকে কন্টেইনারها জন্য ভিন্ন পোর্ট ব্যবহার করতে হবে। কিন্তু এটি বিভ্রান্তিকর, কারণ আপনি আশা করেন আপনার সার্ভিসগুলো প্রিডিক্টেবল পোর্টে চলবে।
উপরের উদাহরণে আমরা দেখি তিনটি কন্টেইনার SSH ব্যবহার করতে পারে। অভ্যন্তরিন দৃষ্টিকোণ থেকে (কন্টেইনার পক্ষ থেকে), এটি সবসময় পোর্ট ২২। বাইরের দৃষ্টিকোণ থেকে, পোর্ট নম্বরها কন্টেইনারও শনাক্ত করে এবং সার্ভিসও। এবং এটি একমাত্র টুকরো যা আপনাকে জানতে হবে, পেছনের দৃশ্যের সাথে ব্যাথা না নিয়ে।
এটি মানে আপনি কন্টেইনার তৈরি করার সময় ডাইনামিক্যালি হোস্ট পোর্ট বরাদ্দ করতে পারেন (স্ক্রিপ্ট লজিক বা অন্য কিছু ব্যবহার করে), এবং তারপর সেই তথ্য ব্যবহার করে আপনার সার্ভিস পোর্ট শনাক্ত করতে পারেন। এইভাবে হোস্ট-টু-কন্টেইনার নেটওয়ার্কিং একটি সহজ এবং সুন্দর বিষয় হয়ে যায়। এবং আপনি হোস্ট থেকে অন্য হোস্টেও সংযোগ করতে পারেন, আবার কন্টেইনার টপোলজি আগে থেকে না জানেও।
কন্টেইনার থেকে হোস্ট নেটওয়ার্কিং
এটি কিছুটা আরও আকর্ষণীয়। আপনার কন্টেইনারها দীর্ঘদিন চলতে পারে, তাই সেগুলো রানিং থাকতে পারে। মানে কন্টেইনারها মেইনটেইন করতে হতে পারে—আপগ্রেড, প্যাচিং, হোস্টস ফাইল আপডেট, ইত্যাদি। আপনি Chef, Puppet বা Cfengine-এর মতো কনফিগারেশন ম্যানেজমেন্ট টুলও ব্যবহার করতে পারেন।
প্রথম বড় প্রশ্ন: কন্টেইনারها কি বাইরের বিশ্বের সাথে যোগাযোগ করতে পারে? হ্যাঁ। ইন্ট্রো গাইডে আমরা অফিসিয়াল রিপোজিটরি থেকে CentOS আপডেট ডাউনলোড করেছিলাম, তাই এটি ভালো কাজ করে। `docker0` পিং করার কথা:
দ্বিতীয় প্রশ্ন: কি আমরা `docker0` ইন্টারফেস অ্যাক্সেস করে তারপর তার হোস্ট পোর্টের সাথে সংযোগ করতে পারি? ধরুন কন্টেইনারের ভিতরে প্রয়োজনীয় তথ্য দেওয়া হয়েছে।
telnet 172.17.42.1 49162 Trying 172.17.42.1... telnet: connect to address 172.17.42.1: No route to host
এটি কাজ করবে না, কারণ হোস্টে IP ফরওয়ার্ডিং কনফিগার করা নেই। علاয়ে, ট্রাফিক অনুমোদনের জন্য ফায়ারওয়াল নিয়ম লাগবে। এখানে কিছুটা জটিলতা আসে, কারণ `iptables`-এ অভ্যস্ত না হলে কিছুটা কষ্ট হবে।
echo 1 > /proc/sys/net/ipv4/ip_forward
এবং `iptables` নিয়মগুলো—একটু ঢিলা সেট, মনে রাখবেন (হোস্টে):
iptables -t filter -A FORWARD -d 172.17.0.0/16 \ -o docker0 -j ACCEPT iptables -t filter -A FORWARD -s 172.17.0.0/16 \ -i docker0 -j ACCEPT iptables -t filter -A FORWARD -i docker0 -o docker0 -j ACCEPT iptables -t nat -A POSTROUTING -s 172.17.0.0/16 \ ! -d 172.17.0.0/16 -p tcp -j MASQUERADE --to-ports 1016-65535 \ iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -p udp -j MASQUERADE --to-ports 1016-65535 \ iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE
সरल বিকল্প হলো ফায়ারওয়াল বন্ধ করা—অথবা সব অনুমতি দেওয়া। এর মানে `systemctl stop firewalld`, `iptables -F` বা সমতুল্য কমান্ড চালানো। কিছু পরিস্থিতিতে এটি সম্ভব নয়, কারণ অতিরিক্ত নিরাপত্তা দরকার। কিন্তু এটি আমরা যে প্রথম ইউজকেসে আলোচনা করেছি সেটাও সম্পর্কিত। এখন কল্পনা করুন, প্রতিটি কন্টেইনার এবং তার সংশ্লিষ্ট সার্ভিসের জন্য ম্যানুয়াল নিয়ম তৈরি করতে হতো।
সঠিক নেটওয়ার্কিং নিয়ম থাকলে, আপনি হোস্ট পোর্টের সাথে সংযোগ করতে পারবেন, যা কার্যকরভাবে অন্যান্য কন্টেইনারের সাথে কথা বলা মানে, যদিও নির্দিষ্ট IP বা পোর্টে টার্গেট অন্য কন্টেইনার হতে বাধ্য নয়। এর পлюস, আপনি হোস্টের অন্যান্য নেটওয়ার্কিং ডিভাইস বা দূরবর্তী হোস্টের সাথে সংযোগ করতে পারবেন।
কন্টেইনার থেকে কন্টেইনার নেটওয়ার্কিং
ডেভিড বোয়ির গান "Ashes to Ashes"-এর মতো, শুধু কুল না। এটি সবচেয়ে উপকারী পরিস্থিতি মনে হয়। আবার দুটি অপশন। আমরা অন্য কন্টেইনারها সাথে সরাসরি সংযোগ চেষ্টা করতে পারি, অথবা `docker0` ডাইনামিক্যালি ম্যাপড পোর্ট ব্যবহার করতে পারি। আমরা চিট করব। হোস্ট এবং হোস্ট পোর্টকে গেটওয়ে হিসেবে ব্যবহার করব কন্টেইনারهاে প্রবেশের জন্য। প্রথম পদ্ধতিটি সহজ। `net1` থেকে `net2` এবং `net3` পিং করার চেষ্টা করি।
এটি কোনো সমস্যা ছাড়া কাজ করে। কিন্তু সমস্যাটা হলো, আমরা IP ঠিকানাগুলো বাইরের جهان থেকে জানি! আমরা কন্টেইনারের ভিতর থেকে এই তথ্য পাইনি। নিরাপত্তার কারণ এবং বেস কন্টেইনার ছোট ইমেজ হওয়ার কারণে, ডিফল্টভাবে কোনো ভালো নেটওয়ার্কিং টুল থাকে না। `ifconfig` ইউটিলিটি থেকেও থাকে না। 더불어, কন্টেইনারের ভিতর থেকে `iptables` ম্যানিপুলেট করা যাবে না:
iptables -L iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root) Perhaps iptables or your kernel needs to be upgraded.
তাই দ্বিতীয় পদ্ধতি, `docker0` অ্যাক্সেস করে হোস্ট পোর্টের সাথে সংযোগ, সম্ভব নয়, কারণ কন্টেইনার থেকে হোস্ট ফায়ারওয়াল নিয়ম ম্যানিপুলেট করা যায় না। তাই আমরা তৃতীয় পদ্ধতি আলোচনা করব।
কন্টেইনার লিংক!
সঠিক পদ্ধতিটি হলো `--link` ফিচার ব্যবহার করা। এর মানে হলো, আমরা নতুন ইনস্ট্যান্স তৈরি করব বিদ্যমান কন্টেইনারها সাথে লিংক করে। লিংক ফাংশন লিংকড কন্টেইনারের হোস্টনেম এবং IP ঠিকানা নতুন ইনস্ট্যান্সের এনভায়রনমেন্ট এবং `/etc/hosts` ফাইলে ইনসার্ট করে। শুনতে একটু বিভ্রান্তিকর লাগতে পারে, তাই উদাহরণ দিয়ে বুঝাই:
docker run -d -ti -p 80 --name web image-4:latest 8e689d8ae3ef43eeab3bfa9cf523e1cc6658dae5fc665f8cbf889db17db46c26 docker inspect web | grep -i ipaddr "IPAddress": "172.17.0.9", nc -w1 -v 172.17.0.9 80 Ncat: Version 6.40 ( https://nmap.org/ncat ) Ncat: Connected to 172.17.0.9:80.
আমাদের একটি কন্টেইনার চলছে, যা ওয়েব সার্ভার হিসেবে কাজ করতে। এখন আমরা ক্লায়েন্টদের এটি অ্যাক্সেস করতে দিতে চাই। আমরা সার্ভারের নাম ব্যবহার করব, IP ঠিকানা নয়, কারণ টপোলজি আগে থেকে জানা নেই। নাম ব্যবহার করলে নেটওয়ার্ক লেআউট পরিবর্তন করা যায়। চলুন একটি ক্লায়েন্ট কন্টেইনার তৈরি করি এবং আমাদের ওয়েব সার্ভারের সাথে লিংক করি:
docker run -ti --name client --link web:web image-4:latest /bin/bash
এখানে কী হচ্ছে: আমরা source:target ফরম্যাটে লিংক তৈরি করছি। অর্থাৎ, `web` নামের সার্ভার (কন্টেইনার) আমাদের নতুন `client` নামের কন্টেইনারের ভিতরে `web` নামে দৃশ্যমান হবে। কন্টেইনার স্পন করে এটাচ করলে, BASH শেলে `env` কমান্ড চালিয়ে এনভায়রনমেন্ট চেক করতে পারেন:
WEB_PORT_80_TCP_PORT=80 WEB_PORT_80_TCP=tcp://172.17.0.9:80 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PWD=/ WEB_PORT_22_TCP_ADDR=172.17.0.9 container_uuid=558a9db0-6d1e-d9d2-b62d-a8dbfbad0b2d WEB_PORT_22_TCP=tcp://172.17.0.9:22 SHLVL=1 HOME=/root WEB_NAME=/client/web WEB_PORT_80_TCP_PROTO=tcp WEB_PORT_80_TCP_ADDR=172.17.0.9 LESSOPEN=||/usr/bin/lesspipe.sh %s WEB_PORT=tcp://172.17.0.9:22 _=/usr/bin/env
একই নাম ম্যাপিং বিভ্রান্তিকর হতে পারে, তাই ভিন্ন ম্যাপিং ট্রাই করি:
docker run -ti --name client --link web:dedoimedo image-4:latest /bin/bash
এবং তখন আমরা পাই:
ঐচ্ছিকভাবে, যদি আপনি শুধু দ্রুত কাজের জন্য কন্টেইনার স্পন করেন, তবে `run --rm` অপশন ব্যবহার করতে পারেন। স্বল্পকালীন টাস্কের জন্য, কন্টেইনার ফাইল ডিস্কে রাখার কারণ নেই, এবং ডকার আউটোমেটিক্যালি ক্লিন আপ করে দেয়। অফিসিয়াল ডকুমেন্টেশন পড়লে:
ডিফল্টভাবে কন্টেইনারের ফাইল সিস্টেম কন্টেইনার এক্সিট করার পরও থাকে। এটি ডিবাগিং সহজ করে (কারণ আপনি চূড়ান্ত স্টেট ইন্সপেক্ট করতে পারেন) এবং ডিফল্টভাবে আপনার সব ডেটা রাখে। কিন্তু আপনি যদি শর্ট-টার্ম ফোরগ্রাউন্ড প্রসেস চালান, তবে এই কন্টেইনার ফাইল সিস্টেমগুলো ভয়ঙ্কর গড়ে ওঠে। যদি আপনি চান ডকার কন্টেইনার এক্সিট করার সাথে সাথে অটোমেটিক্যালি ক্লিন আপ করে দেয় এবং ফাইল সিস্টেম রিমুভ করে দেয়, তবে `--rm` ফ্ল্যাগ যোগ করুন।
docker run --rm -ti --name client --link web:dedoimedo image-4:latest /bin/bash
হোস্টস ফাইল
লিংক ফাংশনের دوم ভালো দিক হলো, নতুন কন্টেইনারদের `/etc/hosts` ফাইল অটোমেটিক্যালি প্রয়োজনীয় নামের সাথে পপুলেট হয়। এটি কিছু নিচের মতো দেখাবে, IPv6 এন্ট্রি বাদ দিয়ে:
[root@e1e92f6918dd /]# cat /etc/hosts 172.17.0.11 e1e92f6918dd 127.0.0.1 localhost 172.17.0.9 dedoimedo 8e689d8ae3ef web
নাম ব্যবহার করে সার্ভারের সাথে সংযোগ
এখন যেহেতু হোস্ট নেম রেজোলিউশন এবং এনভায়রনমেন্ট সেটিংস আছে, তাই এটি যেকোনো নেটওয়ার্কের মতোই। খুব সহজ, মনে রাখা সহজ এবং সবচেয়ে গুরুত্বপূর্ণ—স্ক্রিপ্টযোগ্য।
আরও পঠন
আপনি যদি মনে করেন এখনো পূরণ হয়নি, তবে:
ডকার অ্যাডভান্সড নেটওয়ার্কিং গাইড
উপসংহার
হয়ে গেলো। আরেকটি ভয়ানক টপিক ডিমিস্টিফাইড। কথা হলো, আমি মনে করি ডকার কন্টেইনার নিয়ে কাজ করার সময় আপনি যে সবচেয়ে বড় চ্যালেঞ্জ ফেস করবেন সেটা ফায়ারওয়াল নিয়ম কনফিগার করা, এই প্রযুক্তির নেটওয়ার্কিং অংশ নয়। কিন্তু একবার হাতেলগা পেলে এটি না খুব কঠিন न জটিল।
আমরা দেখেছি কীভাবে কন্টেইনার শুরু করা যায় এবং পোর্ট এক্সপোজ করা, হোস্ট-টু-কন্টেইনার, কন্টেইনার-টু-হোস্ট এবং কন্টেইনার-টু-কন্টেইনার নেটওয়ার্কিং, ফরওয়ার্ডিং সেটআপ, এবং লিংক ব্যবহার করে জীবন কতটুকু সহজ ও প্রিডিক্টেবল করা যায়। সার্বিকভাবে, এটি একটি ব্যস্ত কিন্তু আশা করি প্র্যাক্টিক্যাল গাইড। আবার, আপনার অন্য কোনো টপিক থাকলে জানাতে পারেন। আর আমরা শেষ।
P.S. আপনি যদি এই আর্টিকেল পছন্দ করেন, তবে Dedoimedo-কে কিছু ভালোবাসা দিন!
চিয়ার্স।