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
相关产品推荐
相关产品推荐

