深色模式
Docker 常见问题与误区
概述
Docker 真正让人头疼的时刻,通常不是第一次执行 docker run,而是命令明明没报明显语法错,结果服务就是起不来、连不上、数据还不见了。排障时如果没有一条稳定的判断线,很容易从网络查到权限,再从权限查到卷,最后绕回起点。
这一篇不做问题流水账,只保留最常见、最值得先排的几类问题。每一类都按“现象、原因、先看什么”来组织。
镜像拉取慢或拉取失败
常见现象
docker pull很慢- 拉取过程中超时
docker run首次启动卡在拉镜像阶段
先看什么
先看镜像拉取本身能不能通:
sh
docker pull hello-world再看镜像加速配置有没有生效:
sh
docker info常见原因
- 当前网络访问 Docker Hub 不稳定
- 配了镜像加速,但 Docker daemon 没重启
daemon.json写错,导致配置没有被读取
如果 daemon.json 已经改过,docker info 里却看不到 Registry Mirrors,优先检查 JSON 格式和 daemon 重启状态。别先怀疑玄学。
permission denied 或连不上 /var/run/docker.sock
常见现象
text
permission denied while trying to connect to the Docker daemon socket先看什么
先确认当前用户是不是已经在 docker 组里:
sh
groups再确认 Docker 服务是否正常:
sh
systemctl status docker常见原因
- 当前用户没加入
docker组 - 加组以后没有重新登录
- Docker daemon 压根没启动
这个问题大多数时候都不是“Docker 坏了”,而是权限和服务状态这两个最基础的前提还没满足。
容器一启动就退出
常见现象
docker run后容器立刻消失docker ps看不到,但docker ps -a里能看到退出状态
先看什么
先看容器状态:
sh
docker ps -a再看日志:
sh
docker logs <container>常见原因
- 主进程启动失败
- 容器里默认命令执行完就结束
- 应用读取配置失败后直接退出
容器不是虚拟机,不会因为“系统还在”就自动常驻。主进程结束,容器通常也就跟着结束。这一点必须先接受,后面的现象才解释得通。
端口映射了,但还是访问不到
常见现象
- 已经写了
-p 8080:80 - 浏览器或
curl还是访问失败
先看什么
看容器是否真的在运行:
sh
docker ps看端口映射是否真的存在:
sh
docker inspect <container>再看应用是否监听在正确端口和地址上。
常见原因
- 容器里的应用根本没启动
- 应用没有监听到预期端口
- 监听地址有问题,例如只监听了本地回环地址
- 宿主机防火墙或云安全组没放行
端口映射不是魔法。它只能把已经在容器里监听的端口转出来,不能替应用补齐没启动这一步。
容器之间怎么就连不上
常见现象
- 应用容器访问数据库容器失败
- 明明两个容器都在跑,却互相访问不到
先看什么
看它们是不是在同一个 Docker 网络里:
sh
docker network inspect <network>常见原因
- 两个容器根本不在同一个网络
- 连接地址写成了宿主机地址,而不是容器名或服务名
- 误把“端口映射”当成了“容器互联”
Compose 项目里,优先用服务名互相访问,通常比绕宿主机端口要稳很多。
数据为什么删容器后还在,或者为什么不在了
常见现象
- 删掉容器后,数据库数据还在
- 换个容器重建以后,数据却没了
先看什么
先确认数据到底写到了哪里:
- 容器自身文件系统
- 命名卷
- 绑定挂载目录
可以用:
sh
docker inspect <container>看挂载信息。
常见原因
- 数据写在命名卷里,所以删容器后还在
- 数据只写在容器内部文件系统,所以删容器后一起没了
- 以为自己挂了卷,实际挂载路径写错了
卷和容器不是同生命周期对象。把这条线记住,很多“数据去哪了”的问题会一下子清楚很多。
用 DOCKER_HOST=ssh://... 拉镜像不顺
常见现象
- 本地通过
DOCKER_HOST=ssh://user@host执行命令时表现异常 - 某些拉取动作或网络行为看起来和预期不一致
先看什么
先 SSH 到远端机器本身,直接执行:
sh
docker info
docker pull hello-world常见原因
- 问题本来就在远端主机的 Docker 环境里
- 当前远端用户权限不对
- 远端网络或镜像拉取能力本身有问题
远程使用 Docker 时,很多失败并不是“SSH 模式特殊”,而只是把远端主机原本的问题暴露出来了。
一条排障顺序
遇到 Docker 问题时,先按这个顺序排:
- Docker daemon 是否正常。
- 当前用户是否有权限。
- 容器是否真的在运行。
- 日志里报了什么。
- 网络和挂载是不是按预期生效。
这条顺序不花哨,但大多数问题都跑不掉。
