Linux容器端口映射不通本质是请求未抵达容器,需按“宿主机入口→容器出口”链路逐层排查:先验docker ps和ss/netstat确认宿主机监听、再用docker port和容器内netstat查监听地址是否为0.0.0.0、继而curl localhost测试、最后检查防火墙及云安全组。

确认宿主机是否真在监听映射端口
先看 Docker 是否成功把端口绑到宿主机上:
- 运行 docker ps,检查输出中对应容器的 PORTS 列,确认有类似
0.0.0.0:8001->80/tcp的映射关系 - 执行 ss -tuln | grep :8001(或
netstat -tuln | grep :8001),应看到*:8001或127.0.0.1:8001等监听项;若无输出,说明映射未生效或被跳过 - 用 docker port 单独查映射结果,比 docker ps 更可靠,尤其对多端口或动态映射场景
验证容器内服务是否真正监听并可访问
宿主机监听了,不代表容器里服务就准备好了:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 进入容器:docker exec -it sh(或 bash),再运行 netstat -tuln | grep :80(假设容器内服务跑在 80 端口),确认输出中有
0.0.0.0:80或:::80;如果只有127.0.0.1:80,外部请求进不来 - 在宿主机上直接访问本地映射端口:curl -v http://localhost:8001;成功说明容器网络通、服务正常、绑定地址正确;失败则问题在容器内部
- 常见错误:Node.js/Python/Java 应用默认只监听 127.0.0.1,需显式指定
0.0.0.0(如app.listen(80, '0.0.0.0'))
检查宿主机防火墙是否放行该端口
即使 Docker 启动了,系统防火墙仍可能拦截入站连接:
- Firewalld 用户:sudo firewall-cmd --list-ports 查看是否含
8001/tcp;没有就加:sudo firewall-cmd --add-port=8001/tcp --permanent && sudo firewall-cmd --reload - UFW 用户:sudo ufw status verbose,确认状态为 active 且 8001 在 allow 列表
- iptables 用户:sudo iptables -L INPUT -n | grep 8001;注意 Docker 会自动插入规则,但若手动 DROP 在前,也可能覆盖
排除网络路径干扰(特别是云环境与 NAT 场景)
从外网访问失败时,问题常不在容器本身,而在中间链路:
- 确认你访问的 IP 是真实公网 IP:在服务器上执行 curl ifconfig.me,和你客户端访问的 IP 对比;不一致大概率是光猫二级 NAT 或运营商 NAT
- 云服务器必须检查安全组:阿里云/腾讯云/AWS 控制台中,确保安全组入方向放行目标端口(TCP)、源 IP 范围包含你的客户端(如
0.0.0.0/0) - 路由器用户:登录管理页,核对端口转发规则中的「外部端口」「内部 IP」「内部端口」「协议」四要素是否完全匹配,且内部 IP 是容器所在宿主机的真实局域网 IP(非 127.0.0.1)

















