curl(56)接收失败:对等方重置连接 - 当击中docker容器时

curl(56)接收失败:对等方重置连接 - 当击中docker容器时

我正在从 AWS ec2 实例(运行docker)尝试使用curl我的 docker 容器托管的 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错误,但我不确定如何调试这个问题。

答案1

与 Docker 容器的连接重置通常表示您为该容器定义了一个不指向应用程序的端口映射。

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

当 Docker“代理”获取连接、尝试连接容器内的进程、失败时,您将获得重置,因此重置连接。

答案2

您可以通过在容器上安装 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,这意味着它被拒绝了。


最有可能的是,您正在监听所有 IP 127.0.0.1,而不是0.0.0.0所有 IP。您可以通过运行来验证这一点netstat -tulpn

相关内容