Docker Error बाइंड: उपयोग में पहले से पता


102

जब मैं docker-compose upअपने डॉकर प्रोजेक्ट में चलता हूं तो यह निम्न संदेश के साथ विफल हो जाता है:

Error starting userland proxy: listen tcp 0.0.0.0:3000: bind: address already in use

netstat -pna | grep 3000 यह दिखाता है:

tcp        0      0 0.0.0.0:3000            0.0.0.0:*               LISTEN      -  

मैंने पहले ही कोशिश की है docker-compose down, लेकिन यह मदद नहीं करता है।


7
sudo netstat -pna | grep 3000उस प्रक्रिया को प्राप्त करने के लिए एक चलाएं जो सुन रही है।
BMitch

2
आपका आउटपुट दिखाता है कि कुछ अन्य प्रक्रिया पोर्ट 3000 पर पहले से ही सुन रही है। क्या आप कुछ अन्य पोर्ट का उपयोग कर सकते हैं? sudoप्रक्रिया का नाम देखने की कोशिश करें।
टेकतबाबू

हां, इस बंदरगाह पर एनटीपी था। Thanx! मुझे नहीं पता था कि sudoआउटपुट बदल सकता है :)
नागर

मेरे लिए यह पोर्ट 8888 है जो डॉकटर प्रॉक्सी है
नील मैकगिगन

मैंने इस उत्तर में यही मुद्दा तय किया: stackoverflow.com/a/58772307/3530707
jmojico

जवाबों:


100

आपके मामले में यह कुछ अन्य प्रक्रिया थी जो पोर्ट का उपयोग कर रही थी और जैसा कि टिप्पणियों में बताया गया है, sudo netstat -pna | grep 3000आपको समस्या को हल करने में मदद की।

जबकि अन्य मामलों में (मैं खुद कई बार इसका सामना कर चुका हूं) यह ज्यादातर वही कंटेनर है जो किसी अन्य उदाहरण पर चल रहा है। उस मामले docker psमें बहुत मदद मिलती थी क्योंकि अक्सर मैं वही कंटेनर अन्य निर्देशिकाओं में चला जाता था और फिर दूसरी जगहों पर फिर से चलाने की कोशिश करता था, जहाँ उन्हीं कंटेनर नामों का इस्तेमाल किया जाता था।

docker psमेरी मदद कैसे की: docker rm -f $(docker ps -aq) एक छोटा कमांड है जिसका उपयोग मैं सभी कंटेनरों को निकालने के लिए करता हूं।

संपादित करें:docker ps मुझे कैसे मदद मिली।


3
दरअसल, मुझे अक्सर यह समस्या होती है। और कुछ भी नहीं, लेकिन docker-compose downमदद करता है
नागर

यह सुनिश्चित करने में मदद करता है कि जिस शर्त पर आप इसे चला रहे हैं उसी निर्देशिका में जहां आप भागे हैं docker-compose up। जबकि मैं अपने जवाब में कंटेनर को खोजने की सलाह देता हूं जो पहले से चल रहा है और वांछित कार्रवाई करता है। मैंने उन्हें हटाना उचित समझा, यदि कोई हटाना नहीं चाहता है, तो उन्हें रोकने के लिए उपयोग के बजाय rmइसका उपयोग stopकरना है।
आयुषी

1
मेरे पास एक और सर्वर है जो उसी पोर्ट पर चल रहा है जिससे tensorflow/tensorflowइमेज चलेगी। मैं अपनी छवि को दूसरे पोर्ट में चलाने के लिए कैसे सेटअप कर सकता हूं। मैंने यह कोशिश की है: docker run -it -d -p 8888:8000 tensorflow/tensorflow मैंने क्लाइंट पर अपनी छवि से 8000 तक पोर्ट 8888 को बाइंड किया, लेकिन काम नहीं करता।
इमानुएल फोंटेल्स 20

1
@EmanuelFontelles डीबग करने का प्रयास करते समय, -dविकल्प का उपयोग न करें । अब, बंदरगाहों के रूप में उजागर कर रहे हैं HOST:CONTAINER। इस प्रकार आपको चलाना चाहिएdocker run -it -p 8000:8888
आयुषी

67

इससे मुझे मदद मिली:

docker-compose down  # Stop container on current dir if there is a docker-compose.yml
docker rm -fv $(docker ps -aq)  # Remove all containers
sudo lsof -i -P -n | grep <port number>  # List who's using the port

और फिर: kill -9 <process id>(macOS) या sudo kill <process id>(लिनक्स)।

स्रोत: उपयोगकर्ता Rub21 द्वारा टिप्पणी


3
docker rm -fv $(docker ps -aq)इस लाइन मैं सभी की जरूरत थी। धन्यवाद
रयान वॉकर

lsof ने एक आकर्षण का काम किया, इस प्रक्रिया को और कार्रवाई में वापस मार दिया ....
श्री ई।

13

मुझे एक ही समस्या थी, docker-compose down --rmi all(उसी निर्देशिका में जहां आप डॉक-कंपोज़ चलाते हैं) मदद करता है

UPD: चेतावनी - यह आपके द्वारा खींची गई स्थानीय docker छवियों को भी हटा देगा ( टिप्पणी से )


3
हां, यह हमेशा मदद करता है, लेकिन downआखिरी चीज है जो आप आमतौर पर करना चाहते हैं। वर्तमान स्थिति को खोना चीनी का एक टुकड़ा नहीं है।
नागरलाल

3
यह आपके द्वारा खींची गई स्थानीय डॉकटर छवियों को भी हटा देगा, सावधानी के साथ इसका उपयोग करें
मीका सीमन्स

आपको यह उल्लेख करना चाहिए कि यह उत्तर में स्थानीय डॉकटर छवियों को हटा देगा।
अहमद नूर जमाल अल-दीन

8

लिनक्स / यूनिक्स के लिए:

निम्नलिखित कमांड का उपयोग करके लिनक्स उपयोगिता के लिए सरल खोज

netstat -nlp | grep 8888

यह इस पोर्ट पर चल रही प्रक्रिया को दिखाएगा, फिर उस प्रक्रिया के पीआईडी ​​(पंक्ति में पीआईडी ​​के लिए देखो) का उपयोग करके उस प्रक्रिया को मार दें।

kill PID

netstat PID / program (जैसे 2714 / splunkd) दिखाता है। sudo 2714 कार्यों को मारता है। धन्यवाद।
रॉय


5

कुछ मामलों में कंटेनर को रोकने या किसी प्रक्रिया को मारने से पहले समस्या के लिए अधिक गहराई से डीबगिंग करना महत्वपूर्ण है।

नीचे दी गई चेकलिस्ट पर विचार करें:

1) आप वर्तमान डोकर लिखें वातावरण की जाँच करें
भागो docker-compose ps
यदि पोर्ट एक और कंटेनर द्वारा उपयोग में है, के साथ इसे रोकने docker-compose stop <service-name-in-compose-file>या बदल कर इसे हटाने के stopसाथ rm

2) अपने वर्तमान कार्यक्षेत्र के बाहर चलने वाले कंटेनरों की जांच करें अपने होस्ट के तहत चलने वाले सभी कंटेनरों की सूची देखने के लिए
चलाएँ docker ps
यदि आप पाते हैं कि पोर्ट किसी अन्य कंटेनर द्वारा उपयोग में है, तो आप इसे रोक सकते हैं docker stop <container-id>
(*) क्योंकि आप मूल composeवातावरण के दायरे में नहीं हैं - यह एक अच्छा अभ्यास है कि आप जिस कंटेनर को रोकने जा रहे हैं उसके बारे में अधिक जानकारी इकट्ठा करने के लिए डॉक निरीक्षण का उपयोग करें ।

3) जांचें कि क्या पोर्ट का उपयोग होस्ट पर चल रही अन्य प्रक्रियाओं द्वारा किया जाता है
उदाहरण के लिए यदि पोर्ट 6379 रन है:

$ sudo netstat -ltnp | grep ':6379'
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      915/redis-server 12 
tcp6       0      0 ::1:6379                :::*                    LISTEN      915/redis-server 12

(*) आप lsof कमांड का भी उपयोग कर सकते हैं जो मुख्य रूप से विभिन्न प्रक्रियाओं द्वारा खोली गई फ़ाइलों के बारे में जानकारी प्राप्त करने के लिए उपयोग किया जाता है (मैं सुझाव देता हूं कि netstatइससे पहले चल रहा है)।

तो, आउटपुट के मामले में ऊपर PIDहै 915। अब आप चला सकते हैं:

$ ps j 915
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1   915   915   915 ?           -1 Ssl    123   0:11 /usr/bin/redis-server 127.0.0.1:6379

और मूल प्रक्रिया की आईडी ( PPID) और निष्पादन कमांड देखें।
आप यह भी चला सकते हैं: $ pstree -s <PID>प्रक्रिया और इसके संबंधित प्रक्रियाओं के एक दृश्य प्रदर्शन के लिए।

हमारे मामले में हम देख सकते हैं कि प्रक्रिया संभवतः एक डेमॉन है (PPID 1 है) - उस मामले में चल रहा है पर विचार करें:
ए) $ cat /proc/<PID>/statusप्रक्रिया के बारे में अधिक गहराई से जानकारी प्राप्त करने के लिए, इस प्रक्रिया द्वारा थ्रेड की संख्या जैसे कि थ्रेड की संख्या, इसकी क्षमताओं आदि।
बी) $ systemctl status <PID>को देखने के लिएइकाई जो एक विशिष्ट प्रक्रिया के निर्माण का कारण बनी। यदि सेवा महत्वपूर्ण नहीं है - तो आप सेवा को रोक और अक्षम कर सकते हैं ।

4) डॉकटर सेवा को फिर से शुरू
करें sudo service docker restart:।

5) आप इस बिंदु पर पहुंच गए और ..
केवल अगर इसका सिस्टम आपके सिस्टम को जोखिम में नहीं डालता है - सर्वर को पुनरारंभ करने पर विचार करें।


4

मेरे मामले में यह था

यूजरलैंड प्रॉक्सी शुरू करने में त्रुटि: सुनो tcp 0.0.0.0:9000: bind: पता पहले से ही उपयोग में है

और मुझे जो कुछ भी चाहिए वह है php तूफान में सुन डिबग को बंद करना आइकन


3

जब मैं एक नया conatier लॉन्च करने की कोशिश कर रहा था तो मुझे नीचे की त्रुटि मिल रही थी- सुनने के लिए tcp 0.0.0.0:8080: bind: एड्रेस पहले से ही उपयोग में है।

समाधान: netstat -tulnp | ग्रेप 8080

[root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws_main) ~] # netstat -tulnp | grep 8080 tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 12749 / java [root@ip-112-x6x-2x-xxx.xxxxx.compute.internal (aws -main) ~] #]

मार -9 12749

फिर कंटेनर को फिर से चालू करने का प्रयास करना चाहिए जो इसे काम करना चाहिए


सटीक ! आपके समाधान ने मदद की।
एल्फर्ड नोबेल

2

मैंने आज दोपहर अपने डॉकटर को अपग्रेड किया और उसी समस्या में भाग गया। मैंने पुनः आरंभ करने की कोशिश की लेकिन भाग्य नहीं।

अंत में, मुझे अपना कंप्यूटर पुनरारंभ करना पड़ा और यह काम कर गया। निश्चित रूप से एक बग।


पुनः आरंभ करने से मेरे लिए भी मदद मिली। धन्यवाद।
अलेक्जेंडर

1

जांचें docker-compose.yml, यह मामला हो सकता है कि पोर्ट दो बार निर्दिष्ट किया गया हो।

version: '3'
services:
  registry:
    image: mysql:5.7
        ports:
      - "3306:3306"             <--- remove either this line or next
      - "127.0.0.1:3306:3306"

0

मैं एक ही मुद्दे पर कई बार भागा। कर्ता-धर्ता पुनः करने की चेष्टा करते हैं


मैं देख रहा हूँ कि कैसे एक कंटेनर को पुनरारंभ करें। कैसे करें डॉकटर को पुनः आरंभ?
मार्क वार्डेल


0
docker-compose down --rmi all 

और फिर अपने कंप्यूटर को पुनरारंभ करें


7
आठ साल के उत्तर के साथ तीन साल पुराने प्रश्न का उत्तर देते समय यह इंगित करना उपयोगी होता है कि आपके उत्तर के प्रश्न का नया पहलू क्या है।
जेसन एलर

0

@ दिमित्रीसंडलोव के उत्तर की भिन्नता: मेरे पास 8080 पर टॉमकट / जावा चल रहा था, जिसे चलते रहने की आवश्यकता थी। Docker-compose.yml फ़ाइल को देखा और मेरे चयन में से किसी अन्य के लिए 8080 में प्रवेश को बदल दिया।

nginx:
  build: nginx
  ports:
    #- '8080:80' <-- original entry
    - '8880:80'
    - '8443:443'

पूरी तरह से काम किया। (केवल शिकन है कि मैं कभी भी परियोजना को अद्यतन करूँगा, क्योंकि यह एक बाहरी रेपो से आ रहा है) परिवर्तन मिटा दिया जाएगा।)


0

यदि आपके पास एक ही मुद्दा है और Windows के साथ है, तो बस एक ध्यान दें:

मेरे मामले में मेरे रास्ते में प्रक्रिया बस है grafana-server.exe। क्योंकि मैंने पहले बाइनरी संस्करण डाउनलोड किया और निष्पादन योग्य पर डबल क्लिक किया, और अब यह उपयोगकर्ता द्वारा एक सेवा के रूप में शुरू होता है SYSTEMजिसे मैं नहीं कर सकता taskkill(कोई अनुमति नहीं)

मुझे विंडोज के "सेवा प्रबंधक" पर जाना है और सेवा "ग्राफाना" की खोज करनी है, और इसे रोकना है। उसके बाद पोर्ट 3000 पर अब कब्जा नहीं है।

उम्मीद है की वो मदद करदे।


0

जो 8888 पोर्ट का उपयोग कर रहा था वह बृहस्पति था और मुझे दूसरे पोर्ट पर चलने के लिए बृहस्पति नोटबुक की कॉन्फ़िगरेशन फ़ाइल को बदलना पड़ा।

उस विशिष्ट बंदरगाह का उपयोग करने वाले को सूचीबद्ध करने के लिए। sudo lsof -i -P -n | ग्रेप ९

आप निम्नलिखित पोर्ट को निर्दिष्ट कर सकते हैं कि आप Jupyter को ~ / .jupyter / jupyter_notebook_config.py में निम्नलिखित पंक्ति को अनकंफर्ट / एडिट करना चाहते हैं:

c.NotebookApp.port = 9999

यदि आपके पास jupyter_notebook_config.py नहीं है तो jupyter नोटबुक --generate-config चलाने का प्रयास करें। बृहस्पति विन्यास पर अधिक जानकारी के लिए इसे देखें।


0

बदलते network_mode: "ब्रिज" से "होस्ट" ने मेरे लिए किया।

इसके साथ

version: '2.2'
services:
  bind:
    image: sameersbn/bind:latest
    dns: 127.0.0.1
    ports:
      - 172.17.42.1:53:53/udp
      - 172.17.42.1:10000:10000
    volumes:
        - "/srv/docker/bind:/data"
    environment:
      - 'ROOT_PASSWORD=secret'
    network_mode: "host"

0

इससे पहले कि यह चल रहा था: docker run -d --name oracle -p 1521: 1521 -p 5500: 5500 qa / oracle मैंने केवल पोर्ट को docker रन -d --name oracle -p 1522: 1522 -p 5500 में बदल दिया: 5500 क्यूए / ऑरेकल

इसने मेरे लिए अच्छा काम किया !


0

मेरी मशीन पर netstat -tulpnइन-पोर्ट (8080) के लिए इस कमांड से एक PID नहीं दिखाया जा रहा था , इसलिए मैं इसे नहीं मार सकता था, कंटेनरों को मारना और कंप्यूटर को पुनरारंभ करना काम नहीं करता था। तो service docker restartमेरे (ubuntu) के लिए कमांड को फिर से शुरू करें और पोर्ट अब उपयोग में नहीं था और मैं दोपहर के भोजन के लिए एक खुश चाप और बंद हूं।



-1

शायद यह बहुत असभ्य है, लेकिन मेरे लिए काम करता है। पुनः आरंभकर्ता docker सेवा

sudo service docker restart

आशा है कि यह भी आप के लिए काम करता है!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.