如何从主机访问在Docker容器中运行的MySQL?

12 浏览
0 Comments

如何从主机访问在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)

0
0 Comments

问题的原因是因为在创建用户时更改了用户名和密码。首先在创建时设置为:

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用户身份连接。

0