Docker 容器 Connection reset by peer 报错完整排查实战(华为云 ECS)
最近在华为云 ECS 部署容器服务时,频繁遇到 Connection reset by peer 连接被重置的问题,一开始误以为只是安全组端口没开,反复调整端口映射后依旧无法访问,踩了不少坑,这里把整套排查思路记录下来。
很多新手遇到这个报错第一反应就是去核对安全组、防火墙,其实连接重置≠端口拦截。端口拦截一般是超时无响应,而重置代表 TCP 握手成功,但容器里面的程序主动断开了连接,核心原因大多是服务启动失败、监听地址配置错误。
第一步:优先查看容器日志,定位根源
这是最高效的排查手段,不要上来就改配置。
docker logs 容器名称
常见日志报错:程序段错误、内存不足、线程数超限、缺少配置文件、密钥缺失。 像我部署自动回复脚本的时候,就遇到过 can't start new thread,程序线程耗尽直接崩溃,外网访问就会直接重置连接。
第二步:检查服务监听地址(高频踩坑点)
容器内的 Web 服务,监听地址必须设置为 0.0.0.0。 如果程序写死监听 127.0.0.1,这个端口只能在容器内部访问,宿主机和公网访问全部会重置连接。 进入容器自测:
docker exec -it 容器名 /bin/bash
curl 127.0.0.1:端口
容器内部 curl 能正常返回,外网不行,基本就是监听地址问题。
第三步:核对 docker run 端口映射
映射格式 -p 宿主机端口:容器内部端口,顺序不能写反。 示例:
docker run -d -p 8080:8080 --name demo xxx镜像
同时两件配套操作:
- 华为云控制台安全组,放行对应端口;
- ECS 系统内部 firewalld/iptables 放开端口。
第四步:线程、PID 限制问题
跑自动化、爬虫类脚本很容易触发线程上限,报错 can't start new thread。 启动容器时增加参数解除 PID 限制(内网业务使用):
--pids-limit -1
第五步:排查内存资源
ECS 低配机型很容易内存耗尽,OOM 会直接杀掉容器内进程,服务刚启动就退出,访问直接重置。可以用free -h查看服务器剩余内存。
总结排查顺序
- 看容器日志 → 2. 容器内本地 curl 自测 → 3. 确认监听 0.0.0.0 → 4. 核对端口映射 + 安全组 → 5. 检查内存、线程限制
这个问题非常具有迷惑性,很多人卡在端口上反复试,记住一句话:Connection reset by peer,优先查容器里面的程序有没有正常跑起来。
- 点赞
- 收藏
- 关注作者
评论(0)