You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器问题排查:主机解析失败及数据库不存在报错

问题解答

核心结论

这个错误有可能和Docker网络运行时异常相关,但更直接的原因是容器崩溃导致的数据卷损坏,以及重启后的数据库初始化逻辑限制。

具体分析

  1. Network配置本身无错误,但存在运行时异常可能
    你的docker-compose.yaml中所有服务都加入了自定义桥接网络my-network,理论上服务间可以通过服务名(mariadb)或容器名(container-mariadb-coffee)正常通信,配置本身合规。但如果Docker内置DNS服务(127.0.0.11)运行异常、网络桥接出现故障,会触发lookup no such host的解析错误,这可能是MariaDB容器崩溃的诱因之一。

  2. 重启后找不到数据库的根本原因

    • MariaDB容器崩溃大概率导致./mariadb-data挂载卷中的数据库文件损坏,重启后MariaDB无法识别损坏的库文件,因此抛出unknown database错误。
    • 注意:docker-entrypoint-initdb.d下的初始化脚本仅在容器首次启动、数据卷为空时执行,重启容器不会重新初始化数据库,所以损坏的数据无法自动恢复。

解决方案

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
    
  • 重新构建并启动容器:
    docker-compose down && docker-compose up --build
    
    此时MariaDB会重新执行初始化脚本,重建数据库。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 15:23:13