উত্তর:
মতে 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
docker-compose run
করেন docker-compose.yml
তবে ডিফল্টরূপে বন্দর সংজ্ঞা উপেক্ষা করা হবে। হয় docker-compose up
প্যারামিটারটি ব্যবহার করুন বা সরবরাহ করুন--service-ports
বন্দরসমূহ :
প্রকাশ করা :
পোর্টগুলি এই বিভাগটি হোস্ট সার্ভার এবং ডকারের ধারক মধ্যে ম্যাপিং সংজ্ঞায়িত করতে ব্যবহৃত হয়।
ports:
- 10005:80
এর অর্থ কনটেইনারটির অভ্যন্তরে চলমান অ্যাপ্লিকেশনটি ৮০ পোর্টে প্রকাশিত হয়েছে But
দ্রষ্টব্য: আপনাকে বাহ্যিক সত্তাগুলিকে অ্যাপ্লিকেশন অ্যাক্সেস করার জন্য হোস্ট পোর্ট 10005 খুলতে হবে এবং ফায়ারওয়াল বিধিগুলি সংশোধন করতে হবে।
তারা ব্যবহার করতে পারেন
http: // {হোস্ট আইপি 1000: 10005
এটার মতো কিছু
এক্সপোজ এটি ডকারের ধারকটির ভিতরে অ্যাপ্লিকেশনটি চলছে এমন পোর্টটি সংজ্ঞায়িত করতে ব্যবহৃত হয়।
আপনি এটিকে ডকফাইফায়লে সংজ্ঞায়িত করতে পারেন। সাধারণত, ডকফাইফিলের ভিতরে এক্সপোজটি সংজ্ঞায়িত করা ভাল এবং ব্যাপকভাবে ব্যবহৃত অনুশীলন কারণ খুব কমই কেউ এগুলি ডিফল্ট ৮০ বন্দরটির চেয়ে অন্য পোর্টে চালায় rarely
ports
অধ্যায় হোস্ট পোর্ট প্রকাশ করব। ডকার হোস্ট নেটওয়ার্ক থেকে ধারকটিতে একটি নির্দিষ্ট পোর্টের জন্য একটি ফরোয়ার্ড সেটআপ করবে। ডিফল্টরূপে এটি একটি ইউজারস্পেস প্রক্সি প্রক্রিয়া ( docker-proxy
) দ্বারা প্রয়োগ করা হয় যা প্রথম বন্দর শোনায় এবং ধারকটিতে ফরোয়ার্ড করে, যা দ্বিতীয় পয়েন্টে শুনতে হবে। গন্তব্য বন্দরে যদি কনটেইনারটি না শুনছে, আপনি এখনও হোস্টে কিছু শুনছেন তা দেখতে পাবেন, তবে আপনি যদি সেই হোস্ট পোর্টের সাথে সংযোগ স্থাপনের চেষ্টা করেন, তবে আপনার কনটেইনারটিতে ব্যর্থ হয়ে যান।
দ্রষ্টব্য, ধারকটি অবশ্যই সমস্ত নেটওয়ার্ক ইন্টারফেসে শুনবে কারণ এই প্রক্সিটি ধারকের নেটওয়ার্ক নেমস্পেসের মধ্যে চলছে না এবং ধারকটির ভিতরে 127.0.0.1 এ পৌঁছাতে পারে না। তার জন্য আইপিভি 4 পদ্ধতিটি শুনতে আপনার অ্যাপ্লিকেশনটি কনফিগার করা 0.0.0.0
।
এছাড়াও লক্ষ করুন যে প্রকাশিত বন্দরগুলি বিপরীত দিকে কাজ করে না। কোনও পোর্ট প্রকাশের মাধ্যমে আপনি ধারক থেকে হোস্টের কোনও পরিষেবায় সংযোগ করতে পারবেন না। পরিবর্তে আপনি ইতিমধ্যে ব্যবহারে থাকা হোস্ট পোর্টটি শোনার চেষ্টা করে ডকার ত্রুটিগুলি খুঁজে পাবেন।
ফাঁস হ'ল ডকুমেন্টেশন। এটি চিত্রটিতে মেটাডেটা সেট করে, এবং চলার সময়, ধারকটিতেও। সাধারণত আপনি নির্দেশের সাথে ডকফাইলে এটি কনফিগার করেন EXPOSE
এবং এটি আপনার চিত্র চালাচ্ছিল ব্যবহারকারীদের ডকুমেন্টেশন হিসাবে কাজ করে, আপনার অ্যাপ্লিকেশনটি কোন পোর্টে ডিফল্টরূপে শুনতে পাবে তা জানতে। কোনও রচনা ফাইলের সাথে কনফিগার করা হলে, এই মেটাডেটা কেবল ধারকটিতে সেট করা থাকে। আপনি যখন docker inspect
চিত্র বা ধারকটিতে চালাবেন তখন উন্মুক্ত বন্দরগুলি দেখতে পাবেন ।
এমন কয়েকটি সরঞ্জাম রয়েছে যা এক্সপোজড পোর্টের উপর নির্ভর করে। ডকারে, -P
পতাকাটি সমস্ত উন্মুক্ত পোর্টগুলি হোস্টের সাময়িক বন্দরগুলিতে প্রকাশ করবে। এছাড়াও বিভিন্ন বিপরীত প্রক্সি রয়েছে যা আপনার অ্যাপ্লিকেশনটিতে ট্র্যাফিক প্রেরণ করার সময় এক্সপোজড পোর্ট ব্যবহার করে ডিফল্ট হয়ে যায় যদি আপনি স্পষ্টভাবে ধারক বন্দরটি সেট না করেন।
বাহ্যিক সরঞ্জামগুলি ব্যতীত কনটেইনারগুলির মধ্যে থাকা নেটওয়ার্কিংয়ে এক্সপোজের কোনও প্রভাব নেই। আপনার কেবল একটি সাধারণ ডকার নেটওয়ার্ক দরকার এবং একটি ধারক অন্য থেকে ধারক অ্যাক্সেস করার জন্য ধারক পোর্টের সাথে সংযোগ স্থাপন করতে হবে। যদি সেই নেটওয়ার্কটি ব্যবহারকারী হিসাবে তৈরি করা হয় (যেমন নাম হিসাবে চিহ্নিত ডিফল্ট ব্রিজ নেটওয়ার্ক নয় bridge
), আপনি অন্যান্য পাত্রে সংযোগ করতে ডিএনএস ব্যবহার করতে পারেন can
আমি সম্পূর্ণরূপে উত্তর আগে একমত। আমি কেবল উল্লেখ করতে চাই যে এক্সপোজ এবং পোর্টগুলির মধ্যে পার্থক্যটি ডকারে সুরক্ষা ধারণার অংশ। এটি ডকারের নেটওয়ার্কিংয়ের সাথে একসাথে চলে । উদাহরণ স্বরূপ:
একটি ওয়েব ফ্রন্ট-এন্ড এবং একটি ডাটাবেস ব্যাক-এন্ড সহ একটি অ্যাপ্লিকেশনটি কল্পনা করুন। বাইরের বিশ্বের ওয়েব ফ্রন্ট-এন্ডে প্রবেশের প্রয়োজন (সম্ভবত পোর্ট ৮০ এ) তবে কেবল ব্যাক-এন্ডে নিজেই ডাটাবেস হোস্ট এবং পোর্ট অ্যাক্সেসের প্রয়োজন। একটি ব্যবহারকারী-সংজ্ঞায়িত সেতু ব্যবহার করে, কেবল ওয়েব পোর্টটি খোলার প্রয়োজন, এবং ডাটাবেস অ্যাপ্লিকেশনটির কোনও পোর্ট খোলার প্রয়োজন নেই, যেহেতু ওয়েব ফ্রন্ট-এ্যান্ডটি ব্যবহারকারী-সংজ্ঞায়িত সেতুর উপরে পৌঁছতে পারে।
ডকারে একটি নেটওয়ার্ক আর্কিটেকচার স্থাপন করার সময় এটি সাধারণ ব্যবহারের ক্ষেত্রে। সুতরাং উদাহরণস্বরূপ একটি ডিফল্ট ব্রিজ নেটওয়ার্কে, পোর্টগুলি বাইরের বিশ্ব থেকে অ্যাক্সেসযোগ্য নয়। এর জন্য আপনি "বন্দরগুলি" দিয়ে একটি ইনগ্রিংপয়েন্ট খুলতে পারেন। "এক্সপোজ" ব্যবহার করে আপনি নেটওয়ার্কের মধ্যে যোগাযোগকে সংজ্ঞায়িত করেন। আপনি যদি ডিফল্ট পোর্টগুলি প্রকাশ করতে চান তবে আপনাকে আপনার ডকার-রচনা ফাইলটিতে "এক্সপোজ" সংজ্ঞা দেওয়ার দরকার নেই।
expose
একটিdocker-compose
? আমি যতদূর বলতে পারি, লিঙ্কযুক্ত পরিষেবাগুলিতে পোর্টগুলি অ্যাক্সেসযোগ্য করার জন্য আপনাকে এক্সপোজ নির্দিষ্ট করার দরকার নেই।