ডকারে "এক্সপোজ" এবং "প্রকাশ" এর মধ্যে পার্থক্য কী?


517

আমি ডকস্পিলিসের সাথে পরীক্ষা নিরীক্ষা করছি এবং আমার মনে হয় আমি বেশিরভাগ যুক্তি বুঝতে পারি। যাইহোক, আমি এই প্রসঙ্গে একটি বন্দর "প্রকাশ" এবং "প্রকাশ" মধ্যে পার্থক্য দেখছি না।

আমি প্রথমে যে সমস্ত টিউটোরিয়াল দেখেছি EXPOSEসেগুলিতে ডকফাইফিলের কমান্ডটি অন্তর্ভুক্ত করা হয়েছে :

...
EXPOSE 8080
...

তারপরে তারা এই ডকফায়াইল থেকে একটি চিত্র তৈরি করে:

$ docker build -t an_image - < Dockerfile

এবং তারপরে চিত্রটি চালনার সময় উপরের মতো একই পোর্টটি প্রকাশ করুন:

$ docker run -d -p 8080 an_image

বা ব্যবহার করে সমস্ত বন্দর প্রকাশ করুন

$ docker run -d -P an_image

ডকফাইফিলের কোনও বন্দর উন্মুক্ত করার অর্থ কী, যদি তা প্রকাশিত হয় তবে? কি প্রথম পোর্ট এক্সপোজ করতে, এবং একটি প্রয়োজন রাখতে সেখানে হবে না এটা পরে প্রকাশ করতে হলো? কার্যকরভাবে, আমি চিত্রটি তৈরি করার সময় আমি ডকফায়িলগুলিতে যে সমস্ত পোর্ট ব্যবহার করব তা নির্দিষ্ট করতে চাই এবং তারপরে আবার বিরক্ত না করে কেবল এগুলি চালিয়ে যাচ্ছি:

$ docker run -d an_image

এটা কি সম্ভব?

উত্তর:


731

মূলত, আপনার কাছে তিনটি বিকল্প রয়েছে:

  1. নির্দিষ্ট EXPOSEবা না-p
  2. কেবল নির্দিষ্ট করুন EXPOSE
  3. নির্দিষ্ট করুন EXPOSEএবং-p

1) আপনি যদি নাও নির্দিষ্ট করেন তবে EXPOSEধারকটির -pপরিষেবা কেবল ধারকটির ভিতরে থেকেই অ্যাক্সেসযোগ্য হবে ।

২) আপনি যদি EXPOSEকোনও বন্দর করেন তবে ধারকটির পরিষেবা ডকারের বাইরে থেকে অ্যাক্সেসযোগ্য নয়, তবে অন্যান্য ডকারের পাত্রেও। সুতরাং এটি আন্তঃ-ধারক যোগাযোগের জন্য ভাল।

3) আপনি EXPOSEএবং -pকোনও বন্দর, কনটেইনারে পরিষেবা যে কোনও জায়গা থেকে এমনকি ডকারের বাইরেও অ্যাক্সেসযোগ্য।

উভয়ই বিচ্ছিন্ন হওয়ার কারণ আইএমএইচও কারণ:

  • হোস্ট পোর্ট বেছে নেওয়া হোস্টের উপর নির্ভর করে এবং তাই ডকফাইফিলের অন্তর্গত নয় (অন্যথায় এটি হোস্টের উপর নির্ভর করবে),
  • এবং একটি পাত্রে কোনও পরিষেবা অন্য ধারক থেকে অ্যাক্সেসযোগ্য হলে প্রায়শই এটি যথেষ্ট।

ডকুমেন্টেশন স্পষ্টভাবে বলে:

EXPOSEনির্দেশ সংযোগগুলি মধ্যে ব্যবহারের জন্য পোর্ট অনাবৃত।

এটি পাত্রে কীভাবে লিঙ্ক করবেন তা আপনাকেও নির্দেশ করে , যা মূলত আমি আন্তঃ কন্টেইনার যোগাযোগের কথা বলেছিলাম।

PS: আপনি যদি করেন -pতবে তা না EXPOSEকরলে ডকার একটি অন্তর্নিহিত কাজ করে EXPOSE। এটি কারণ যদি কোনও বন্দর জনসাধারণের জন্য উন্মুক্ত থাকে তবে এটি স্বয়ংক্রিয়ভাবে অন্যান্য ডকারের পাত্রেও খোলা থাকবে। সুতরাং -pঅন্তর্ভুক্ত EXPOSE। সে কারণেই আমি এটি চতুর্থ মামলা হিসাবে উপরে তালিকাভুক্ত করিনি।


57
আমি মনে করি আপনি এক্সপোজ দিয়ে সঠিক নন। অন্যান্য পাত্রে থেকে, আপনি সমস্ত ধারক বন্দরগুলি এক্সপোজ করেই অ্যাক্সেস করতে পারবেন। আমি চেষ্টা করেছিলাম। এখানে ধরাটি হ'ল ধারক আইপি ঠিকানাটি অনাকাঙ্ক্ষিত। আমি বিশ্বাস করি যে সংযোগটি সক্ষম করার জন্য আপনি কোন ধারকটি সংযোগ করতে চান তা নির্দিষ্ট করতে (যাতে আপনি নির্দিষ্ট ধারক আইপি-র সাথে লিঙ্ক করেন) ব্যবহৃত হয় link
জিরি

7
"আপনি যদি সেগুলির কোনওটি নির্দিষ্ট না করেন", আপনি যদি সেই স্পষ্ট করে "সেই " গুলির সাথে বোঝায় EXPOSEএবং -pতিনটি বুলেট পয়েন্ট পূর্ববর্তী নয় তবে তা কার্যকর হবে। আমাকে কিছুটা বিভ্রান্ত করে ফেলেছে।
পিথিকোস

4
সম্পূর্ণরূপে সম্পূর্ণ হওয়ার জন্য, এই উত্তরের একটি চতুর্থ সম্ভাব্য কেসটিকেও সম্বোধন করা উচিত: আপনি নির্দিষ্ট করেন নি EXPOSE , কিন্তু আপনি হয়নি উল্লেখ -p। এটা আমি বুঝি যে যদি আপনি সবসময় ব্যবহার -pএবং স্বতন্ত্র পাত্রে চালানো তারপর EXPOSEসরিয়ে দেওয়া হয়, কিন্তু যখন ব্যবহার করে এটি দরকারী / প্রয়োজনীয় হয়ে -Pবা --link। (এবং যেহেতু আপনি জানেন না যে অন্যান্য লোকেরা কীভাবে আপনার চিত্র ব্যবহার করবে, তাই EXPOSEকোনও জনসাধারণের ছবিতে নির্দিষ্ট করা উচিত))
গ্র্যান্ডওপেনার

6
দস্তাবেজগুলি আর বলে না "এক্সপোজ নির্দেশাবলী লিঙ্কগুলির মধ্যে ব্যবহারের জন্য পোর্টগুলি প্রকাশ করে"।
লরিন হচস্টিন

11
ডাউনভোট কারণ এটি যথেষ্ট ভুল। এক্সপোজ মূলত ডকুমেন্টেশন, এবং এটি ব্যবহার না করা অ্যাক্সেসকে সীমাবদ্ধ করে না। যদি অ্যাক্সেস সীমাবদ্ধ করতে কেউ এর উপর নির্ভর করে তবে এটি একটি ডেঞ্জেরো ভুল বোঝাবুঝি।
এমসি 0 ই

166

সংক্ষিপ্ত উত্তর:

  • EXPOSEডকুমেন্টিংয়ের একটি উপায়
  • --publish(অথবা -p) একটি উপায় ম্যাপিং একটি হোস্ট বন্দর একটি চলমান থেকে ধারক পোর্ট

নীচে বিজ্ঞপ্তি:

  • EXPOSEসম্পর্কিত Dockerfiles( ডকুমেন্টিং ) সম্পর্কিত ) সম্পর্কিত
  • --publishসম্পর্কিত docker run ...( সম্পাদন / রান-সময় ) সম্পর্কিত

বন্দরগুলি প্রকাশ ও প্রকাশ করা হচ্ছে

ডকার নেটওয়ার্কিংয়ে, দুটি পৃথক প্রক্রিয়া রয়েছে যা সরাসরি সরাসরি বন্দরগুলিতে জড়িত থাকে: এক্সপোর্ট করা এবং বন্দর প্রকাশ করা। এটি ডিফল্ট ব্রিজ নেটওয়ার্ক এবং ব্যবহারকারী-সংজ্ঞায়িত সেতু নেটওয়ার্কগুলিতে প্রযোজ্য।

  • আপনি EXPOSEডকফায়লে কীওয়ার্ড বা --exposeডকার চালানোর জন্য পতাকা ব্যবহার করে পোর্টগুলি উন্মোচন করুন । বন্দর এক্সপোজ করার একটি উপায় ডকুমেন্টিংয়ের যা কোন বন্দর ব্যবহৃত হয় তবে বাস্তবে কোনও মানচিত্র বা কোনও বন্দর খোলা হয় না । পোর্টগুলি এক্সপোজ করা alচ্ছিক।

  • আপনি --publishবা ব্যবহার করে --publish-allপতাকা ব্যবহার করে বন্দরগুলি প্রকাশ করুন docker run। এটি ডকারকে জানিয়েছে যে ধারকটির নেটওয়ার্ক ইন্টারফেসে কোন বন্দরগুলি খুলতে হবে। যখন কোনও বন্দর প্রকাশিত হয়, এটি একটি উপলব্ধ উচ্চ-অর্ডার পোর্টে ম্যাপ করা হয় (এর চেয়েও বেশি)30000 হোস্ট মেশিনে ) , যদি না আপনি রানটাইমটিতে হোস্ট মেশিনে মানচিত্রের জন্য পোর্টটি নির্দিষ্ট করেন। আপনি ইমেজটি তৈরি করার সময় হোস্ট মেশিনে মানচিত্রের জন্য বন্দরটি নির্দিষ্ট করতে পারবেন না (ডকফাইফিলের মধ্যে), কারণ যেখানে ইমেজটি চালাবেন সেখানে হোস্ট মেশিনে পোর্টটি উপলব্ধ থাকবে তার গ্যারান্টি দেওয়ার কোনও উপায় নেই

থেকে: ডকার কনটেইনার নেটওয়ার্কিং

অক্টোবর 2019 আপডেট করুন : উপরের পাঠ্যের টুকরোটি আর ডক্সে নেই তবে একটি সংরক্ষণাগারযুক্ত সংস্করণটি এখানে রয়েছে: ডকস.ডোকার.com / v17.09 / engine / userguide / networking / #exposing- এবং- প্রকাশনা- বিমানবন্দরসমূহ

সম্ভবত বর্তমান ডকুমেন্টেশন নীচে:

প্রকাশিত বন্দর

ডিফল্টরূপে, আপনি যখন একটি ধারক তৈরি করেন, এটি এর কোনও বন্দর বাইরের বিশ্বে প্রকাশ করে না। ডকারের বাইরের পরিষেবাগুলিতে বা কন্টেইনারের নেটওয়ার্কের সাথে সংযুক্ত নয় এমন ডকার পাত্রে পোর্ট উপলব্ধ করার জন্য, পতাকা --publishবা -pপতাকা ব্যবহার করুন । এটি ফায়ারওয়াল নিয়ম তৈরি করে যা ডকার হোস্টের কোনও পোর্টে একটি ধারক পোর্টকে মানচিত্র করে।

এবং এখানে পাওয়া যাবে: docs.docker.com/config/containers/container-networking/# প্রকাশিত বিমানবন্দর

এছাড়াও,

প্রকাশ করা

... EXPOSEনির্দেশনা আসলে বন্দরটি প্রকাশ করে না । এটি একধরণের ডকুমেন্টেশন হিসাবে কাজ করেচিত্রটি তৈরি করা ব্যক্তি এবং ধারকটি চালিতকারী ব্যক্তির মধ্যে, কোন বন্দরগুলি প্রকাশ করার উদ্দেশ্যে রয়েছে সেগুলির মধ্যে এটি একধরণের ।

থেকে: ডকফরফাইল রেফারেন্স






পরিষেবা অ্যাক্সেস যখন EXPOSE/ --publishসংজ্ঞায়িত না হয়:

@Golo Roden এর উত্তর যে বলা ::

"আপনি যদি এগুলির মধ্যে কোনওটি নির্দিষ্ট না করেন তবে ধারকটির ভিতরে থাকা পরিষেবা ব্যতীত অন্য কোনও স্থান থেকে পরিষেবাটি অ্যাক্সেসযোগ্য হবে না।"

হয়তো সময় উত্তর লেখা হচ্ছে এ ক্ষেত্রে ছিল যে, কিন্তু এখন মনে হচ্ছে যে এমনকি যদি আপনি ব্যবহার করবেন না EXPOSEবা --publish, hostঅন্যান্য এবংcontainers একই নেটওয়ার্কের কোনও পরিষেবা আপনি সেই ধারকটির ভিতরে শুরু করতে পারেন এমন কোনও পরিষেবা অ্যাক্সেস করতে সক্ষম হবেন।

এটি কীভাবে পরীক্ষা করবেন:

আমি নিম্নলিখিত ব্যবহার করেছি Dockerfile। মূলত, আমি উবুন্টু দিয়ে শুরু করি এবং একটি ক্ষুদ্র ওয়েব-সার্ভার ইনস্টল করি:

FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd

আমি build"টেস্টপোজ" হিসাবে চিত্রটি এবং runএকটি নতুন ধারক সহ:

docker run --rm -it testexpose bash

ধারকটির ভিতরে, আমি কয়েকটি উদাহরণ চালু করি mini-httpd:

root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090

আমি তার পরে curlহোম পেজ আনতে হোস্ট বা অন্যান্য পাত্রে ব্যবহার করতে সক্ষম হয়েছি mini-httpd


16
এটি এখন সঠিক উত্তর। গৃহীত উত্তর পূর্ববর্তী সংস্করণগুলির উপর ভিত্তি করে রয়েছে বলে মনে হয়।
লুক ডাব্লু

হোস্ট পোর্টটি আপনি কার্লের জন্য কী ব্যবহার করেছেন?
মস্তিষ্কের ঝড়

আমি ধারকটির আইপি ব্যবহার করেছি (এর মতো কিছু 172.17.0.2) এবং আমি যে সমস্ত পোর্টের উল্লেখ করছি। আপনি যদি ম্যাক / উইন্ডোজের জন্য ডকার ব্যবহার করেন তবে নেটওয়ার্কিং আলাদা। সেখানে নেই docker0সেতু।
টগোগোস

"-পি" পতাকা সহ সমস্ত এক্সপোজড পোর্ট প্রকাশ করার সময় হোস্টে কোন পোর্টটি ব্যবহৃত হয় তা আমি কীভাবে বলতে পারি ??
ষাট


9

অফিসিয়াল ডকুমেন্টেশন রেফারেন্স দেখুন: https://docs.docker.com/engine/references/builder/#expose

EXPOSEযখন আপনি ধারক চলমান জন্য ছবিটি বিল্ড সময়ে তা প্রকাশ করার ব্যক্তিগত (ধারক) এবং সর্বজনীন (হোস্ট) পোর্ট নির্ধারণ করার অনুমতি দেয় যদি আপনার সাথে ধারক চালানো -P

$ docker help run
...
  -P, --publish-all                    Publish all exposed ports to random ports
...

সার্বজনীন বন্দর এবং প্রোটোকল alচ্ছিক, যদি কোনও সর্বজনীন বন্দর নির্দিষ্ট না করা হয় তবে ডকফায়লে নির্দিষ্ট কন্টেইনার পোর্টটি উন্মোচনের জন্য ডকারের দ্বারা হোস্টে একটি এলোমেলো বন্দর নির্বাচন করা হবে।

একটি ভাল অভ্যাসটি সর্বজনীন বন্দর নির্দিষ্ট করে না, কারণ এটি প্রতি হোস্টের জন্য কেবল একটি ধারককে সীমাবদ্ধ করে (দ্বিতীয় পাত্রে ইতিমধ্যে ব্যবহৃত একটি বন্দর ফেলে দেওয়া হবে)।

আপনি ব্যবহার করতে পারেন -pমধ্যে docker runনিয়ন্ত্রণ করতে কি পাবলিক বন্দর উন্মুক্ত ধারক পোর্ট কানেকটেবেল হবে।

যাইহোক, আপনি যদি ব্যবহার না করেন EXPOSE( -Pডকার চালানোর সাথে) এবং নাও -p, কোনও পোর্ট প্রকাশিত হবে না।

আপনি সবসময় ব্যবহার করেন তাহলে -pdocker runতুমি কি প্রয়োজন EXPOSEকিন্তু যদি আপনি ব্যবহার EXPOSEআপনার docker runকমান্ড আরও সহজ হতে পারে, EXPOSEযদি আপনি কি দেখেন না কি বন্দর হোস্ট এক্সপোজ করা হবে উপযোগী হতে পারে, অথবা যদি আপনি যদি শুধুমাত্র একটি পাত্রের নিশ্চিত লোড হবে।


এটা সঠিক। ডকফাইলে যখন আপনার এক্সপোজ পোর্টনাম্বার থাকে তখন মনে রাখবেন যে ডকারকে -পি দিয়ে রান করতে পারেন।
কুনইউ সোই

6

আপনি ডকারফিলের এক্সপোজ কীওয়ার্ড বা ডোরার -র জন্য - এক্সপোজ পতাকা ব্যবহার করে পোর্টগুলি উন্মোচন করুন। এক্সপোর্ট করা পোর্টগুলি ডকুমেন্টিংয়ের একটি উপায় যা কোন বন্দর ব্যবহৃত হয় তবে বাস্তবে কোনও মানচিত্র বা কোনও বন্দর খোলা হয় না। পোর্টগুলি এক্সপোজ করা alচ্ছিক।

সূত্র: গিথুব কমিট


3

বেশিরভাগ লোকেরা নেটওয়ার্কের সাথে ডকার রচনা ব্যবহার করেন। ডকুমেন্টেশন পদ বলে:

ডকার নেটওয়ার্ক বৈশিষ্ট্যটি নেটওয়ার্কের মধ্যে পোর্টগুলি প্রকাশের প্রয়োজন ছাড়াই নেটওয়ার্ক তৈরিতে সহায়তা করে, বিশদ তথ্যের জন্য এই বৈশিষ্ট্যের ওভারভিউটি দেখুন)।

যার অর্থ হ'ল আপনি যদি ধারকগুলির মধ্যে যোগাযোগের জন্য নেটওয়ার্কগুলি ব্যবহার করেন তবে আপনাকে পোর্ট উন্মুক্ত করার বিষয়ে চিন্তা করার দরকার নেই।


-5

এক্সপোস স্থানীয় পোর্ট কনটেইনার পোর্ট ম্যাপ করতে ব্যবহৃত হয় যেমন: আপনি যদি ডকার ফাইলের মতো এক্সপোজ নির্দিষ্ট করে থাকেন

EXPOSE 8090

এটি কী করবে এটি লোকালহোস্ট পোর্ট ৮০৯০ থেকে কনটেইনার পোর্ট ৮০৯০ মানচিত্র তৈরি করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.