跳到主要内容

Docker 常见问题排查

Docker 的问题很多看起来不一样,但排查思路可以尽量固定。比起一出问题就重装,我更建议先把“服务状态、日志、配置、端口、挂载”这几层快速过一遍。

最小排查顺序

我自己通常按这个顺序走:

  1. docker ps -a
  2. docker logs <container>
  3. docker inspect <container>
  4. docker info
  5. sudo systemctl status docker
  6. sudo journalctl -u docker.service -n 100 --no-pager

1. docker pull 很慢、超时或失败

先分清是 Docker 本身挂了,还是访问镜像仓库的链路有问题。

先查这些

docker info
docker pull ubuntu:22.04

重点看:

  • Docker daemon 是否正常
  • 是否配置了镜像加速器
  • 小镜像能不能正常拉取

如果你在阿里云机器上主要是 Docker Hub 访问慢,可以直接看现成记录:

我自己的默认习惯还有两条:

  • 尽量固定镜像标签,不依赖 latest
  • 常用基础镜像尽量提前拉到本地或同步到自己的仓库

2. 提示没有权限访问 Docker

典型报错通常像这样:

permission denied while trying to connect to the Docker daemon socket

先确认 daemon 在不在:

sudo systemctl status docker

如果 Docker 在运行,但当前用户没权限,就把用户加入 docker 组:

sudo usermod -aG docker $USER
newgrp docker

然后重新登录再试:

docker ps

注意:docker 组权限并不低。共享机器或生产机上,先想清楚是不是所有人都该有这个权限。

3. 宿主机端口被占用

容器启动时如果报端口冲突,优先确认到底是谁占了这个端口:

ss -lntp | grep 8080
docker ps --format "table {{.Names}}\t{{.Ports}}"

常见处理方式:

  • 改宿主机端口,例如把 8080:80 改成 18080:80
  • 停掉冲突服务
  • 如果只是本机访问,显式绑定到 127.0.0.1

更系统的说明见:

4. 容器一启动就退出

这种问题不要先盯着 docker run 命令本身,先看容器状态和日志:

docker ps -a
docker logs my-container
docker inspect --format '{{.State.ExitCode}}' my-container

最常见的原因有:

  • 主进程执行完就退出了
  • 启动命令写错
  • 应用配置缺失
  • 依赖的端口、文件、数据库连不上

如果你怀疑是镜像内部环境问题,临时进入容器看:

docker run --rm -it my-image:latest sh

5. 挂载后文件不对,或数据莫名其妙没了

先区分你到底用的是:

  • bind mount
  • named volume
  • 容器可写层

再查容器实际挂载情况:

docker inspect my-container

高频问题通常是:

  • 宿主机路径不存在
  • 把文件当目录挂,或者把目录当文件挂
  • bind mount 把镜像里原有目录内容遮住了
  • 容器进程用户没有读写权限

如果你正在纠结“我应该用 volume 还是 bind mount”,直接转到:

6. 不知道当前到底发生了什么

这时候别急着猜,优先把状态看全:

docker ps -a
docker logs -f --tail 100 my-container
docker inspect my-container
docker stats

如果还是没有方向,再去看 Docker 服务本身:

sudo systemctl status docker
sudo journalctl -u docker.service -n 100 --no-pager

7. 容器里命令能跑,宿主机访问不到

优先检查这三件事:

  1. 应用在容器里是不是监听了 0.0.0.0
  2. 容器启动时有没有写 -p
  3. 宿主机或云平台有没有把端口拦掉

辅助命令:

docker port my-container
ss -lntp | grep 8080

我自己的最小判断原则

  • 先看状态和日志,不先重装
  • 先确认是容器问题、镜像问题还是宿主机问题
  • 先看实际配置,不靠记忆猜
  • 能复现就固定成文档,别让同一个坑下次再来一遍

关联阅读