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容器。
解决步骤
修改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)。处理数据库启动延迟问题
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)) }网络配置验证(可选)
Docker Compose默认会为所有服务创建并加入一个自定义桥接网络,无需额外配置即可通过服务名互通。若之前的自定义网络配置无效,可删除相关配置,使用默认网络即可。
内容的提问来源于stack exchange,提问作者Parmicciano
相关产品推荐
相关产品推荐

