Docker 容器启动失败,如何检查容器依赖?

前言:容器启动失败,八成是依赖没就绪

刚接触Docker时,容器启动后立刻退出,或者一直报错“连接拒绝”“无法解析主机”——十有八九不是因为程序写错了,而是它所依赖的数据库、Redis、配置中心等外部服务还没准备好。
理解并正确检查容器依赖,是排错的第一步。

一、先看日志:容器为什么没活过来

遇到启动失败,第一反应不是改代码,而是看日志。
运行以下命令:

docker logs <容器名或ID>

如果日志多到刷屏,可以加 --tail 50 只看最后50行。
更精确的做法是带时间戳:

docker logs --since 5m <容器名>     # 只看最近5分钟

日志里常见的依赖相关报错:

  • Connection refused —— 对方端口未监听(典型:数据库没先启动)
  • Cannot resolve host —— 容器间网络不通或名称解析失败
  • dial tcp: lookup xxx on ... no such host —— Docker网络配置问题
  • Error: Failed to connect to ... —— MySQL/Redis等连接超时

二、检查外部依赖服务是否真的在运行

如果你用Docker Compose,服务名就是主机名。
先用 docker ps 确认依赖容器状态:

docker ps -a --filter "name=mysql"

如果依赖容器是Running,但应用容器还是连不上,试试从应用容器内部ping一下:

docker exec -it <应用容器> ping mysql

如果ping不通,检查网络是否在同一自定义网络下:

docker network ls
docker inspect <应用容器> | grep NetworkMode

两个容器必须在同一个网络里(比如 docker-compose.yml 中定义的默认网络)。

三、用docker inspect看清依赖关系

通过 docker inspect 可以拿到容器的详细依赖信息:

docker inspect <容器名> | grep -A 10 "Links"    # 显示链接关系(已废弃但有些旧项目在用)
docker inspect <容器名> | grep -A 5 "NetworkSettings"   # 网络配置

对于Docker Compose项目,最规范的做法是在 docker-compose.yml 中用 depends_on 显式声明依赖顺序:

version: "3"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  db:
    image: mysql:8
  redis:
    image: redis:7

但注意:depends_on 只控制启动顺序,不会等待服务完全就绪(MySQL可能还没初始化完)。
更稳妥的做法是配合 healthcheckcondition: service_healthy

services:
  web:
    depends_on:
      db:
        condition: service_healthy
  db:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      retries: 5

四、新手最常踩的四个依赖坑

  1. 没有自定义网络:默认bridge网络下容器不能通过容器名通信,一定要用 docker network create 或Compose自动创建的网络。
  2. 环境变量拼写错误:比如 MYSQL_ROOT_PASSWORD 写成 MYSQL_PASSWORD 导致数据库启动失败。建议对照官方镜像文档检查。
  3. 端口映射冲突:宿主机端口被占用时,Docker容器会启动失败。用 docker port <容器> 查看实际映射,或用 netstat -tlnp | grep <端口> 检查宿主机。
  4. 忘记添加等待脚本:即使 depends_on 声明了顺序,数据库可能需要5秒才能接受连接。可以写一个 wait-for-it.sh 脚本让应用容器先轮询等待:
./wait-for-it.sh db:3306 --timeout=30 -- echo "数据库就绪"

五、验证容器依赖检查是否生效

做完上述步骤后,重启整个应用栈:

docker-compose down && docker-compose up -d

然后连续查看应用日志:

docker logs -f <应用容器> | head -20

如果看到类似 Connected to MySQL at db:3306Redis connection established,说明依赖检查成功。
也可以进入容器手动测试:

docker exec -it <应用容器> mysql -h db -u root -p

输入密码后能正常进入MySQL,就证明依赖链路完全通了。

---

如果你正在处理Docker容器启动失败,如何检查容器依赖,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握了日志查看、网络检查和 depends_on 的正确用法,以后启动任何容器都会顺手很多。

分享到:
上一篇
用 AI 写 Shell 脚本,导致服务器文件系统损坏
下一篇
服务器被 DDoS 攻击,如何联系运营商协助防护?
1
系统公告

泽御云五一特惠活动🔥

泽御云持证合规运营,资质齐全可查,长久稳定! 五一限时多重福利同步开启: ✅ 香港 2 核 2G 云服务器超值拼团,低价入手团长免费 ✅ 4 核 4G 多机房年付拼团,性价比拉满 ✅ 内蒙古新区限时 7 折(zeyuyunnmg)特惠,专属优惠码锁价续费 ✅ 全站通用 75 折优惠,老用户充值享专属赠金 官方站点:zeyuyun.com 合规资质齐全|售后有保障|活动限时错过不再有
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意