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

Docker容器连接报错:Unknown MySQL server host问题求助

解决Docker容器间MariaDB连接失败问题

问题根源

报错2005 (HY000): Unknown MySQL server host主要来自两个核心原因:

  • 服务启动顺序问题:depends_on仅确保weather_db容器先启动,但不保证MariaDB服务完全就绪并可接受连接,Python应用可能在数据库初始化完成前就发起连接。
  • 偶发网络解析问题:虽然Docker Compose默认会为所有服务创建并加入同一自定义网络,但极端情况下可能出现服务名解析延迟。

具体修复步骤

1. 为数据库添加健康检查,确保就绪后启动应用

修改docker-compose.yml,为weather_db配置健康检查,让countries_states仅在数据库真正就绪后再启动:

version: '3'
services:
  weather_db:
    build:
      context: .
      dockerfile: Dockerfile-mariadb
    image: favargasc/weather:latest
    container_name: weather_db
    ports:
      - "3306:3306"
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "admin", "-p2664"]
      interval: 5s
      timeout: 5s
      retries: 5

  countries_states:
    build:
      context: .
      dockerfile: Dockerfile-countries_states
    image: favargasc/countries_states:latest
    container_name: countries_states
    depends_on:
      weather_db:
        condition: service_healthy

2. 在Python代码中添加重试逻辑

即使有健康检查,也建议在应用侧添加重试机制,避免偶发的连接失败:

import mysql.connector as mysql
import sys
import time

def main():
    max_retries = 5
    retry_delay = 3
    cnx = None

    for attempt in range(max_retries):
        try:
            print(f"Attempting to connect to MariaDB (attempt {attempt+1}/{max_retries})...")
            cnx = mysql.connect(
                user='admin',
                password='2664',
                host='weather_db',
                port=3306,
                database='weather'
            )
            print("Successfully connected to MariaDB!")
            break
        except mysql.Error as e:
            print(f"Connection failed: {e}")
            if attempt < max_retries -1:
                time.sleep(retry_delay)
            else:
                print("All connection attempts failed.")
                sys.exit(1)

    if cnx:
        cur = cnx.cursor()
        cnx.close()

main()

3. 排查网络连通性(可选)

如果以上修复仍无效,可手动验证容器间网络:

  • 进入countries_states容器:docker exec -it countries_states bash
  • 尝试ping数据库服务名:ping weather_db,如果能ping通,说明网络解析正常;如果不通,检查是否有自定义网络配置冲突。

额外注意事项

  • 确保init.sql文件存在且语法正确,避免数据库初始化失败导致服务无法就绪。
  • 同一Docker Compose项目中的服务默认通过服务名互相访问,无需手动配置IP或额外网络规则。

内容的提问来源于stack exchange,提问作者Fabián Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:05:29