Skip to content
VDS · Docker 与容器

Docker:常见问题排查

容器不断重启、端口被占用、空间不足、“permission denied”、服务看不到相邻服务——症状对照表与排查流程。

更新于 2026年8月23日

几乎所有容器问题都归结为十几种常见情况。排查时始终从同样的三条命令开始。

最先执行的三条命令

docker compose ps
docker compose logs --tail 100 <service>
docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}' <container>

状态、日志末尾和退出码就能回答大部分问题。之后,再根据症状逐一排查。

症状对照表

症状可能原因处理方法
一直处于 Restarting应用在启动时崩溃docker compose logs --tail 200,看第一条错误,而不是最后一条
退出码 137,OOMKilled: true内存不足提高限制或找出内存泄漏,参见资源限制
启动后立即出现退出码 1配置或变量有误docker compose config —— 检查变量替换
port is already allocated端口被其他进程占用sudo ss -tulpn | grep :<port>
no space left on device磁盘空间或 inode 不足df -h 和 df -i,参见磁盘空间
卷中的文件出现 permission deniedUID 不匹配docker compose exec app id,然后 chown 或设置 PUID/PGID
应用无法访问数据库网络不同或请求发往 localhost参见 Docker 网络
Cannot connect to the Docker daemon服务未运行或权限不足sudo systemctl status docker、docker 用户组
一切都很慢,负载却很低磁盘瓶颈iostat -x 2,参见磁盘速度

容器崩溃,但日志是空的

当进程还没来得及输出任何内容就退出时,就会出现这种情况。请用 shell 代替主命令手动运行镜像:

docker run --rm -it --entrypoint sh <image>

进入容器后,手动执行启动命令——错误就会显示在屏幕上。顺便检查一下配置文件是否就位:

docker compose run --rm app cat /app/config.yaml

修改没有生效

经典问题:您编辑了文件,重启后却没有任何变化。

docker compose config          # does Compose see your changes
docker compose up -d --force-recreate app
docker compose exec app cat /etc/app/config.yaml

通常有两个原因:文件挂载的位置与您以为的不一致,或者容器看到的是构建时进入镜像的那份副本。

不要用 docker system prune -a 来解决问题。它会删除未使用的镜像、网络和构建缓存,加上 --volumes 参数还会删除存有数据的卷。容器一停止,它的卷就会变成“未使用”。先查明原因,再清理。

究竟什么时候该清理

docker system df
docker image prune
docker builder prune
docker container prune

docker system df 会显示究竟是什么占用了空间:镜像、构建缓存、卷还是容器日志。通常是构建缓存在作怪——删除它是安全的。

如果机器失去响应

SSH 连不上,网站打不开——通常是某个容器吃光了内存,系统进入了交换。请通过机器面板中的控制台登录。使用 htop 和 btop 需要“Screen”模式:文本行不会传递窗口尺寸,所以它始终是 80×24。

free -h
sudo dmesg -T | tail -40
sudo systemctl restart docker

如果系统完全无法启动,请在“访问”选项卡中把启动模式切换为 SystemRescue 恢复盘:机器会重启进入该恢复盘,root 无需密码即可登录,磁盘会显示为 /dev/sda。在那里您可以挂载分区并取回数据。

事前该检查,而不是事后

  • 已设置日志大小限制——参见容器日志。
  • 已为所有服务设置内存限制。
  • 镜像版本已固定,且旧镜像尚未删除——参见容器更新。
  • 存在数据副本并已验证——参见恢复演练。