मुझे यकीन नहीं है कि अगर मैंने यहां कुछ गलत समझा है, लेकिन ऐसा लगता है कि एक छवि से एक नया कंटेनर बनाकर केवल पोर्ट मैपिंग सेट करना संभव है। क्या मौजूदा डॉकर कंटेनर में पोर्ट मैपिंग असाइन करने का कोई तरीका है?
मुझे यकीन नहीं है कि अगर मैंने यहां कुछ गलत समझा है, लेकिन ऐसा लगता है कि एक छवि से एक नया कंटेनर बनाकर केवल पोर्ट मैपिंग सेट करना संभव है। क्या मौजूदा डॉकर कंटेनर में पोर्ट मैपिंग असाइन करने का कोई तरीका है?
जवाबों:
आप hostconfig.json
फ़ाइल को
सीधे संपादित करके पोर्ट मैपिंग को बदल सकते हैं/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json
आप docker inspect <container_name>
कमांड के माध्यम से [hash_of_the_container] निर्धारित कर सकते हैं और "Id" फ़ील्ड का मान हैश है।
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
अपने docker इंजन को पुनरारंभ करता था जो Ubuntu 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
केवल वर्तमान अग्रेषण प्रदर्शित करता है।
पोर्ट फ़ॉरवर्डिंग जोड़ने के लिए, मैं हमेशा इन चरणों का पालन करता हूं,
कंटेनर चलाना बंद करें
docker stop test01
प्रतिबद्ध कंटेनर
docker commit test01 test02
नोट: उपरोक्त, test02
एक नई छवि है जो मैं test01
कंटेनर से बना रहा हूं ।
फिर से शुरू की गई छवि से चलाएँ
docker run -p 8080:8080 -td test02
जहाँ पहला 8080 लोकल पोर्ट है और दूसरा 8080 कंटेनर पोर्ट है।
docker start
?
यदि "मौजूदा" से आपका मतलब "रनिंग" है, तो पोर्ट मैपिंग जोड़ना संभव नहीं है (वर्तमान में)।
हालाँकि, आप गतिशील रूप से उदाहरण के लिए एक नया नेटवर्क इंटरफ़ेस जोड़ सकते हैं, जैसे कि Pipework , यदि आपको बिना रुके / पुनः आरंभ किए किसी रनिंग कंटेनर में किसी सेवा को उजागर करना है।
यदि आप पोर्ट मैपिंग को एक कंटेनर में लागू कर सकते हैं तो निश्चित नहीं है। आप एक कंटेनर चलाते समय पोर्ट अग्रेषण लागू कर सकते हैं जो एक नया कंटेनर बनाने से अलग है।
$ docker run -p <public_port>:<private_port> -d <image>
कंटेनर चलाना शुरू कर देंगे। यह ट्यूटोरियल पोर्ट पुनर्निर्देशन की व्याख्या करता है।
docker run
एक नया कंटेनर बनाता है और शुरू करता है। इसके docker create
बाद करने के बराबर है docker start
।
Hostconfig.json का संपादन अब काम नहीं कर रहा है। यह केवल उस पोर्ट के उजागर होने के साथ समाप्त होता है लेकिन होस्ट करने के लिए प्रकाशित नहीं किया जाता है। कंटेनरों को समेटना और उनका मनोरंजन करना मेरे लिए सबसे अच्छा तरीका नहीं है। किसी ने उल्लेख नहीं किया 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
वैकल्पिक रूप से nginx में default.conf को हटा दें
docker exec nginx rm /etc/nginx/conf.d/default.conf
एक नया nginx config बनाएँ
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;
}
}
Nginx कंटेनर के लिए कॉन्फ़िगरेशन की प्रतिलिपि बनाएँ।
docker cp ./my_conf.conf nginx:/etc/nginx/conf.d/my_conf.conf
नग्नेक्स को फिर से शुरू करें
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 जैसे एक उपयोगी उपकरण का उपयोग करते हैं।
मैं ubuntu मेजबान और ubuntu आधारित docker छवि का उपयोग कर रहा था।
जब एक नए पोर्ट को मैप करने की आवश्यकता होती है,
कर्ता के अंदर निम्नलिखित कमांड चलाते हैं
ssh -R8888:localhost:8888 <username>@172.17.0.1
172.17.0.1 docker इंटरफ़ेस का आईपी था (आप इसे ifconfig docker0 | grep "inet addr" | cut -f2 -d":" | cut -f1 -d" "
होस्ट पर चलाकर प्राप्त कर सकते हैं
)।
यहाँ मैंने स्थानीय 8888 पोर्ट को होस्ट 8888 पर वापस मैप किया था। आप पोर्ट को आवश्यकतानुसार बदल सकते हैं।
यदि आपको एक और पोर्ट की आवश्यकता है, तो आप ssh को मार सकते हैं और नए पोर्ट के साथ इसमें -R की एक और लाइन जोड़ सकते हैं।
मैंने इसका परीक्षण नेटकैट से किया है।
विंडोज और मैक उपयोगकर्ताओं के लिए, मैपिंग पोर्ट को बदलने का एक और आसान और अनुकूल तरीका है:
डाउनलोड
कंटेनर के सेटिंग पृष्ठ पर जाएं, पोर्ट टैब पर, आप सीधे प्रकाशित पोर्ट को संशोधित कर सकते हैं।
कंटेनर फिर से शुरू करें
संक्षिप्त उत्तर: आप मौजूदा डॉकर कंटेनर में पोर्ट मैपिंग असाइन नहीं कर सकते
आपको एक नया कंटेनर चाहिए ... इससे निपटें।
यदि आप बस चल रहे कंटेनर के पोर्ट को बदलना चाहते हैं, तो आप निम्न कार्य करते हैं:
sudo docker ने NAME को रोक दिया
sudo docker रन -d -p 81:80 NAME
जहाँ तक:
"-d" बैकग्राउंड / डॉक करने वाले को
"-p" पोर्ट मैपिंग सक्षम करें
"81" बाहरी (उजागर) पोर्ट जिसका उपयोग आप अपने ब्राउज़र के साथ उपयोग करने के लिए करते हैं
"80" आंतरिक डॉकटर कंटेनर सुनो बंदरगाह
docker run
आदेश, NAME
में जबकि, से एक कंटेनर को चलाने के लिए छवि का नाम है बंद करने के लिए कंटेनर के नाम का उल्लेख है। docker stop
NAME