कर्ल (56) Recv विफलता: सहकर्मी द्वारा कनेक्शन रीसेट - जब डॉक कंटेनर को बंद करना [बंद]


10

AWS ec2 उदाहरण (जो चलता है docker) से, मैं curlअपने docker कंटेनर-होस्टेड वेब सेवा के लिए प्रयास कर रहा हूं ।

दिया हुआ:

[ec2-user]$ docker ps
CONTAINER ID        IMAGE                                                                COMMAND                  CREATED             STATUS              PORTS                                        NAMES
b56fa0d76d5c        $REGISTRY/$WORK/metrics:v0.1.0   "/bin/sh -c 'sh /root"   3 minutes ago       Up 3 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:9000->9000/tcp   insane_leakey

मैं कंटेनर के भीतर से वेब सेवा को हिट कर सकता हूं:

[ec2-user]$ docker exec -it b56fa0d76d5c bash
root@b56fa0d76d5c:/# curl 'http://localhost/health'
Request is missing required query parameter 'apiName' 

लेकिन, मैं इसे मेजबान से नहीं मार सकता:

[ec2-user]$ curl 'http://localhost/health'
curl: (56) Recv failure: Connection reset by peer

मैंने इस त्रुटि पर इस विस्तृत उत्तर को देखा curl, लेकिन मुझे यकीन नहीं है कि इस मुद्दे को कैसे डीबग किया जाए।

जवाबों:


9

एक डॉकटर कंटेनर में कनेक्शन रीसेट आमतौर पर इंगित करता है कि आपने कंटेनर के लिए पोर्ट मैपिंग को परिभाषित किया है जो किसी एप्लिकेशन को इंगित नहीं करता है।

इसलिए, यदि आपने 80:80 की मैपिंग को परिभाषित किया है, तो जांच लें कि डॉक उदाहरण के अंदर आपकी प्रक्रिया वास्तव में पोर्ट 80 (netstat -an | grep LISTEN) पर चल रही है।

आपको एक रीसेट मिलता है क्योंकि डॉकर 'प्रॉक्सी' कनेक्शन को चुनता है, कंटेनर के अंदर प्रक्रिया से जुड़ने का प्रयास करता है, विफल रहता है, इसलिए कनेक्शन रीसेट करता है।


netstatकंटेनर पर नहीं , लेकिन मैं भाग गया: ss -a | grep -i LISTउत्पादन करने के लिए tcp LISTEN 0 100 ::ffff:127.0.0.1:http :::*। अगर मैं उस आउटपुट को सही ढंग से पढ़ता हूं, तो यह सुन रहा है localhost:80?
केविन मेरेडिथ

7
वास्तव में, stackoverflow.com/a/26553296/409976 मेरी समस्या का समाधान हो, अर्थात का उपयोग कर "0.0.0.0"अंतरफलक के रूप में, नहीं "localhost"
केविन मेरेडिथ

5
धन्यवाद जेसन। आपका समाधान मेरे लिए वास्तविक समाधान नहीं था, लेकिन इसने मुझे इस मुद्दे पर ले गया। मेरे साथ ऐसा इसलिए हुआ क्योंकि यह सेवा 127.0.0.1:9200 (कंटेनर के अंदर) पर शुरू हुई थी और आईपी के कारण यह "प्रकाशित" नहीं हुई थी। इसलिए मैंने इसे 0.0.0.0:9200 में बदल दिया और फिर यह कंटेनर के बाहर से काम करने लगा। आपको 9200 पोर्ट को उजागर करने की आवश्यकता है, लेकिन मुझे यकीन है कि आप पहले से ही जानते हैं।
टामस टिबेन्स्की

@KevinMeredith: उस के लिए धन्यवाद .. पिछले 4 घंटे के लिए संघर्ष कर रहा था कि coz !!!
aman_novice

@KevinMeredith होस्ट को बदलने के बाद भी मैं इसे काम नहीं कर सकता 0.0.0.0
रैंडम एली

1

आप कंटेनर पर tshark स्थापित करके इसकी जांच कर सकते हैं और फिर कर सकते हैं tshark -i any:

यदि आप एक अनुरोध करते हैं तो बाहरी रूप से आपको नीचे जैसा कुछ देखना चाहिए:

root@618910b515f0:/code# tshark -i any
Running as user "root" and group "root". This could be dangerous.
Capturing on 'any'
tshark: cap_set_proc() fail return: Operation not permitted

tshark: cap_set_proc() fail return: Operation not permitted

    1 0.000000000   172.18.0.1 → 172.18.0.3   TCP 76 45844 → 8001 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=820044004 TSecr=0 WS=128
    2 0.000019457   172.18.0.3 → 172.18.0.1   TCP 56 8001 → 45844 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0

नेटवर्क पैकेट आया, लेकिन उसने इसका जवाब दिया RST, जिसका अर्थ था कि इसे अस्वीकार कर दिया गया।


सबसे शायद आप 127.0.0.1बजाय 0.0.0.0सभी पर सुन रहे हैं - सभी आईपी।

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