Docker 容器启动后打不开:从端口到日志的排错清单
“容器显示已启动,但网站打不开”通常不是一个问题,而是容器进程、应用监听、端口映射、防火墙、反向代理、域名与 HTTPS这条链路中的某一环断了。按下面顺序排查,避免来回猜。
第一步:容器真的在运行吗
sudo docker compose ps
sudo docker ps -a
sudo docker inspect 容器名 --format 'status={{.State.Status}} exit={{.State.ExitCode}} error={{.State.Error}}'
如果容器反复 Restarting,先看日志,不要连续重启掩盖根因。
第二步:日志在报什么
sudo docker compose logs --tail=200
sudo docker compose logs -f 服务名
permission denied:检查宿主机目录属主、文件权限和容器运行用户。connection refused:依赖服务未启动、端口错误或只监听了错误地址。no space left on device:检查磁盘、inode 与 Docker 存储占用。OOMKilled:内存不足,检查限制、进程占用与系统日志。
第三步:应用在容器内监听吗
sudo docker exec 容器名 sh -c 'ss -lntp || netstat -lntp'
sudo docker exec 容器名 sh -c 'wget -qSO- http://127.0.0.1:应用端口/ 2>&1 | head'
Web 应用在容器内通常应监听 0.0.0.0,只监听 127.0.0.1 可能导致端口映射无法访问。
第四步:宿主机端口映射正确吗
sudo docker port 容器名
sudo ss -lntp
curl -v http://127.0.0.1:映射后的宿主机端口/
compose 中 8080:80 表示宿主机 8080 转发到容器 80,顺序不能反。若由 Nginx 反代,可使用 127.0.0.1:8080:80,避免直接暴露到公网。
第五步:反向代理是否连对上游
sudo nginx -t
curl -I http://127.0.0.1:上游端口/
sudo tail -n 100 /var/log/nginx/error.log
出现 502 时,重点检查上游地址、端口、应用是否启动,以及 Nginx 与容器的网络关系。修改配置后必须先语法检查,再重载。
第六步:域名、证书和外部端口
dig +short 你的域名
curl -I http://你的域名
curl -Iv https://你的域名
openssl s_client -connect 你的域名:443 -servername 你的域名 </dev/null
确认域名解析到正确 IP,80/443 已在云安全组放行,证书域名匹配且未过期。Docker 发布的端口可能绕过部分 ufw/firewalld 规则,应按 Docker 官方防火墙说明设计规则,不要只看面板显示。
第七步:检查资源是否耗尽
df -h
df -i
free -h
sudo docker stats --no-stream
sudo docker system df
dmesg -T | tail -n 100
不要看到磁盘满就直接运行 docker system prune -a。先确认哪些镜像、卷和构建缓存仍在使用,优先清理明确无用且可恢复的对象。
发帖求助模板
系统版本:
Docker / Compose 版本:
部署方式:
预期结果:
实际现象:
最近一次正常时间:
已尝试动作:
docker compose ps 输出:
最近 100 行日志:
compose.yaml:请删除密码、Token、Cookie 和私钥
Responses