使用docker的mysql镜像,gin后端服务连接数据库失败。
我的配置文件是这样的:(账号、密码、数据库名字都正确)
mysql:
host: 127.0.0.1
port: 3306
database: ideal
username: root
password: 1
我的docker-mysql是这样的:(端口也暴露出来了)
但是还是出现以下错误:
[error] failed to initialize database, got error dial tcp :0: connectex: The requested address is not valid in its context.
解决方式一:进入容器内部查看mysql的授权是否正确。
docker exec -it mysql bash
mysql -uroot -p1 //数据库密码是1
查看mysql的远程连接权限
select host,user,plugin,authentication_string from mysql.user
查看发现是这样的:
其中host为%代表所有ip都可以访问,但是plugin为caching_sha2_password表示mysql登陆时有更繁琐的验证机制(该plugin是在mysql:8.0.3版本后引用的,8.0.4版本成为mysql默认的身份认证插件,具体机制不清楚),而使用mysql_native_password插件,验证方式更为简单。
使用而使用mysql_native_password插件的方式也很简单,可以更改密码来修改这种插件,还可以通过修改默认的mysql配置文件来使用该插件。
在mysql的配置文件中的 [mysql] 模块中加入
default_authentication_plugin=mysql_native_password
然后重启mysql服务就好了。
修改完成后就可以连接成功了!
解决方式二:在docker容器中挂载mysql的数据。
如果遇到不可解决的docker-mysql登录问题,但是docker-mysql中的数据又很重要,必须要登陆上获取数据,那就可以在docker run mysql的时候使用-v来挂载mysql数据到本地。
当docker-mysql登录不上时,可以直接使用docker stop mysql停止容器并使用docker rm mysql 删除容器,然后使用相同的挂载点就可以在新的docker-mysql中获取到原来docker-mysql的数据。
第一步:
docker inspect mysql(容器名) 查看该容器的挂载信息
查看HostConfig挂载配置。
然后再重起一个mysql容器就好了
docker run -d --name=mysql -p 3306:3306 \
-v /e/docker/docker-mysql/data:/var/lib/mysql \
-v /e/docker/docker-mysql/conf/my.cnf:/etc/my.cnf \
-e MYSQL_ROOT_PASSWORD=111 mysql:8.0.31
然后mysql的数据就回来了。