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

Docker Compose部署的Golang容器无法连接MariaDB的3306端口

Golang服务连接Docker内MariaDB失败的解决方案

问题背景

Golang程序无法连接同Docker Compose环境下的MariaDB数据库,但phpMyAdmin可正常访问。Docker Compose配置已提供,Golang容器报错连接127.0.0.1:3306被拒绝,尝试自定义网络未解决问题。

报错信息

panic: dial tcp 127.0.0.1:3306: connect: connection refused api-golang-1

核心原因

Docker Compose默认会为所有服务创建独立网络命名空间,每个容器的127.0.0.1仅指向自身。Golang代码中用127.0.0.1:3306连接数据库,实际访问的是Golang容器自身,而非MariaDB容器。而phpMyAdmin能正常工作,是因为它通过配置PMA_HOST: db,直接用服务名访问MariaDB容器。

解决步骤

  1. 修改Golang数据库连接地址
    将代码中的数据库连接DSN(数据源名称)里的127.0.0.1替换为Docker Compose中MariaDB的服务名db,示例DSN:

    dsn := "root:toor@tcp(db:3306)/your_database_name?charset=utf8mb4&parseTime=True&loc=Local"
    

    确保端口保持3306,用户名、密码与MariaDB的环境变量一致(此处为root/toor)。

  2. 处理数据库启动延迟问题
    depends_on仅保证MariaDB容器先于Golang容器启动,但不确保MariaDB服务已完成初始化并就绪。若Golang启动过快,仍可能连接失败,建议在代码中添加连接重试逻辑:

    var db *sql.DB
    var err error
    maxRetries := 5
    for i := 0; i < maxRetries; i++ {
        db, err = sql.Open("mysql", dsn)
        if err == nil {
            // Ping数据库确认连接有效
            if err = db.Ping(); err == nil {
                break
            }
        }
        time.Sleep(2 * time.Second)
    }
    if err != nil {
        panic(fmt.Sprintf("连接数据库失败: %v", err))
    }
    
  3. 网络配置验证(可选)
    Docker Compose默认会为所有服务创建并加入一个自定义桥接网络,无需额外配置即可通过服务名互通。若之前的自定义网络配置无效,可删除相关配置,使用默认网络即可。


内容的提问来源于stack exchange,提问作者Parmicciano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:05:30