解决docker中mysql无法远程访问的问题

  1. 问题描述:
    (1)使用Dockerfile定制mysql:5.7时,嵌入一个import_sql.sh和xxx.sql用于在启动容器时自动创建一个自定义数据库;
    (2)尝试通过host上的mysql客户端访问container 172.17.0.5上运行的定制mysql,失败。

  2. 可能的原因:
    (1)container内部的mysql配置文件/etc/mysql/mysql.conf.d/mysqld.cnf内容如下:

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

其中# By default we only accept connections from localhost表明mysql服务器默认只接受来自本机的客户端的访问

(2)mysql -u root -p xxx进入mysql容器查看主机-用户-登录方式

select user,host,plugin,authentication_string from mysql.user;
在这里插入图片描述

可见本地的mysql服务器只允许localhost上的root用户以auth_socket(关于auth_socket参见:https://blog.csdn.net/sunset108/article/details/48418107)的方式从客户端访问。这与非定制的mysql:5.7的主机-用户-登录方式表不同:
在这里插入图片描述

可见本地的mysql服务器不仅允许localhost上的root用户以mysql_native_password的方式从客户端访问;而且还允许%即任意主机上的root用户以mysql_native_password的方式从客户端访问。

  1. 解决方法
    (1)首先在build时嵌入一个新的mysqld.cnf,将原本的
#bind-address = 127.0.0.1

修改为:

bind-address = 0.0.0.0

表示允许任何ip上的主机访问
(2)其次在import_sql.sh中添加以下shell命令

mysql -u $dbUser -p $dbPassword -e "create user 'root'@'%' identified by 'password'; grant all on *.* to 'root'@'%'; flush privileges;";

其中dbUser,dbPassword分别代表mysql的登录用户和密码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值