使用Docker创建Mysql镜像时报错connect ECONNREFUSED 127.0.0.1:3306

在使用Docker创建MySQL镜像时遇到connect ECONNREFUSED 127.0.0.1:3306的错误。该问题可能由于系统hosts文件未配置127.0.0.1的主机名,或Docker容器内无用数据卷过多导致。检查hosts文件并确保正确配置,对于Mac OS系统,hosts文件位于/etc/hosts。若问题依然存在,可通过Portainer这个Docker可视化界面来清理无用数据卷,或者直接使用Docker命令行删除数据卷。

使用Docker创建Mysql镜像时报错connect ECONNREFUSED 127.0.0.1:3306

出现这种问题可能有两种情况

系统hosts文件中没有给本地127.0.0.1配置相应的转译host名

  • 首先查看项目数据库配置文件
{
  "username": "******",
  "password": "*******",
  "database": "**********",
  "host": "db",//这里是数据库访问的地址
  "logging": null,
  "dialect": "mysql",
  "dialectOptions": {
    "dateStrings": true,
    "typeCast": true
  },
  "timezone": "+08:00"
}

  • 在查看hosts配置文件
    如果是mac os系统,hosts文件路径在/etx/hosts
    打开文件可以查看地址配置
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       db//添加这条配置,将mysql host与localhost地址对应
127.0.0.1	localhost
255.255.255.255	broadcasthost
::1             localhost

  • 最后重新启动数据库,问题解决

如果问题没有解决,可能是下面的原因

docker容器中的无用数据卷过多需要清理

下载portainer–docker可视化界面,在界面中清理无用数据卷(新手推荐)
  1. 先下载portainer镜像
docker pull portainer/portainer
  1. pull完成后,启动portainer
docker run -d -p 9000:9000 \
    --restart=always \
    -v /var/run/docker.sock:/var/run/docker.sock \
    --name prtainer-test \
    portainer/portainer

  1. 登陆docker本地容器,进行数据卷删除
用指令删除数据卷
docker volume rm $(docker volume ls -q)
### 解决方案 当遇到 `ECONNREFUSED 127.0.0.1:3306` 错误,通常意味着客户端尝试连接到本地运行的 MySQL 数据库实例失败。可能的原因包括但不限于: - **MySQL服务未启动**:确保 MySQL 服务器正在运行。对于使用 XAMPP 的情况,需确认 XAMPP 控制面板中的 MySQL 已经启动[^2]。 - **配置文件错误**:检查用于获取 MySQL 配置信息的方法 `common.GetMysqlFromConsul()` 是否返回了正确的主机地址、端口和其他必要的参数。 - **防火墙设置**:验证操作系统上的防火墙规则是否阻止了对指定端口 (3306) 的访问。 - **Docker网络隔离问题**:如果是基于 Docker 容器的应用程序,则需要注意容器间的网络通信方式。默认情况下,在不同容器之间使用 localhost 或者 127.0.0.1 是不可达的,应该考虑使用桥接模式或者自定义网络来实现跨容器的服务发现和调用[^4]。 针对上述提到的情况,可以采取如下措施来进行排查并解决问题: #### 检查MySQL状态和服务 ```bash sudo systemctl status mysql.service ``` 如果服务处于停止状态,则可以通过命令重启它: ```bash sudo systemctl start mysql.service ``` #### 测试TCP连接 利用 telnet 或 netcat 来测试目标机器上是否有监听在给定端口的服务: ```bash telnet 127.0.0.1 3306 # or nc -zv 127.0.0.1 3306 ``` #### 修改应用程序代码逻辑 为了提高健壮性和便于调试,建议修改原始代码片段以增加更多的日志记录以便更好地理解潜在的问题所在: ```go db, err := gorm.Open(mysql.Open(fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8&parseTime=True&loc=Local", mysqlInfo.User, mysqlInfo.Pwd, fmt.Sprintf("%s:%d", mysqlInfo.Host, mysqlInfo.Port), mysqlInfo.Database)), &gorm.Config{}) if err != nil { log.Fatalf("failed to connect database %v\n", err) } defer db.Close() log.Println("Successfully connected to the database.") ``` 通过这些方法可以帮助定位具体原因,并最终解决 `ECONNREFUSED 127.0.0.1:3306` 连接被拒的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值