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 和私钥

官方资料

Related Articles

Responses