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 denied | UID 不匹配 | 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。在那里您可以挂载分区并取回数据。