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可能还没初始化完)。
更稳妥的做法是配合 healthcheck 和 condition: service_healthy:
services:
web:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
retries: 5
四、新手最常踩的四个依赖坑
- 没有自定义网络:默认bridge网络下容器不能通过容器名通信,一定要用
docker network create或Compose自动创建的网络。 - 环境变量拼写错误:比如
MYSQL_ROOT_PASSWORD写成MYSQL_PASSWORD导致数据库启动失败。建议对照官方镜像文档检查。 - 端口映射冲突:宿主机端口被占用时,Docker容器会启动失败。用
docker port <容器>查看实际映射,或用netstat -tlnp | grep <端口>检查宿主机。 - 忘记添加等待脚本:即使
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:3306 或 Redis connection established,说明依赖检查成功。
也可以进入容器手动测试:
docker exec -it <应用容器> mysql -h db -u root -p
输入密码后能正常进入MySQL,就证明依赖链路完全通了。
---
如果你正在处理Docker容器启动失败,如何检查容器依赖,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握了日志查看、网络检查和 depends_on 的正确用法,以后启动任何容器都会顺手很多。