端口映射顺序写反是最常见错误,正确格式为-p宿主机端口:容器端口,如-p8080:80;写反(如-p80:8080)会导致宿主机端口冲突且目标端口未映射,访问时连接被拒绝。

docker run -p 参数写反了导致连接被拒绝
这是新手最常踩的坑:把宿主机端口和容器端口顺序颠倒,比如想让宿主机 8080 访问容器 80,却写了 docker run -p 80:8080。结果是宿主机 80 被占(可能冲突),而 8080 根本没映射,curl http://localhost:8080 必然报 Connection refused。
验证方法:docker port 输出为空或不是预期格式(如 8080->80),基本就是写反了。
- 正确写法永远是
-p 宿主机端口:容器端口,例如-p 8080:80 - 若需绑定到特定宿主机 IP(如仅限本地访问),用
-p 127.0.0.1:8080:80,但不要省略中间的冒号分隔 - Windows/macOS 上 Docker Desktop 默认走 WSL2 或 HyperKit,不支持直接绑定
0.0.0.0到物理网卡,所以别在-p里写0.0.0.0:8080:80——它会被忽略,且容易误导
容器内服务监听的是 127.0.0.1 而不是 0.0.0.0
Docker 端口映射只是转发流量,前提是容器内服务“愿意开门”。如果应用只监听 127.0.0.1:8080,那它只收本容器内部的请求,宿主机发来的包直接被丢弃。
进容器确认真实监听状态:docker exec -it ss -tuln | grep :8080。看到 127.0.0.1:8080 就是问题根源;看到 0.0.0.0:8080 或 *:8080 才算合格。
- Flask 启动必须加
-h 0.0.0.0,不能依赖默认(某些版本默认绑 127.0.0.1) - Node.js 的
app.listen(8080, '127.0.0.1')要改成'0.0.0.0'或省略 host 参数 - Spring Boot 需显式设
server.address=0.0.0.0,127.0.0.1是无效的 - Go 的
http.ListenAndServe("127.0.0.1:8080", h)改为":8080"即可
Docker Desktop 的 WSL2 网络层未正确桥接
Windows/macOS 上 Docker Desktop 不是直接跑在宿主机网络栈上,而是通过 WSL2(Windows)或虚拟机(macOS)中转。这意味着:即使容器监听 0.0.0.0、-p 写对了、防火墙也关了,仍可能因 WSL2 网络配置异常导致外部无法访问。
典型现象:curl http://localhost:8080 失败,但在 WSL2 终端里 curl http://localhost:8080 成功——说明流量根本没从 Windows/macOS 穿透进来。
- Windows 上检查 WSL2 是否正常:PowerShell 中运行
wsl -l -v,确保状态为Running,且发行版是 WSL2 - 重启 WSL2:执行
wsl --shutdown再重新启动 Docker Desktop - 避免手动修改 WSL2 的
/etc/wsl.conf或/etc/resolv.conf,Docker Desktop 自带网络管理,乱改易断连 - Mac 用户若用 macOS Sequoia+,注意系统隐私设置可能限制 Docker Desktop 访问网络,需在「系统设置 → 隐私与安全性 → 完全磁盘访问」中勾选 Docker Desktop
宿主机防火墙或安全组拦截了映射端口
Docker Desktop 本身不接管宿主机防火墙,Windows Defender 防火墙、macOS 防火墙、或云服务器的安全组规则,都可能拦掉你刚映射的端口。
验证方式:在宿主机终端运行 curl -v http://localhost:8080。如果返回 Connection refused,说明请求压根没到 Docker;如果卡住或超时,大概率是防火墙/安全组在拦截。
- Windows:打开「Windows Defender 防火墙 → 高级设置 → 入站规则」,确认有允许 TCP 端口 8080 的规则(名称含 Docker 或自定义)
- macOS:终端执行
sudo /usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate查状态;若开启,用--add /Applications/Docker.app/Contents/MacOS/Docker授权 - 云服务器(如阿里云、腾讯云):必须单独在控制台开通安全组入方向规则,协议 TCP,端口填你映射的宿主机端口(如 8080),源地址建议设为
0.0.0.0/0(测试用)或具体 IP 段
真正卡住人的地方,往往不是某一个环节出错,而是多个条件叠加:比如端口写反 + 应用监听 127.0.0.1 + WSL2 网络卡顿,三者同时存在时,docker ps 显示运行中、docker port 有输出、日志也没报错——但就是打不开。排查时得一层层剥,别跳步。


















