首页 > Technology > 正文

Docker 里 Nginx 启动后无法访问怎么办?端口映射与配置排查

fenij 2026-08-12 43 Technology

执行 docker run nginx 后,docker ps 显示 Up,浏览器却打不开页面。这种情况别急着重建容器,按下面顺序定位,通常五分钟内能找到根因。

第一步:确认容器真在运行

docker ps -a

如果 STATUS 是 Exited,说明主进程退出,看日志:

docker logs nginx

第二步:查端口映射

常见问题:启动命令没写 -p,或宿主机端口被占用:

docker port nginx
netstat -tulnp | grep :80

端口冲突时把宿主机端口改成 8080:

docker run -d -p 8080:80 --name nginx nginx

第三步:看 Nginx 配置

自定义配置里如果写了 listen 127.0.0.1:80;,容器外就访问不到,要改成 listen 80;。进入容器验证:

docker exec nginx nginx -t

第四步:检查防火墙和安全组

Linux 防火墙(ufw/firewalld)或云厂商安全组会拦截端口:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

排查流程

1
查状态
2
看日志
3
验端口
4
检配置
状态 含义 下一步
Exited 主进程退出 docker logs 看报错
Up 但无端口 启动时没加 -p 重建容器加端口映射
Up 端口正常 多半是防火墙/配置 ufw/nginx -t 排查
🚢
-p 80:80
必须显式映射
🌐
0.0.0.0
Nginx 不要绑回环

常见问题

Q:docker run 没报错,就是 curl localhost 没反应?
先确认端口映射:docker port nginx,再看宿主机 80 是否被其他进程占用。

Q:日志里提示 bind() to 0.0.0.0:80 failed?
端口被占。换成 8080 或停止宿主机上的 Apache/Nginx。

Q:用 docker-compose 启动也一样吗?
一样,重点检查 ports 字段和宿主机端口冲突。

如果这篇帮你定位到了问题,欢迎在 fenij.com 留言贴出你的最终解法,方便后来者参考。

延伸:三个最容易被忽略的坑

排完上面四步还不通,多半是下面三种情况。第一,网络模式搞混:默认是 bridge,必须靠 -p 映射端口;如果你用了 --network host,就不能再写 -p,它直接占用宿主机端口。第二,容器里的 127.0.0.1 不是宿主机:Nginx 反代后端时写 127.0.0.1 指的是容器自己,应改成宿主机真实 IP 或 host.docker.internal。第三,挂载把默认配置清空了:用 -v 挂了一个空的宿主机目录到 /etc/nginx/conf.d,会把镜像里自带配置覆盖掉,结果整站 404。

现象根因一条命令
Up 但 curl 不通没映射 / 绑了 127.0.0.1docker port nginx
改配置不生效未 reloaddocker exec nginx nginx -s reload
反代连不上后端用了容器内回环改成宿主机 IP

实操速查清单

真遇到打不开,按这个顺序敲一遍,八成问题能定位:① docker ps -a 看容器是不是 Exited;② docker logs 容器名 看主进程报错;③ docker port 容器名 看实际映射的宿主机端口;④ 在宿主机上 curl 127.0.0.1:映射端口 本地测通不通;⑤ 本地通了外网还不行,那就是防火墙或云安全组没收端口。一步步缩小范围,比一上来就删容器重来要快得多。

常见问题

问:docker ps 显示 Up,但浏览器打不开?
答:先 docker port nginx 看实际映射的宿主机端口,再确认 Nginx 是 listen 80 而不是 listen 127.0.0.1:80

问:用了 --network host 还是访问不了?
答:host 模式跳过了 NAT,要检查 Nginx 是否真的在监听 80,以及宿主机防火墙 / 云安全组有没有放行。

问:改了配置为什么没变化?
答:自定义配置改完要 docker exec nginx nginx -s reload,或者直接重建容器,否则还是旧配置在生效。

问:容器能 ping 通但端口连不上?
答:ping 走 ICMP,和 TCP 端口是两回事;端口不通仍按 docker port 和防火墙那一套查,别被 ping 通误导。另外记得用 curl -I 宿主机IP:端口 在宿主机本地验证,排除是外网链路问题。这种「能 ping 通却连不上」的情况在 bridge 网络下尤其常见,按上面顺序基本都能定位。

相关完整手册

系统化的排查与配置思路,建议顺手收藏这几篇完整手册: