问题出在服务监听地址、内核IPv4转发、防火墙策略或端口映射本身;需依次检查容器服务是否监听0.0.0.0、ip_forward是否为1、防火墙是否放行端口、docker port是否显示有效映射。

宿主机外部访问不了 Docker 映射端口,问题不在容器是否运行,而在于流量从外网到容器的整条链路中某处被阻断。核心要查四个关键点:服务监听地址、内核转发、防火墙策略、端口绑定本身。
确认容器内服务监听的是 0.0.0.0
只监听 127.0.0.1 的服务,连宿主机本机都访问不了,更别说外部机器了。
- 进容器执行 netstat -tuln | grep :端口号,看输出是不是 0.0.0.0:端口号,不是 127.0.0.1
- Flask 启动加 -h 0.0.0.0;Node.js 用 app.listen(端口, '0.0.0.0')
- Spring Boot 配置 server.address=0.0.0.0,别留着 127.0.0.1
检查宿主机 IPv4 转发是否开启
Docker 的端口映射依赖内核的 NAT 能力,ip_forward 关闭等于关掉了转发总闸。
- 运行 cat /proc/sys/net/ipv4/ip_forward,结果必须是 1
- 临时开启:echo 1 > /proc/sys/net/ipv4/ip_forward
- 永久生效:往 /etc/sysctl.conf 追加 net.ipv4.ip_forward = 1,再执行 sysctl -p
验证防火墙是否放行目标端口
firewalld 或 iptables 会直接在宿主机入口把请求丢掉,根本到不了 Docker 的规则层。
- 查状态:firewall-cmd --state,如果是 running 就继续
- 查已开放端口:firewall-cmd --list-ports,确认你的端口在列表里
- 没开就加:firewall-cmd --permanent --add-port=端口号/tcp,然后 firewall-cmd --reload
确认端口映射确实生效且无冲突
docker ps 显示 “Up” 不代表端口绑定了,得看实际映射关系。
- 运行 docker port 容器名或ID,应输出类似 8080->80
- 如果没输出,说明 -p 参数没加对,或者启动时被忽略
- 检查宿主机端口是否被占:sudo lsof -i :端口号 或 sudo netstat -tulnp | grep 端口号
不复杂但容易忽略。


















