Docker Compose下Golang连接MariaDB失败:连接被拒绝求助
问题排查与解决方案
核心问题:容器网络访问错误
你的Golang服务尝试连接127.0.0.1:3306,但Docker Compose默认网络中每个容器都是独立节点,127.0.0.1指向容器自身而非MariaDB容器,必须通过服务名maria-db访问数据库容器。
具体修复步骤
1. 修正Golang数据库连接逻辑
- 连接字符串需指定MariaDB服务名作为主机,同时明确TCP协议
- 移除错误的
defer db.Close():返回数据库实例后立即关闭会导致调用方拿到已失效的连接
func Connect() (*sql.DB, error) { // 替换为服务名maria-db作为主机地址 db, err := sql.Open("mysql", "root:secret@tcp(maria-db:3306)/s_db") if err != nil { return nil, err } pingErr := db.Ping() if pingErr != nil { return nil, pingErr } return db, nil }
2. 修复Docker Compose配置错误
(1)修正健康检查命令拼写
CMD-SHEL改为CMD-SHELL:
healthcheck: test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 --password=secret --silent"]
(2)修正expose字段用法
expose仅用于容器间端口暴露,只需指定端口号即可,若要对外暴露端口请使用ports字段:
expose: - "3306" # 如需主机直接访问数据库,可添加(可选): # ports: # - "3306:3306"
(3)(可选)添加服务启动依赖
确保API服务在数据库就绪后启动,避免时序问题:
services: api: # 你的API服务配置 depends_on: maria-db: condition: service_healthy
验证方法
- 重启容器:
docker-compose down && docker-compose up -d - 查看API服务日志:
docker-compose logs api,确认连接错误是否消失
内容的提问来源于stack exchange,提问作者YouWontBreakMySoul
相关产品推荐
相关产品推荐

