端口映射失败本质是宿主机端口无法被docker正确绑定或转发,需从外到内逐层排查:先确认宿主机端口是否空闲(用lsof或netstat查占用)、再检查容器端口映射是否重复(docker ps --format)、验证容器内服务监听地址是否为0.0.0.0、最后排查iptables/nat及防火墙拦截(ip_forward和bridge-nf-call-iptables需为1,防火墙与安全组放行端口)。

端口映射失败,本质是宿主机端口无法被 Docker 正确绑定或转发。问题不在容器本身,而在“宿主机 → 容器”这条链路上的某个环节断了。排查要从外到内、逐层验证,而不是反复重启容器。
确认宿主机端口是否真的空闲
这是最常被跳过的一步。Docker 启动时若发现端口已被占用,通常静默失败或报 address already in use,但很多人没看日志就直接怀疑配置。
- 查指定端口(如 8080)谁在用:
sudo lsof -i :8080(macOS/Linux)或sudo netstat -tulnp | grep :8080(Linux) - 重点关注输出中的 PID 和 COMMAND:是
nginx、node、docker-proxy还是其他进程? - 如果是
docker-proxy,说明已有容器占用了该端口,接着用docker ps查具体是哪个容器
检查运行中容器的端口映射是否重复
Docker 不允许两个容器同时映射到同一个宿主机端口,哪怕服务不同。冲突往往发生在多个 docker run -p 80:80 命令之间。
- 运行
docker ps --format "table {{.Names}}\t{{.Ports}}",看所有正在运行的容器及其映射关系 - 重点找形如
0.0.0.0:8080->80/tcp的条目——多个容器含相同左侧端口即为冲突 - 别忘了检查已退出但未删除的容器:
docker ps -a | grep -E "(Exited|Created)",残留配置有时也会影响网络
验证容器内服务监听地址是否正确
即使端口映射配置无误,如果应用只监听 127.0.0.1:80,Docker 也无法将外部流量转发进去——它只能转发到 0.0.0.0:80。
- 进入容器:
docker exec -it sh - 检查监听状态:
netstat -tuln | grep :80或ss -tuln | grep :80 - 正确输出应为
*:80或0.0.0.0:80;若显示127.0.0.1:80,需修改应用配置,让它监听0.0.0.0
排查系统级转发与防火墙拦截
端口能绑定、容器能启动、服务也在监听,但就是访问不了——大概率卡在 iptables/NAT 或防火墙环节。
- 确保内核开启转发:
sysctl net.ipv4.ip_forward和sysctl net.bridge.bridge-nf-call-iptables输出都应为1 - 临时启用:
sudo sysctl -w net.ipv4.ip_forward=1&&sudo sysctl -w net.bridge.bridge-nf-call-iptables=1 - 检查防火墙规则:CentOS 用
sudo firewall-cmd --list-ports,Ubuntu 用sudo ufw status,确认目标端口已放行 - 云服务器还需检查安全组策略,确保入方向规则开放对应端口











