kıvrılma (56) Recv arızası: Bağlantı eş tarafından sıfırlandı - bağlantı istasyonu konteynerine vurulduğunda [kapalı]


10

Bir AWS ec2 örneğinden (çalışan docker), curldocker kapsayıcısı tarafından barındırılan web hizmetine çalışıyorum.

Verilen:

[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

Web servisini konteynerin içinden vurabilirim:

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

Ancak, ana bilgisayardan vuramıyorum:

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

Bu hataya ilişkin bu ayrıntılı cevaba baktım curl, ancak bu sorunu nasıl ayıklayacağınızdan emin değilim.

Yanıtlar:


9

Bağlantı Docker kapsayıcısına sıfırlama, genellikle kapsayıcı için bir uygulamayı işaret etmeyen bir bağlantı noktası eşlemesi tanımladığınızı gösterir.

Bu nedenle, 80:80 eşlemesi tanımladıysanız, docker örneği içindeki işleminizin aslında bağlantı noktası 80'de (netstat -an | grep LISTEN) çalıştığını kontrol edin.

Docker 'proxy' bağlantıyı aldığından, kapsayıcı içindeki işleme bağlanmaya çalıştığından, başarısız olduğundan, bağlantıyı sıfırladığından sıfırlama alırsınız.


netstatKonteyner üzerinde yok , ama koştum: ss -a | grep -i LISTçıktı tcp LISTEN 0 100 ::ffff:127.0.0.1:http :::*. Bu çıktıyı doğru okursam dinliyor localhost:80mu?
Kevin Meredith

7
Aslında stackoverflow.com/a/26553296/409976 sorunumu düzelttim, yani "0.0.0.0"arayüz olarak kullanmak değil "localhost" .
Kevin Meredith

5
Teşekkürler Jason. Çözümünüz benim için gerçek bir çözüm değildi, ama bu beni soruna götürdü. Bu bana oldu çünkü hizmet 127.0.0.1:9200 (konteyner içinde) başladı ve IP nedeniyle "yayınlanmadı". Bu yüzden 0.0.0.0:9200 olarak değiştirdim ve daha sonra konteynerin dışından çalışmaya başladı. 9200 portunu açmanız gerekiyor, ama eminim zaten biliyorsunuz.
Tomáš Tibenski

@KevinMeredith: Bunun için teşekkürler .. son 4 saat boyunca mücadele ediyor çünkü bunun coz !!!
aman_novice

@KevinMeredith Sunucu olarak değiştirdikten sonra hala çalışamıyorum 0.0.0.0.
RandomEli

1

Konteyner üzerinde tshark kurarak bunu araştırabilir ve sonra tshark -i anyşunları yapabilirsiniz :

Daha sonra harici olarak bir istek yaparsanız aşağıdaki gibi bir şey görmelisiniz:

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

Ağ paketi geldi, ancak a ile yanıt verdi RST, yani reddedildi.


Büyük olasılıkla tüm IP'lerden 127.0.0.1ziyade dinliyorsunuzdur 0.0.0.0.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.