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.

Kevin Meredith
sumber

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.

Jason Martin
sumber
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.

Chris Stryczynski
sumber