আমি এখানে কিছু ভুল বুঝেছি কিনা তা নিশ্চিত নই, তবে মনে হচ্ছে কোনও চিত্র থেকে নতুন ধারক তৈরি করে পোর্ট ম্যাপিং সেট করা সম্ভব possible বিদ্যমান ডকার পাত্রে কোনও পোর্ট ম্যাপিং নির্ধারণের কোনও উপায় আছে কি?
আমি এখানে কিছু ভুল বুঝেছি কিনা তা নিশ্চিত নই, তবে মনে হচ্ছে কোনও চিত্র থেকে নতুন ধারক তৈরি করে পোর্ট ম্যাপিং সেট করা সম্ভব possible বিদ্যমান ডকার পাত্রে কোনও পোর্ট ম্যাপিং নির্ধারণের কোনও উপায় আছে কি?
উত্তর:
আপনি সরাসরি hostconfig.jsonফাইল
এডিট করে পোর্ট ম্যাপিং পরিবর্তন করতে পারেন/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
আপনি docker inspect <container_name>কমান্ডের মাধ্যমে [hash_of_the_container] নির্ধারণ করতে পারেন এবং "আইডি" ক্ষেত্রের মান হ্যাশ।
1) stop the container
2) stop docker service (per Tacsiazuma's comment)
3) change the file
4) restart your docker engine (to flush/clear config caches)
5) start the container
সুতরাং আপনার এই পদ্ধতির সাথে কোনও চিত্র তৈরি করার দরকার নেই। আপনি এখানে পুনরায় আরম্ভের পতাকাটিও পরিবর্তন করতে পারেন।
PS আপনি কীভাবে আপনার হোস্ট মেশিন অনুসারে সঠিকভাবে আপনার ডকার ইঞ্জিনটি পুনরায় চালু করতে পারবেন তা জানতে https://docs.docker.com/engine/admin/ দেখতে পারেন। আমি sudo systemctl restart dockerআমার ডকার ইঞ্জিনটি পুনরায় চালু করতাম যা উবুন্টু 16.04 এ চলছে
hostconfig.jsonএবং config.v2.jsonএই কাজ করতে। বিশদটি দেখতে @rohitmohta দ্বারা সরবরাহিত লিঙ্কটি ব্যবহার করুন।
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/ttyএকবার টিটিটি চালানোর পরে আপনি পারেন / var / lib /
আমিও এই সমস্যায় আগ্রহী।
@ থসমো যেমন উল্লেখ করেছেন, পোর্ট ফরওয়ার্ডিং কেবল docker run(এবং docker create) কমান্ডের সাহায্যে নির্দিষ্ট করা যেতে পারে ।
অন্যান্য আদেশ, docker startনেই -pবিকল্প এবং docker portশুধুমাত্র বর্তমান forwardings প্রদর্শন করা হয়।
পোর্ট ফরওয়ার্ডিং যুক্ত করতে আমি সর্বদা এই পদক্ষেপগুলি অনুসরণ করি,
ধারক চলমান বন্ধ করুন
docker stop test01
কমিট ধারক
docker commit test01 test02
দ্রষ্টব্য: উপরেরটি, test02একটি নতুন চিত্র যা আমি test01ধারক থেকে তৈরি করছি ।
পুনরায় রান commited ইমেজ থেকে
docker run -p 8080:8080 -td test02
যেখানে প্রথম 8080 স্থানীয় বন্দর এবং দ্বিতীয় 8080 কনটেইনার বন্দর।
docker start?
যদি "বিদ্যমান" দ্বারা আপনি "চালনা" বোঝায় তবে পোর্ট ম্যাপিং যুক্ত করা (বর্তমানে) সম্ভব নয়।
তবে, আপনি गतिशीलভাবে উদাহরণস্বরূপ পাইপওয়ার্ক সহ একটি নতুন নেটওয়ার্ক ইন্টারফেস যুক্ত করতে পারেন, যদি আপনার কোনও চালনা পাত্রে কোনও পরিষেবা বন্ধ না করা / পুনরায় চালু না করেই প্রকাশের প্রয়োজন হয়।
আপনি কোনও চলমান ধারক পোর্ট ম্যাপিং প্রয়োগ করতে পারবেন কিনা তা নিশ্চিত নয়। কোনও ধারক চালানোর সময় আপনি পোর্ট ফরওয়ার্ডিং প্রয়োগ করতে পারেন যা একটি নতুন ধারক তৈরির চেয়ে আলাদা।
$ docker run -p <public_port>:<private_port> -d <image>
পাত্রে চলমান শুরু করবে। এই টিউটোরিয়ালটি পোর্ট পুনঃনির্দেশের ব্যাখ্যা করে।
docker runএকটি নতুন ধারক তৈরি করে এবং শুরু করে। এটি docker createঅনুসরণ করার সমতুল্য docker start।
হোস্টকনফিগ.জসন সম্পাদনা করা এখন মনে হচ্ছে কাজ করছে না। এটি কেবল সেই বন্দরটিকে উন্মুক্ত করার সাথে সাথে হোস্টে প্রকাশিত হয় না। ধারক করা এবং পুনরুদ্ধার করা আমার কাছে সেরা পন্থা নয়। কারও উল্লেখ নেই docker network?
সেরা সমাধানটি একই নেটওয়ার্কের মধ্যে বিপরীত প্রক্সি ব্যবহার করা হবে
আপনার পূর্ববর্তী ধারকটি কোনও নামযুক্ত না থাকলে একটি নতুন নেটওয়ার্ক তৈরি করুন।
docker network create my_network
তৈরি নেটওয়ার্কে আপনার বিদ্যমান ধারকটিতে যোগদান করুন
docker network connect my_network my_existing_container
আপনার প্রয়োজন বন্দরগুলি একই নেটওয়ার্কে যোগ দিয়ে একটি বিপরীত প্রক্সি পরিষেবা (উদাঃ এনজিনেক্স) শুরু করুন
docker run -d --name nginx --network my_network -p 9000:9000 nginx
Ginচ্ছিকভাবে nginx এ default.conf অপসারণ করুন
docker exec nginx rm /etc/nginx/conf.d/default.conf
একটি নতুন এনগিনেক্স কনফিগারেশন তৈরি করুন
server
{
listen 9000;
location / {
proxy_pass http://my_existing_container:9000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
কনফিগারটি এনজিঙ্ক্স ধারকটিতে অনুলিপি করুন।
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
Nginx পুনরায় চালু করুন
docker restart nginx
সুবিধাগুলি : নতুন বন্দরগুলি প্রকাশ করার জন্য, আপনি ব্যবসায়ের ধারক স্পর্শ না করেই নিরাপদে এনগিনেক্স ধারকটিকে থামাতে / আপডেট করতে / পুনরায় তৈরি করতে পারবেন। এনজিঙ্ক্সের জন্য আপনার যদি শূন্য সময় প্রয়োজন হয় তবে একই নেটওয়ার্কে আরও বিপরীত প্রক্সি পরিষেবাদি যুক্ত করা সম্ভব। এছাড়াও, একটি ধারক একাধিক নেটওয়ার্কে যোগ দিতে পারে।
সম্পাদনা:
প্রক্সি অ-HTTP পরিষেবাগুলিকে বিপরীত করতে, কনফিগার ফাইলটি কিছুটা আলাদা। এখানে একটি সহজ উদাহরণ:
upstream my_service {
server my_existing_container:9000;
}
server {
listen 9000;
proxy_pass my_service;
}
ফুজিমোটোতে ইউইচির উদাহরণটি test01একটি ধারক, যেখানে test02একটি চিত্র।
করার আগে docker runআপনি মূল ধারকটি সরিয়ে ফেলতে পারেন এবং তারপরে আবার একই নাম ধারকটি বরাদ্দ করুন:
$ docker stop container01
$ docker commit container01 image01
$ docker rm container01
$ docker run -d -P --name container01 image01
( -Pম্যানুয়ালি নির্ধারণের পরিবর্তে এলোমেলো বন্দরগুলিতে পোর্টগুলি প্রকাশের জন্য ব্যবহার করা)।
আপনি যদি docker run <NAME>এটি চালনা করেন তবে এটি একটি নতুন চিত্র উত্সাহিত করবে, যা সম্ভবত আপনি চান তা নয়।
আপনি যদি কোনও বর্তমান চিত্র পরিবর্তন করতে চান তবে নিম্নলিখিতগুলি করুন:
docker ps -a
আপনার টার্গেট ধারকটির আইডি নিন এবং এতে যান:
cd /var/lib/docker/containers/<conainerID><and then some:)>
ধারক থামান:
docker stop <NAME>
ফাইলগুলি পরিবর্তন করুন
vi config.v2.json
"Config": {
....
"ExposedPorts": {
"80/tcp": {},
"8888/tcp": {}
},
....
},
"NetworkSettings": {
....
"Ports": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
এবং ফাইল পরিবর্তন করুন
vi hostconfig.json
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "80"
}
],
"8888/tcp": [
{
"HostIp": "",
"HostPort": "8888"
}
]
}
আপনার ডকার পুনরায় চালু করুন এবং এটি কাজ করা উচিত।
আপনার চারপাশে অন্য উপায় যদি আপনি ডকার গভীরতার কনফিগারেশনের সাথে স্বাচ্ছন্দ্য বোধ করেন না তবে আইপট্যাবগুলি আপনার বন্ধু হবে।
iptables -t nat -A DOCKER -p tcp --dport ${YOURPORT} -j DNAT --to-destination ${CONTAINERIP}:${YOURPORT}
iptables -t nat -A POSTROUTING -j MASQUERADE -p tcp --source ${CONTAINERIP} --destination ${CONTAINERIP} --dport ${YOURPORT}
iptables -A DOCKER -j ACCEPT -p tcp --destination ${CONTAINERIP} --dport ${YOURPORT}
এটি কেবল একটি কৌশল যা আমার দৃশ্যের সাথে এটি কাজ করার প্রস্তাবিত উপায় নয় কারণ আমি ধারক বন্ধ করতে পারিনি আশা করি আশা করি আপনাকেও সহায়তা করবে।
DOCKER_PORTকরতে চাই তবে MACHINE_PORTকোন অংশগুলি পরিবর্তন করা উচিত?
এটি সহজেই সম্পন্ন করতে আমরা ssh এর মতো সহজ সরঞ্জাম ব্যবহার করি।
আমি উবুন্টু হোস্ট এবং উবুন্টু ভিত্তিক ডকার চিত্র ব্যবহার করছিলাম।
যখন একটি নতুন বন্দরটি ম্যাপ করা দরকার,
ডকারের ভিতরে নিম্নলিখিত কমান্ডটি চালান
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 ডকার ইন্টারফেসের আইপি ছিল (আপনি ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "হোস্টে চালিয়ে এটি পেতে পারেন
)।
এখানে আমি স্থানীয় 8888 বন্দরটি 8888 হোস্টগুলিতে ফিরে ম্যাপ করেছিলাম needed আপনি বন্দরটি প্রয়োজন মতো পরিবর্তন করতে পারেন।
আপনার যদি আরও একটি বন্দর দরকার হয় তবে আপনি এসএসএসটি মেরে নতুন বন্দরটির সাথে আরও একটি লাইন -R যুক্ত করতে পারেন।
আমি নেটকাট দিয়ে এটি পরীক্ষা করেছি।
উইন্ডোজ এবং ম্যাক ব্যবহারকারীদের জন্য ম্যাপিং পোর্টটি পরিবর্তন করার আরও একটি সহজ এবং বন্ধুত্বপূর্ণ উপায় রয়েছে:
কাইটমেটিক ডাউনলোড করুন
পোর্ট ট্যাবটিতে ধারকটির সেটিংস পৃষ্ঠায় যান, আপনি সরাসরি সেখানে প্রকাশিত পোর্টটি সংশোধন করতে পারেন।
আবার ধারক শুরু করুন
সংক্ষিপ্ত উত্তর: আপনি কোনও বিদ্যমান ডকার পাত্রে পোর্ট ম্যাপিং নির্ধারণ করতে পারবেন না
আপনার একটি নতুন ধারক প্রয়োজন ... এটি মোকাবেলা করুন।
আপনি যদি চলমান ধারকটির বন্দরটি পরিবর্তন করতে চান তবে আপনি এটি করুন:
sudo ডকার স্টপ NAME
sudo ডকার চালিত -d -p 81:80 নাম
যেখানে হিসাবে:
"-d" ব্যাকগ্রাউন্ডে / ডকারকে ডিমন করুন
"-p" পোর্ট ম্যাপিং সক্ষম করুন
"81" বাহ্যিক (উন্মুক্ত) পোর্ট আপনি আপনার ব্রাউজারের সাথে অ্যাক্সেস করতে ব্যবহার করেন
"80" অভ্যন্তরীণ ডকার পাত্রে শোনার পোর্ট
docker runকমান্ড NAMEযেহেতু থেকে একটি ধারক চালানোর জন্য ইমেজ নাম স্টপ ধারক নাম উল্লেখ করে। docker stopNAME