Docker容器问题排查:主机解析失败及数据库不存在报错
问题解答
核心结论
这个错误有可能和Docker网络运行时异常相关,但更直接的原因是容器崩溃导致的数据卷损坏,以及重启后的数据库初始化逻辑限制。
具体分析
Network配置本身无错误,但存在运行时异常可能
你的docker-compose.yaml中所有服务都加入了自定义桥接网络my-network,理论上服务间可以通过服务名(mariadb)或容器名(container-mariadb-coffee)正常通信,配置本身合规。但如果Docker内置DNS服务(127.0.0.11)运行异常、网络桥接出现故障,会触发lookup no such host的解析错误,这可能是MariaDB容器崩溃的诱因之一。重启后找不到数据库的根本原因
- MariaDB容器崩溃大概率导致
./mariadb-data挂载卷中的数据库文件损坏,重启后MariaDB无法识别损坏的库文件,因此抛出unknown database错误。 - 注意:
docker-entrypoint-initdb.d下的初始化脚本仅在容器首次启动、数据卷为空时执行,重启容器不会重新初始化数据库,所以损坏的数据无法自动恢复。
- MariaDB容器崩溃大概率导致
解决方案
1. 排查并修复网络问题
- 重启Docker守护进程:
# Linux systemctl restart docker # Windows/macOS:直接重启Docker Desktop应用 - 验证容器间连通性:进入
coffee-api容器,测试DNS解析和连通性docker exec -it container-coffeeapi ping mariadb # 或 ping container-mariadb-coffee
2. 修复损坏的数据库数据
- 先备份现有数据卷(避免彻底丢失数据):
cp -r ./mariadb-data ./mariadb-data-backup - 删除损坏的数据卷目录:
rm -rf ./mariadb-data - 重新构建并启动容器:
此时MariaDB会重新执行初始化脚本,重建数据库。docker-compose down && docker-compose up --build
3. 优化配置避免后续问题
- 改用服务名通信:不要依赖容器名
container-mariadb-coffee,改用compose默认的服务名mariadb作为数据库连接地址,服务名的DNS解析更稳定。 - 添加健康检查:确保MariaDB完全就绪后再启动
coffee-api,避免API服务连接未就绪的数据库:# 在mariadb服务中添加健康检查 mariadb: container_name: container-mariadb-coffee build: context: . dockerfile: Dockerfile-mariadb ports: - "3306:3306" volumes: - ./mariadb-data:/var/lib/mysql networks: - my-network healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-pmypass"] interval: 5s timeout: 5s retries: 5 # 在coffee-api中添加依赖条件 coffee-api: container_name: container-coffeeapi environment: - TZ=America/Sao_Paulo build: context: . dockerfile: Dockerfile-go ports: - "8081:8081" volumes: - ./errorLogs:/app/errorLogs networks: - my-network depends_on: mariadb: condition: service_healthy - 定期备份数据卷:定期备份
./mariadb-data目录,防止数据损坏或丢失。
内容的提问来源于stack exchange,提问作者mateusj
相关产品推荐
相关产品推荐

