curl (56) Kegagalan RECV: Reset koneksi oleh rekan - ketika memukul wadah buruh pelabuhan [ditutup]


10

Dari instance AWS ec2 (yang berjalan docker), saya mencoba ke curllayanan web yang di-host dengan buruh pelabuhan.

Diberikan:

[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

Saya dapat menekan layanan web dari dalam wadah:

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

Tapi, saya tidak bisa mengenai itu dari tuan rumah:

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

Saya melihat jawaban terperinci ini tentang curlkesalahan ini , tapi saya tidak yakin bagaimana men-debug masalah ini.

Jawaban:


8

Reset Koneksi ke wadah Docker biasanya menunjukkan bahwa Anda telah menetapkan pemetaan port untuk wadah yang tidak mengarah ke aplikasi.

Jadi, jika Anda telah menetapkan pemetaan 80:80, periksa apakah proses Anda di dalam instance buruh pelabuhan sebenarnya berjalan di port 80 (netstat -an | grep LISTEN).

Anda mendapatkan reset ketika Docker 'proxy' mengambil koneksi, gagal terhubung ke proses di dalam container, gagal, jadi reset koneksi.


Tidak netstatdi wadah, tapi saya berlari: ss -a | grep -i LISTke output tcp LISTEN 0 100 ::ffff:127.0.0.1:http :::*. Jika saya membaca output itu dengan benar, maka itu mendengarkan localhost:80?
Kevin Meredith

7
Sebenarnya, stackoverflow.com/a/26553296/409976 memperbaiki masalah saya, yaitu menggunakan "0.0.0.0"sebagai antarmuka, bukan "localhost" .
Kevin Meredith

5
Terima kasih Jason. Solusi Anda bukan perbaikan yang sebenarnya bagi saya, tetapi itu membawa saya ke masalah. Ini terjadi pada saya karena layanan dimulai pada 127.0.0.1:9200 (di dalam wadah) dan itu tidak "diterbitkan" karena IP. Jadi saya mengubahnya menjadi 0.0.0.0:9200 dan kemudian mulai bekerja dari luar wadah. Anda perlu memiliki port 9200 terbuka, tapi saya yakin Anda sudah tahu itu.
Tomáš Tibenský

@KevinMeredith: Terima kasih untuk itu .. telah berjuang selama 4 jam karena itu !!!
aman_novice

@KevinMeredith Saya masih tidak bisa membuatnya bekerja setelah mengubah host menjadi 0.0.0.0.
Lingbo Tang

1

Anda dapat menyelidiki ini dengan menginstal tshark pada wadah dan kemudian melakukan tshark -i any:

Jika Anda kemudian melakukan permintaan secara eksternal, Anda akan melihat sesuatu seperti di bawah ini:

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

Paket jaringan datang tetapi menanggapi dengan RST, yang berarti ditolak.


Kemungkinan besar Anda mendengarkan 127.0.0.1daripada 0.0.0.0semua IP.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.