curl(56)接收失败:连接被同级重置-击中Docker容器时[关闭]


10

从一个AWS ec2实例(运行docker),我正在尝试使用curlDocker容器托管的Web服务。

鉴于:

[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服务:

[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,但不确定如何调试此问题。

Answers:


9

对Docker容器的连接重置通常表示您已为未定义应用程序的容器定义了端口映射。

因此,如果您已定义80:80的映射,请检查docker实例中的进程实际上是否在端口80上运行(netstat -an | grep LISTEN)。

当Docker'proxy'拾取连接,尝试连接到容器内部的进程,失败并重置连接后,您将获得重置。


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(在容器内部),并且由于IP而没有“发布”。所以我将其更改为0.0.0.0:9200,然后它从容器外部开始工作。您需要暴露9200端口,但是我确定您已经知道这一点。
托马什Tibenský

@KevinMeredith:谢谢你..过去4个小时一直在努力!
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所有IP。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.