无法远程连接到Docker中的MySQL数据库

5
在我的AWS ec2服务器上,我已安装docker 1.9.1。在基于ubuntu:trusty官方docker镜像的图像test_image中,我尝试设置LEMP(Linux,Nginx,MySQL,PHP)架构。
以下是我使用的docker命令来启动容器:
docker run --name test_1 -d -p 80:80 -p 3306:3306 test_image /bin/sh -c "while true; do echo daemonized docker container; sleep 5000; done"

我已经将端口803306暴露给主机网络接口,并允许AWS安全组允许入站连接到这些端口。安全组中的连接类型为:MYSQL/Aurora,协议为:TCP(我知道这不是很安全,只是为了初始实现。生产设置将有所不同)。
我按照DigitalOcean的教程进行操作:https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-14-04 在安装Nginx并启动后,我可以通过ec2的公共IP在浏览器中测试它,即http://xxx.xxx.xxx.xxx显示默认的nginx欢迎页面。
在安装MySQL时,我在docker容器中遵循以下命令:
apt-get install mysql-server
mysql_install_db
/etc/init.d/mysql start
mysql_secure_installation

我已经为我的root用户设置了密码,并且在执行mysql_secure_installation期间允许远程访问root用户。

从容器内部执行命令mysql -u root -p可以连接到mysql数据库,但无法从容器外部连接。

也尝试了从本地机器使用mysql-client进行连接: mysql -h xxx.xxx.xxx.xxx -u root -p

但是出现以下错误:ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.xxx' (111)

还通过mysql workbench尝试连接,但仍无法连接到mysql数据库。

我做错了什么?

1个回答

7
在您的主机mysql的my.cnf中将绑定地址设置为0.0.0.0,以便mysql在所有网络接口上都可以监听。
bind-address = 0.0.0.0

默认配置如下:
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address   = 127.0.0.1

我尝试了你的解决方案。我仍然无法连接,但是在我的本地机器上mysql-client的错误消息已更改为:ERROR 1130 (HY000): Host 'yyy.yyy.yyy.yyy' is not allowed to connect to this MySQL server. 'yyy.yyy.yyy.yyy' 是我的本地公共IP地址。而在ec2主机上,现在是:ERROR 1130 (HY000): Host 'ip-zzz-zzz-zzz-zzz.ec2.internal' is not allowed to connect to this MySQL server - Surender Thakran
你必须授予机器访问权限:GRANT ALL PRIVILEGES ON database.* TO 'user'@'yourremotehost' IDENTIFIED BY 'newpassword'; 这篇文章也很有帮助:SO - molivier
之前的命令允许特定IP地址@remoteIP的用户。要允许所有远程IP的root用户,请使用以下命令:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password'; - molivier
或者说远程主机被授予使用root用户连接的特权。 - Surender Thakran
1
你说得对!这不是默认行为,因为存在安全问题。 - molivier
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接