Docker容器运行后端服务,端口映射明明正确但无法访问,怎么办?
我用Docker跑了一个Node.js服务,执行了docker run -p 3000:3000 my-node-app,docker ps显示端口映射正常,但访问http://localhost:3000却打不开。
尝试过:1.确认容器内服务确实在监听3000端口(用docker exec执行netstat验证过)
2.关闭防火墙(systemctl stop firewalld)
3.换不同端口重试
但还是不行,curl本地地址报Connection reset by peer错误,浏览器提示无法连接。这是哪里出问题了?
把启动命令改成
npm start -- --host 0.0.0.0或者在代码里改成app.listen(3000, '0.0.0.0', () => {...})。这问题我昨天刚踩过坑,搞了半小时才想起来是这个原因。0.0.0.0:3000吗?如果服务只绑定在127.0.0.1:3000,外部是访问不到的。建议先检查服务启动时的配置,确保监听的是
0.0.0.0。比如如果你用Express,启动代码应该是这样的:如果原来是绑定在
localhost或者127.0.0.1,改成这样应该就能解决了。另外,顺便提醒一下,可以用
docker exec -it <container_id> curl http://0.0.0.0:3000来测试容器内部是否能正常访问服务,这样更清晰地定位问题。如果还是不行,那就再看看Docker的网络模式是不是用了自定义配置,不过按照你的描述,大概率就是监听地址的问题。