docker run -p 参数中主机端口必须在前、容器端口在后,顺序颠倒(如写成 -p 80:8080)会导致服务无法访问;常见正确写法为 -p 8080:80,表示将主机8080映射到容器80端口。

填反了就访问不到服务,而且 docker ps 看不出错——主机端口在前、容器端口在后,顺序不能颠倒。
docker run -p 参数里主机端口和容器端口的顺序
命令格式是 docker run -p [主机IP:][主机端口]:[容器端口],中间用英文冒号分隔。最常见写法是省略主机IP,直接写 -p 8080:80,表示把本机的 8080 端口映射到容器里的 80 端口。
- 如果填成
-p 80:8080,结果是本机 80 端口去连容器 8080 端口——但你本地 80 端口大概率被占用或需要 root 权限,且服务实际监听的是容器 80 端口,根本连不上 - 容器内应用监听哪个端口,得看它自己的配置(比如 Nginx 默认
EXPOSE 80,Spring Boot 默认server.port=8080),不是你想映射哪就自动监听哪 - 多个端口就重复加
-p:例如-p 3000:3000 -p 9229:9229,分别对应 Web 服务和调试端口
Docker Desktop GUI 里“添加端口映射”字段怎么填
在 Docker Desktop 的容器 Settings → Ports 页面点“Add port mapping”,弹出两个输入框:
- 左边叫
Host port:填你希望在 Windows/macOS 上用的端口号,比如8080 - 右边叫
Container port:填容器内进程实际监听的端口,比如80或3000 - 别填 IP 地址——除非你明确要限制只允许某网卡访问,否则留空或填
0.0.0.0即可 - 填完必须点右下角 Apply & Restart,不是“Save”或“OK”;不重启,新映射不生效
运行中容器想加端口?别改配置文件
Windows/macOS 上通过修改 hostconfig.json 强行加映射,风险极高:
- Docker Desktop 后台可能正在读写该文件,手动编辑极易损坏容器状态
- WSL2 路径(如
\wsl$docker-desktop-data...)权限受限,保存失败是常态 - 改完还得彻底退出 Docker Desktop 再启动,开发流中断明显
- 真正稳妥的做法只有两个:
docker commit打包再docker run -p重跑,或者用iptables(仅 Linux 主机)临时转发
映射后访问不到?先确认这三件事
很多问题其实和端口填写无关,而是环境链路断在别处:
- 容器内服务是否真在监听?进容器执行
netstat -tuln | grep :80或ss -tuln | grep :80,没输出说明应用根本没起来或监听错了地址(比如只绑127.0.0.1) - 宿主机防火墙是否放行?Windows Defender 防火墙默认会拦新端口,macOS 则要注意“防火墙选项”里是否启用“阻止所有传入连接”
- 浏览器访问时 URL 是否写对?
http://localhost:8080是对的,http://127.0.0.1:8080也行,但http://0.0.0.0:8080一定不行——那是监听地址,不是访问地址
端口映射本身很简单,难的是每次都要同步确认容器内服务状态、宿主机网络策略、以及你手抖有没有多打个零。











