宿主机打不开应用,大概率是服务未监听0.0.0.0、端口映射缺失或被防火墙拦截;需依次检查容器内netstat监听地址、docker ps的PORTS列是否含0.0.0.0:端口→端口、以及宿主机防火墙放行情况。

容器运行了但宿主机打不开应用,大概率不是 Docker 本身挂了,而是服务没暴露、没监听对、或者被拦住了。直接查端口和网络链路比重启 Docker 更快。
docker ps 显示 Up 却访问不了 localhost:端口
这是最常见错觉:容器状态是 Up,不代表服务真在响应请求。先确认两件事:
- 容器内进程是否真正启动并监听了目标端口?进容器执行
netstat -tuln | grep :80或ss -tuln | grep :80,看有没有LISTEN状态;没有就说明应用根本没起来,或配置写错了监听地址(比如只绑127.0.0.1) -
docker ps输出里的PORTS列是否真有映射?例如显示0.0.0.0:8080->80/tcp才算成功;如果为空或只有80/tcp(没箭头),说明漏了-p参数 - Windows/macOS 用户注意:
localhost是通的,但用127.0.0.1有时会因 WSL2 网络桥接策略失败,优先试localhost
端口映射正确但浏览器提示连接被拒绝
连接被拒绝(Connection refused)意味着 TCP 握手都没完成,基本可排除防火墙拦截(那是超时或拒绝连接),重点查三处:
- 确认
docker run命令用了-p而非--expose:--expose只是声明端口,不触发映射;-p 8080:80才真正把宿主机 8080 绑到容器 80 - 检查是否映射到了错误端口:比如容器里服务实际监听 3000,却写了
-p 8080:80;用docker inspect <container_id></container_id>查NetworkSettings.Ports字段,核对 HostPort 和 ContainerPort - Windows 上 Docker Desktop 默认通过 WSL2 虚拟机转发流量,若 WSL2 发行版未设为默认(
wsl --set-default <distro></distro>),或/etc/wsl.conf里禁用了网络,localhost就可能不通——此时可临时改用 WSL2 的 IP(cat /etc/resolv.conf | grep nameserver)加端口访问测试
Docker Desktop 启动后容器能跑但应用间连不通
多个容器要互相访问(比如 web 容器调 API 容器),别依赖 localhost ——那是各自容器内部的回环地址。必须用 Docker 网络机制:
- 避免用
bridge网络 + IP 地址硬编码:IP 可能变,且跨容器通信不稳定;改用自定义网络:docker network create mynet,然后docker run --network mynet --name api ...和docker run --network mynet --name web ... - 容器内用服务名当 host:web 容器里 curl
http://api:3000/health就行,Docker DNS 会自动解析;名字必须和--name一致,不能用镜像名 - 检查
docker-compose.yml是否漏了networks声明或depends_on写成纯顺序依赖(它不等服务就绪),要用健康检查 + wait-for-it 类脚本兜底
Windows 上 localhost 访问通但其他设备访问不到
这通常是 Windows 防火墙或网络配置问题,和 Docker 关系不大:
- Docker Desktop 默认只绑定
127.0.0.1,不监听0.0.0.0;想让局域网其他机器访问,得确保-p映射时没加127.0.0.1:前缀,即用-p 8080:80而非-p 127.0.0.1:8080:80 - Windows 防火墙默认阻止入站连接:打开“高级安全 Windows 防火墙” → “入站规则” → 新建规则 → 端口 → TCP → 特定本地端口(如 8080)→ 允许连接
- 如果用的是公司网络或启用了“公共网络”配置文件,Windows 可能完全关闭网络发现;临时切到“专用网络”再试
真正卡住的地方往往不在 Docker 日志里,而在容器进程是否真在监听、端口是否真被映射、以及 Windows 防火墙是否悄悄拦下了入站包——这些点不逐个验证,光重启 Docker Desktop 没用。


















