ডকার কমান্ডে --net = হোস্ট বিকল্পটি আসলে কী করে?


97

আমি ডকারের জন্য কিছুটা নবজাতক। এই অপশনটি ডোকর রান কমান্ডে এটি সম্পর্কে গভীর এবং কিছুটা বিভ্রান্তির সাথে কী করে তার কোনও পরিষ্কার বিবরণ আমি খুঁজে পাইনি।

আমরা কোনও বন্দর নির্দিষ্ট করে না রেখে ডকার পাত্রে চালিত অ্যাপ্লিকেশনগুলি অ্যাক্সেস করতে এটি ব্যবহার করতে পারি? উদাহরণস্বরূপ, যদি আমি -p 8080:8080ডকার রান কমান্ডের বিকল্পটি ব্যবহার করে 8080 পোর্টে একটি ডকার চিত্রের মাধ্যমে মোতায়েন করা একটি ওয়েবপ্যাপ চালনা করি, আমি জানি আমি এটি ডকার ধারক আইপি / ডাব্লু ওয়েব অ্যাপনেমে 8080 বন্দরে অ্যাক্সেস করতে হবে। তবে --net=hostবিকল্পটি কীভাবে কাজ করে তা আমি সত্যিই ভাবতে পারি না ।

উত্তর:


131

ডকার ইনস্টলেশন পরে আপনার ডিফল্টরূপে 3 টি নেটওয়ার্ক রয়েছে:

docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
f3be8b1ef7ce        bridge              bridge              local
fbff927877c1        host                host                local
023bb5940080        none                null                local

আমি এই সহজ রাখার চেষ্টা করছি। সুতরাং আপনি যদি ডিফল্টরূপে একটি ধারক শুরু করেন তবে এটি সেতুর (ডকার0) নেটওয়ার্কের অভ্যন্তরে তৈরি হবে।

$ docker run -d jenkins
1498e581cdba        jenkins             "/bin/tini -- /usr..."   3 minutes ago       Up 3 minutes        8080/tcp, 50000/tcp   friendly_bell

Jenkins এর dockerfile বন্দরগুলি 8080এবং 50000উদ্ভাসিত হয়। এই বন্দরগুলি তার ব্রিজ নেটওয়ার্কের ধারকটির জন্য খোলা হয়েছে। সুতরাং সেতু নেটওয়ার্কের ভিতরে থাকা সমস্ত কিছুই পোর্টে 8080এবং ধারক স্থানে প্রবেশ করতে পারে 50000। ব্রিজ নেটওয়ার্কের সমস্ত কিছু ব্যক্তিগত রেঞ্জের মধ্যে থাকে "Subnet": "172.17.0.0/16",যদি আপনি বাইরে থেকে এগুলি অ্যাক্সেস করতে চান তবে আপনাকে বন্দরগুলি ম্যাপ করতে হবে -p 8080:8080। এটি আপনার ধারকটির বন্দরটিকে আপনার আসল সার্ভারের (হোস্ট নেটওয়ার্ক) মানচিত্র তৈরি করবে। সুতরাং আপনার সার্ভারটিতে অ্যাক্সেস 8080পোর্টে আপনার ব্রিজজনেট ওয়ার্কের দিকে যাত্রা করবে 8080

এখন আপনার হোস্ট নেটওয়ার্কও আছে। যা পাত্রে নেটওয়ার্কিং চালিত করে না। সুতরাং আপনি হোস্ট নেটওয়ার্কে কোনও ধারক শুরু করলে এটি দেখতে এটির মতো দেখাবে (এটি প্রথমটি):

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
1efd834949b2        jenkins             "/bin/tini -- /usr..."   6 minutes ago       Up 6 minutes                              eloquent_panini
1498e581cdba        jenkins             "/bin/tini -- /usr..."   10 minutes ago      Up 10 minutes       8080/tcp, 50000/tcp   friendly_bell

পার্থক্যটি বন্দরগুলির সাথে। আপনার ধারকটি এখন আপনার হোস্ট নেটওয়ার্কের মধ্যে রয়েছে। সুতরাং আপনি যদি 8080আপনার হোস্টে পোর্ট খুলেন তবে আপনি অবিলম্বে ধারকটি অ্যাক্সেস করতে পারবেন।

$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT

আমি 8080আমার ফায়ারওয়ালে পোর্ট খুলেছি এবং যখন আমি এখন বন্দরে আমার সার্ভারটি অ্যাক্সেস করছি তখন আমি 8080আমার জেনকিনগুলি অ্যাক্সেস করছি। আমি মনে করি এটি আরও ভালভাবে বুঝতে এই ব্লগটিও দরকারী।


4
--net=hostডকফাইফিলের ভিতরে বিকল্পটি যুক্ত করা কি সম্ভব ?
অনিরবানদেবনাথ

6
@AnirbanDebnath আমি মনে করি না এটি একটি dockerfile কিন্তু Docker V17 আপনি আপনার Docker বিল্ড একটি প্যারামিটার হিসাবে এটি ব্যবহার করতে পারেন, যেহেতু এটা করা সম্ভব: docker build --network=host। ডকার বিল্ডের জন্য নির্দিষ্ট হোস্ট নেটওয়ার্কটি কেবল প্যাকেজগুলি ডাউনলোড করার জন্য যা ইমেজ তৈরির জন্য প্রয়োজনীয়। আপনি যখন হোস্ট নেটওয়ার্কে আপনার ধারকটি চালাতে চান তখন আপনাকে --network = হোস্ট বিকল্পটি সংজ্ঞায়িত করতে হবে।
lvthillo

হ্যাঁ @ অনিরবানডেবনাথ, এটি ডকফাইফিলের মধ্যে অনুমোদিত। যেমন ইন v3 এর - network_mode: "host"(সুত্র - docs.docker.com/compose/compose-file/#network_mode )
Mohnish

4
এটি একটি ডকার-রচনা ফাইল যা কনটেইনারটি কীভাবে চালিত হবে তা বর্ণনা করে। ডকফেরাইল নয়। তবে প্রকৃতপক্ষে, এটি সম্ভব এবং ডকার রান হিসাবে একই কাজ করে
নেট

31

--net=hostবিকল্প নেটওয়ার্ক দৃষ্টিকোণ থেকে, Docker ধারক বর্ণন ভিতরে প্রোগ্রাম করতে চান তারা হোস্ট নিজেই দৌড়াচ্ছে ব্যবহার করা হয়। এটি কন্টেইনারটিকে স্বাভাবিকভাবে পাওয়ার চেয়ে বেশি নেটওয়ার্ক অ্যাক্সেসের অনুমতি দেয়।

সাধারণত আপনাকে কোনও পাত্রে হোস্ট মেশিন থেকে পোর্টগুলি ফরোয়ার্ড করতে হয়, তবে যখন পাত্রে হোস্টের নেটওয়ার্ক ভাগ করে নেওয়া হয়, কোনও নেটওয়ার্ক ক্রিয়াকলাপ হোস্ট মেশিনে সরাসরি ঘটে - ঠিক যেমন প্রোগ্রামটি কোনও অভ্যন্তরের পরিবর্তে হোস্টে স্থানীয়ভাবে চলমান ছিল would ধারক

যদিও এর অর্থ হ'ল আপনাকে আর পোর্টগুলি প্রকাশ করতে হবে না এবং সেগুলি কনটেইনার বন্দরগুলিতে মানচিত্র করতে হবে না, এর অর্থ হ'ল প্রতিটি কন্টেইনার শোনার পোর্টগুলি সামঞ্জস্য করতে আপনাকে আপনার ডকফায়াইলস সম্পাদনা করতে হবে, দ্বন্দ্ব এড়ানোর জন্য আপনার দুটি কন্টেইনার একই সাথে কাজ করতে পারে না to হোস্ট পোর্ট তবে এই বিকল্পটির আসল কারণ হ'ল এমন অ্যাপ্লিকেশনগুলি চালানো যা বন্দর পর্যায়ে কোনও ধারককে ফরোয়ার্ড করা শক্ত এমন নেটওয়ার্ক অ্যাক্সেসের প্রয়োজন।

উদাহরণস্বরূপ, আপনি যদি ডিএইচসিপি সার্ভার চালাতে চান তবে আপনাকে নেটওয়ার্কে ট্র্যাফিক ব্রডকাস্ট শুনতে এবং প্যাকেট থেকে ম্যাকের ঠিকানা বের করতে হবে। এই তথ্যটি পোর্ট ফরওয়ার্ডিং প্রক্রিয়া চলাকালীন হারিয়ে যায়, তাই ডকারের ভিতরে ডিএইচসিপি সার্ভার চালানোর একমাত্র উপায় হ'ল কনটেইনারটি চালানো --net=host

সাধারণভাবে বলতে গেলে --net=hostকেবল তখনই প্রয়োজন হয় যখন আপনি খুব সুনির্দিষ্ট, অস্বাভাবিক নেটওয়ার্কের প্রয়োজনে প্রোগ্রাম পরিচালনা করছেন।

শেষ অবধি, সুরক্ষার দৃষ্টিকোণ থেকে ডকারের পাত্রে অনেকগুলি বন্দর শুনতে পাওয়া যায়, যদিও তারা কেবল একটি একক বন্দরের বিজ্ঞাপন (প্রকাশ) করে। আপনি কেবলমাত্র একক প্রত্যাশিত বন্দরটি ফরোয়ার্ড করার সাথে সাধারণত এটি ঠিক আছে, তবে আপনি যদি ব্যবহার করেন --net=hostতবে সমস্ত কন্টেইনারের বন্দরগুলি হোস্টে শুনতে পাবে, এমনকি ডকফাইলে তালিকাভুক্ত নয় those এর অর্থ আপনার অনিয়মিতভাবে মেশিনে অতিরিক্ত পরিষেবাদি এক্সপোজ না করে তা নিশ্চিত করার জন্য আপনার ধারকটি খুব কাছাকাছি পরীক্ষা করতে হবে (বিশেষত এটি যদি আপনার না হয়, উদাহরণস্বরূপ কোনও সফ্টওয়্যার প্রকল্পের দ্বারা প্রদত্ত কোনও অফিসিয়াল)।


'--Net = হোস্ট' বিকল্পের সাথে একাধিক পাত্রে শুরু করা হলে আচরণটি কী হবে? অনুরোধগুলি কি এলোমেলো ধারকটিতে ফরোয়ার্ড করা হবে?
ব্যবহারকারী 482594

@ ব্যবহারকারী 482594: আপনি একই পাত্রে সমস্ত প্রোগ্রাম চালিয়েছিলেন ঠিক তেমন তারা সকলেই একই নেটওয়ার্ক স্ট্যাক ভাগ করবে। উদাহরণস্বরূপ, আপনি যদি দুটি ওয়েবসারভার পরিচালনা করেন তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে তারা বিভিন্ন পোর্টে শুনছেন otherwise আগত ট্র্যাফিক যে কোনও কনটেইনার এটি শুনছে তা প্রেরণ করা হবে (প্রযুক্তিগতভাবে সমস্ত --net=hostধারক ট্র্যাফিকটি দেখতে পাবে, তবে অবশ্যই একটি সেট শুধুমাত্র একটি প্রোগ্রাম কোনও সেট পোর্টে শুনতে পাবে আপনি কোনও কনটেইনার চালিয়ে যান না কেন) এই সেট আপটিতে )।
মালভাইনাস

1
  1. আপনি নিজের নতুন নেটওয়ার্ক তৈরি করতে পারেন - নেট = " যে কোনও নাম" এর মতো
  2. এটি বিভিন্ন ধারক থেকে পরিষেবাগুলি বিচ্ছিন্ন করার জন্য করা হয়।
  3. ধরুন একই পরিষেবাটি বিভিন্ন পাত্রে চলছে তবে পোর্ট ম্যাপিং একই থাকবে, প্রথম ধারকটি ভালভাবে শুরু হয় তবে দ্বিতীয় ধারক থেকে একই পরিষেবা ব্যর্থ হবে। সুতরাং এড়াতে, হয় পোর্ট ম্যাপিং পরিবর্তন করুন বা একটি নেটওয়ার্ক তৈরি করুন।

4
"2. উল্লেখ করার জন্য ধন্যবাদ" এটি বিভিন্ন ধারক থেকে (নেটওয়ার্ক) পরিষেবাগুলি বিচ্ছিন্ন করার জন্য করা হয়েছে "। আমি hostএকই হোস্টে একাধিক পাত্রে চালিত হওয়ার সম্ভাবনা থাকলে অন্যান্য ডকার নেটওয়ার্ক কনফিগারেশন (অন্যটি ) ব্যবহারের সত্যতা আমি দেখতে পাই । অন্যান্য ক্ষেত্রে (যেখানে নেটওয়ার্ক বিচ্ছিন্নতার প্রয়োজন নেই), আমি পছন্দ করব --net=host
সিজেজেড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.