如何从主机访问在Docker容器中运行的MySQL?
如何从主机访问在Docker容器中运行的MySQL?
我已经阅读了一些内容,但是没有一个解决方案对我有效,所以我想看看我在这里做错了什么。我正在尝试运行一个mysql的docker容器,并且尝试从主机访问mysql。我尝试过使用root用户或新用户,也尝试过使用最新版本的mysql,但都没有成功。我在这里做错了什么?非常感谢任何帮助。提前谢谢。
我首先运行以下命令来启动一个容器:
docker run --name mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d mysql/mysql-server:5.7 docker exec -it mysql57 bash mysql -h localhost -u root -p
然后
CREATE USER 'demo_java' IDENTIFIED BY 'java'; grant all on *.* to 'demo_java'@'%' identified by '1234'; FLUSH PRIVILEGES; CREATE DATABASE hello_java CHARACTER SET utf8 COLLATE utf8_general_ci;
当我尝试连接时(注意我在主机的OSX上有一个包含以下代码的main方法):
Class.forName("com.mysql.cj.jdbc.Driver") DriverManager.getConnection("jdbc:mysql://localhost:3306/hello_java", "demo_java", "java")
我得到了以下错误(注意我也尝试过使用root用户和root密码):
Exception in thread "main" java.sql.SQLException: Access denied for user 'demo_java'@'172.17.0.1' (using password: YES) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
问题的原因是因为在创建用户时更改了用户名和密码。首先在创建时设置为:
CREATE USER 'demo_java' IDENTIFIED BY 'java';
但后来进行了覆盖:
grant all on *.* to 'demo_java'@'%' identified by '1234';
请参阅此SO条目了解更多详细信息。
只需从脚本中删除密码更改即可。您应该有类似于以下内容的内容:
CREATE USER 'demo_java' IDENTIFIED BY 'java'; grant all on *.* to 'demo_java'@'%'; FLUSH PRIVILEGES; CREATE DATABASE hello_java CHARACTER SET utf8 COLLATE utf8_general_ci;
然后
DriverManager.getConnection("jdbc:mysql://localhost:3306/hello_java", "demo_java", "java");
应该可以正常工作。
关于以root用户连接,请参阅另一个SO条目,在启动新容器后,默认情况下MySQL存在一些连接限制。如果要以root用户身份连接,需要更改其权限,如下所示:
update mysql.user set host = '%' where user='root';
然后重新启动MySQL容器,您应该也可以以root用户身份连接。