返回博客

31 Docker 容器跑不起来?90% 的问题就这 3 类

31 Docker 容器跑不起来?90% 的问题就这 3 类

导语:容器起不来,先别删了重建——90% 的问题就三类:端口冲突、路径挂载、依赖缺失。这一篇每类给典型报错 + 排查方法,一次讲清。

25 篇你学会了 docker compose up -d --build,28 篇学会了看日志。但容器还是会时不时起不来——别慌,90% 就三类问题,认出报错就能修。

一、三类问题总表

类型 典型报错(关键词) 排查命令
端口冲突 bind: address already in use ss -tlnp 查谁占着
路径挂载 no such file or directory docker inspect 容器名 看挂载
依赖缺失 ModuleNotFoundError / command not found docker logs 容器名 看报错

经验:先认出是哪类,再动手——三类对应三种修法,认错了就是瞎折腾。

二、逐类拆解

① 端口冲突:报 bind: address already in use

意思:你要用的端口,已经被别的进程/容器占了。

排查:

ss -tlnp    # 看谁在监听这个端口(14 篇学过)
docker ps   # 是不是另一个容器占着

修法(三选一):

  • 停掉占端口的进程/容器;
  • 换映射端口:compose 里把 5000:5000 改成 5001:5000(25 篇的坑);
  • 如果端口被你自己上次启动的容器占着——docker ps -a 找到它,删掉旧的再启动。

经验:"端口被占"九成是你自己上次的容器还活着——docker ps -a 一看便知,别先怀疑系统。

② 路径挂载:报 no such file or directory

意思:挂载的目录/文件不存在,或容器里路径写错。

排查:

docker inspect 容器名    # 看 Mounts 部分,核对宿主机路径和容器路径

修法:

  • 宿主机目录不存在 → 先创建(mkdir -p);
  • 路径写错 → 对照 compose 里的 - 宿主机路径:容器路径 格式改;
  • 权限不足 → 检查目录权限,必要时 chmod/chown。

经验:"左边宿主机、右边容器"别写反——左边是你服务器上真实存在的路径,右边是容器内部的路径(容器里没有,Docker 会自动建,但目录不存在时挂载会失败)。

③ 依赖缺失:报 ModuleNotFoundError / command not found

意思:镜像里没有你的应用需要的包/工具。

排查:

docker logs 容器名    # 看报错缺哪个模块

修法:

  • 缺 Python 包 → 把依赖写进 requirements.txt(18 篇 Dockerfile 的 COPY + pip install);
  • 缺系统工具 → 在 Dockerfile 里 RUN apt-get install ...;
  • 改完 Dockerfile 必须重新 build:docker compose up -d --build(25 篇的坑:改代码/依赖不重新 build 不生效)。

经验:依赖改了不重新 build = 白改——容器跑的是镜像里的旧依赖,重启(restart)不重新构建镜像,永远装不上新包。

三、通用排查三步(哪类问题都用得上)

  1. 看状态:docker ps -a——Exited 状态说明挂了,Restarting 说明在反复重启(大概率配置错)。
  2. 看日志:docker logs 容器名——报错原文在这里(28 篇)。
  3. 想改动:最近改了 compose?Dockerfile?代码?(29 篇黄金线索:"最近改了啥")。

经验:三步走完,还没定位就贴日志给 AI(29 篇提问模板)——报错原文 + 环境 + 最近改动,一次解决。

四、避坑清单

  • 别删容器!先看状态:docker ps -a 的 Exited 状态自带原因提示,删了线索就没了(28 篇:先看日志再动手)。
  • 报错贴原文:给 AI 的是 docker logs 的原文,不是"它跑不起来"(29 篇)。
  • 重启 ≠ 修复:改了 Dockerfile/依赖,restart 没用,必须 --build 重新构建。
  • 端口被占先查:ss -tlnp 看谁占着,别直接换个随机端口(可能撞上别的服务)。
  • 挂载目录先创建:mkdir -p 建好再启动,别等报错。

总结

  • 三类问题:端口冲突(bind: address already in use)、路径挂载(no such file or directory)、依赖缺失(ModuleNotFoundError)。
  • 各配一条命令:ss -tlnp / docker inspect / docker logs。
  • 通用三步:docker ps -a 看状态 → docker logs 看日志 → 想"最近改了啥"。
  • 核心心法:认出类型再修;改依赖/代码要重新 --build;先看再删,报错贴原文。

10 分钟小任务:故意制造一个"端口冲突"——把 compose 里端口改成 5000:5000(假设 5000 已被占用),启动看报错,再用 ss -tlnp 和 docker ps 找到"凶手",最后换端口修复。亲手搞挂再亲手修好,比看十篇教程都管用。 下一篇,学 AI 时代的保命课:别把密钥喂给 AI。

下一篇:AI 协作安全:别把密钥喂给 AI,别直接跑看不懂的代码。