Docker 常见问题排查
Docker 的问题很多看起来不一样,但排查思路可以尽量固定。比起一出问题就重装,我更建议先把“服务状态、日志、配置、端口、挂载”这几层快速过一遍。
最小排查顺序
我自己通常按这个顺序走:
docker ps -adocker logs <container>docker inspect <container>docker infosudo systemctl status dockersudo 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. 容器里命令能跑,宿主机访问不到
优先检查这三件事:
- 应用在容器里是不是监听了
0.0.0.0 - 容器启动时有没有写
-p - 宿主机或云平台有没有把端口拦掉
辅助命令:
docker port my-container
ss -lntp | grep 8080
我自己的最小判断原则
- 先看状态和日志,不先重装
- 先确认是容器问题、镜像问题还是宿主机问题
- 先看实际配置,不靠记忆猜
- 能复现就固定成文档,别让同一个坑下次再来一遍