排错与工程习惯
前面几篇讲「怎么建、怎么联调」;本篇是日常口令与边界:构建挂了看哪、连不上库查什么、以及你不能做主时别乱动。
常用命令
docker compose ps # 看服务是否在跑
docker compose logs -f api # 跟日志
docker compose exec api sh # 进容器(镜像无 sh 时换 bash)
docker images # 本机镜像
docker system df # 占了多少磁盘
docker system prune # 清理无用数据(慎用,先看将删什么)
单容器场景把 compose 换成 docker ps / docker logs / docker exec 即可。
排查路径
| 现象 | 先查 |
|---|---|
docker build 失败 | Dockerfile 哪一步报错;依赖清单/锁文件是否进上下文;基础镜像能否拉取 |
| 镜像能建、容器秒退 | logs 看进程退出原因;CMD/ENTRYPOINT 是否写错 |
| 浏览器连不上端口 | -p 是否映射;进程是否监听 0.0.0.0(而非仅容器内想象中的端口) |
| 应用连不上数据库 | Compose 服务名是否写对;端口是否容器端口;是否在等库就绪(见 Compose 篇) |
| 「我本地可以」镜像不行 | 基础镜像主版本、锁文件、.dockerignore 是否漏打进必需文件 |
你不能做主时
- 不改动正在用的基础镜像族,除非有迁移任务
- 本地调试优先:
docker compose/ README 里的 build 参数 - 只想加快安装时,可在 既有 Dockerfile 结构内 换更快安装器,并确认锁文件与缓存仍正确
- 业务 hotfix 里夹带「重写 Dockerfile + 换包管理器」风险极高
工程一致性
镜像标签 + 锁文件 + CI 构建命令 → 三者一致
比追求最新语法更重要:同一 commit 在 CI 打出的标签,应能在预发/生产复现。
要点
ps→logs→exec是默认三连- 构建看层,运行看日志与网络名
- 先跟仓库现有文件,再谈「最优 Dockerfile」
- 标签、锁文件、CI 一致,胜过局部优化
面试速记
- 容器起来又退出怎么查?
docker logs/compose logs看主进程报错;检查 CMD 与依赖是否就绪。 - 如何进入运行中的容器?
docker exec -it <id> sh(或compose exec)。 - 构建很慢从哪优化? 依赖与源码分层、
.dockerignore、合理利用缓存;必要时多阶段。 - 为什么强调锁文件与 CI 一致? 否则「本地/CI/生产」安装出不同依赖树,难复现。
- 磁盘被 Docker 吃满?
docker system df查看;再按团队规范prune(注意别误删尚需缓存)。