ডকার-কমপোজ পোর্ট বনাম এক্সপোজের মধ্যে পার্থক্য কী


উত্তর:


527

মতে Docker-রচনা রেফারেন্স ,

বন্দরগুলি হিসাবে সংজ্ঞায়িত করা হয়:

বন্দর উন্মুক্ত করুন । হয় উভয় পোর্ট নির্দিষ্ট করুন (হোস্ট: কনটেনার), বা কেবল ধারক বন্দর (একটি এলোমেলো হোস্ট পোর্ট চয়ন করা হবে)।

  • ডকার-কমপোজ.আইএমএল-এ উল্লিখিত পোর্টগুলি ডকার-রচনা দ্বারা শুরু করা বিভিন্ন পরিষেবার মধ্যে ভাগ করা হবে।
  • পোর্টগুলি কোনও এলোমেলো বন্দর বা প্রদত্ত বন্দরটিতে হোস্ট মেশিনের সংস্পর্শে আসবে।

আমার docker-compose.ymlদেখতে দেখতে:

mysql:
  image: mysql:5.7
  ports:
    - "3306"

আমি যদি docker-compose psএটি করি তবে দেখতে এটি দেখতে পাবেন:

  Name                     Command               State            Ports
-------------------------------------------------------------------------------------
  mysql_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:32769->3306/tcp

এক্সপোজ হিসাবে সংজ্ঞায়িত করা হয়:

হোস্ট মেশিনে এগুলি প্রকাশ না করে পোর্টগুলি প্রকাশ করুন - তারা কেবল লিঙ্কযুক্ত পরিষেবাদিতে অ্যাক্সেসযোগ্য হবে। কেবল অভ্যন্তরীণ বন্দর নির্দিষ্ট করা যেতে পারে।

পোর্টগুলি হোস্ট মেশিনগুলির সংস্পর্শে আসে না, কেবল অন্যান্য পরিষেবাদিতেই উন্মুক্ত থাকে।

mysql:
  image: mysql:5.7
  expose:
    - "3306"

আমি যদি docker-compose psএটি করি তবে দেখতে এটি দেখতে পাবেন:

  Name                  Command             State    Ports
---------------------------------------------------------------
 mysql_1      docker-entrypoint.sh mysqld   Up      3306/tcp

24
তা ব্যাখ্যা eto থেকে কি সুফল সেখানে উল্লেখ করা হয় সম্ভব হবে exposeএকটি docker-compose? আমি যতদূর বলতে পারি, লিঙ্কযুক্ত পরিষেবাগুলিতে পোর্টগুলি অ্যাক্সেসযোগ্য করার জন্য আপনাকে এক্সপোজ নির্দিষ্ট করার দরকার নেই।
রসালো

3
এটি কি বলা উচিত নয় যে উন্মুক্ত বন্দরগুলি কেবল একই ডকার নেটওয়ার্কের পরিষেবাগুলিতে উপলব্ধ হবে (লিঙ্কিং বেশিরভাগ অংশের জন্য প্রতিস্থাপন করা হচ্ছে) ?.
মায়ো

8
@ জুসি আমি অনুমান করি এটি ডকফিলস-এর মতোই expose: "এক্সপোস নির্দেশিকাটি আসলে বন্দরটি প্রকাশ করে না It এটি একধরনের
জেনারেশন

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

3
এবং মনে রাখবেন, আপনি যদি ব্যবহার docker-compose runকরেন docker-compose.ymlতবে ডিফল্টরূপে বন্দর সংজ্ঞা উপেক্ষা করা হবে। হয় docker-compose upপ্যারামিটারটি ব্যবহার করুন বা সরবরাহ করুন--service-ports
জুহা আনটিনেন

177

বন্দরসমূহ :

  1. ডকারের বাইরের বিশ্ব থেকে নির্দিষ্ট পোর্ট (গুলি) শোনার জন্য ধারককে সক্রিয় করে তোলে (একই হোস্ট মেশিন বা কোনও ভিন্ন মেশিন হতে পারে) এবং ডকারের অভ্যন্তরেও অ্যাক্সেসযোগ্য বিশ্ব।
  2. একাধিক বন্দর নির্দিষ্ট করা যায় (এজন্য পোর্টগুলি বন্দর নয়)

এখানে চিত্র বর্ণনা লিখুন

প্রকাশ করা :

  1. কেবল ডকারের ভিতরে এবং ডকারের বাইরে অ্যাক্সেসযোগ্য পৃথিবী থেকে কোনও নির্দিষ্ট বন্দর শোনার জন্য ধারককে সক্রিয় করে।
  2. একাধিক বন্দর নির্দিষ্ট করা যেতে পারে

এখানে চিত্র বর্ণনা লিখুন


3
নোট করুন যে এক্সপোজ একাধিক বন্দরকে অনুমতি দেয় - ডকস.ডোকার.com / compose / compose - file / #expose - তবে আপনি কেবল অভ্যন্তরীণ + বাহ্যিকের চেয়ে অভ্যন্তরীণ বন্দর সরবরাহ করেন
স্টুয়ার্ট মুর

তবে আমি যদি আমার ধারক থেকে বাইরের বিশ্বের অ্যাক্সেস করতে চাই তবে কী করব? stackoverflow.com/questions/61322256/...
gstackoverflow

25

পোর্টগুলি এই বিভাগটি হোস্ট সার্ভার এবং ডকারের ধারক মধ্যে ম্যাপিং সংজ্ঞায়িত করতে ব্যবহৃত হয়।

ports:
   - 10005:80

এর অর্থ কনটেইনারটির অভ্যন্তরে চলমান অ্যাপ্লিকেশনটি ৮০ পোর্টে প্রকাশিত হয়েছে But

দ্রষ্টব্য: আপনাকে বাহ্যিক সত্তাগুলিকে অ্যাপ্লিকেশন অ্যাক্সেস করার জন্য হোস্ট পোর্ট 10005 খুলতে হবে এবং ফায়ারওয়াল বিধিগুলি সংশোধন করতে হবে।

তারা ব্যবহার করতে পারেন

http: // {হোস্ট আইপি 1000: 10005

এটার মতো কিছু

এক্সপোজ এটি ডকারের ধারকটির ভিতরে অ্যাপ্লিকেশনটি চলছে এমন পোর্টটি সংজ্ঞায়িত করতে ব্যবহৃত হয়।

আপনি এটিকে ডকফাইফায়লে সংজ্ঞায়িত করতে পারেন। সাধারণত, ডকফাইফিলের ভিতরে এক্সপোজটি সংজ্ঞায়িত করা ভাল এবং ব্যাপকভাবে ব্যবহৃত অনুশীলন কারণ খুব কমই কেউ এগুলি ডিফল্ট ৮০ বন্দরটির চেয়ে অন্য পোর্টে চালায় rarely


19

বন্দর

portsঅধ্যায় হোস্ট পোর্ট প্রকাশ করব। ডকার হোস্ট নেটওয়ার্ক থেকে ধারকটিতে একটি নির্দিষ্ট পোর্টের জন্য একটি ফরোয়ার্ড সেটআপ করবে। ডিফল্টরূপে এটি একটি ইউজারস্পেস প্রক্সি প্রক্রিয়া ( docker-proxy) দ্বারা প্রয়োগ করা হয় যা প্রথম বন্দর শোনায় এবং ধারকটিতে ফরোয়ার্ড করে, যা দ্বিতীয় পয়েন্টে শুনতে হবে। গন্তব্য বন্দরে যদি কনটেইনারটি না শুনছে, আপনি এখনও হোস্টে কিছু শুনছেন তা দেখতে পাবেন, তবে আপনি যদি সেই হোস্ট পোর্টের সাথে সংযোগ স্থাপনের চেষ্টা করেন, তবে আপনার কনটেইনারটিতে ব্যর্থ হয়ে যান।

দ্রষ্টব্য, ধারকটি অবশ্যই সমস্ত নেটওয়ার্ক ইন্টারফেসে শুনবে কারণ এই প্রক্সিটি ধারকের নেটওয়ার্ক নেমস্পেসের মধ্যে চলছে না এবং ধারকটির ভিতরে 127.0.0.1 এ পৌঁছাতে পারে না। তার জন্য আইপিভি 4 পদ্ধতিটি শুনতে আপনার অ্যাপ্লিকেশনটি কনফিগার করা 0.0.0.0

এছাড়াও লক্ষ করুন যে প্রকাশিত বন্দরগুলি বিপরীত দিকে কাজ করে না। কোনও পোর্ট প্রকাশের মাধ্যমে আপনি ধারক থেকে হোস্টের কোনও পরিষেবায় সংযোগ করতে পারবেন না। পরিবর্তে আপনি ইতিমধ্যে ব্যবহারে থাকা হোস্ট পোর্টটি শোনার চেষ্টা করে ডকার ত্রুটিগুলি খুঁজে পাবেন।

প্রকাশ করা

ফাঁস হ'ল ডকুমেন্টেশন। এটি চিত্রটিতে মেটাডেটা সেট করে, এবং চলার সময়, ধারকটিতেও। সাধারণত আপনি নির্দেশের সাথে ডকফাইলে এটি কনফিগার করেন EXPOSEএবং এটি আপনার চিত্র চালাচ্ছিল ব্যবহারকারীদের ডকুমেন্টেশন হিসাবে কাজ করে, আপনার অ্যাপ্লিকেশনটি কোন পোর্টে ডিফল্টরূপে শুনতে পাবে তা জানতে। কোনও রচনা ফাইলের সাথে কনফিগার করা হলে, এই মেটাডেটা কেবল ধারকটিতে সেট করা থাকে। আপনি যখন docker inspectচিত্র বা ধারকটিতে চালাবেন তখন উন্মুক্ত বন্দরগুলি দেখতে পাবেন ।

এমন কয়েকটি সরঞ্জাম রয়েছে যা এক্সপোজড পোর্টের উপর নির্ভর করে। ডকারে, -Pপতাকাটি সমস্ত উন্মুক্ত পোর্টগুলি হোস্টের সাময়িক বন্দরগুলিতে প্রকাশ করবে। এছাড়াও বিভিন্ন বিপরীত প্রক্সি রয়েছে যা আপনার অ্যাপ্লিকেশনটিতে ট্র্যাফিক প্রেরণ করার সময় এক্সপোজড পোর্ট ব্যবহার করে ডিফল্ট হয়ে যায় যদি আপনি স্পষ্টভাবে ধারক বন্দরটি সেট না করেন।

বাহ্যিক সরঞ্জামগুলি ব্যতীত কনটেইনারগুলির মধ্যে থাকা নেটওয়ার্কিংয়ে এক্সপোজের কোনও প্রভাব নেই। আপনার কেবল একটি সাধারণ ডকার নেটওয়ার্ক দরকার এবং একটি ধারক অন্য থেকে ধারক অ্যাক্সেস করার জন্য ধারক পোর্টের সাথে সংযোগ স্থাপন করতে হবে। যদি সেই নেটওয়ার্কটি ব্যবহারকারী হিসাবে তৈরি করা হয় (যেমন নাম হিসাবে চিহ্নিত ডিফল্ট ব্রিজ নেটওয়ার্ক নয় bridge), আপনি অন্যান্য পাত্রে সংযোগ করতে ডিএনএস ব্যবহার করতে পারেন can


3

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

একটি ওয়েব ফ্রন্ট-এন্ড এবং একটি ডাটাবেস ব্যাক-এন্ড সহ একটি অ্যাপ্লিকেশনটি কল্পনা করুন। বাইরের বিশ্বের ওয়েব ফ্রন্ট-এন্ডে প্রবেশের প্রয়োজন (সম্ভবত পোর্ট ৮০ এ) তবে কেবল ব্যাক-এন্ডে নিজেই ডাটাবেস হোস্ট এবং পোর্ট অ্যাক্সেসের প্রয়োজন। একটি ব্যবহারকারী-সংজ্ঞায়িত সেতু ব্যবহার করে, কেবল ওয়েব পোর্টটি খোলার প্রয়োজন, এবং ডাটাবেস অ্যাপ্লিকেশনটির কোনও পোর্ট খোলার প্রয়োজন নেই, যেহেতু ওয়েব ফ্রন্ট-এ্যান্ডটি ব্যবহারকারী-সংজ্ঞায়িত সেতুর উপরে পৌঁছতে পারে।

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

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