java.sql.SQLException 在更改 UFW 设置后连接到 Docker 中的 MySQL

java.sql.SQLException when connecting to MySQL in Docker after changing UFW settings

下面是我的代码的一部分,它是 运行 在 Docker 容器中。我之前已经创建了变量。

String mysqlUrl = "jdbc:mysql://" + mysqlHost + "/" + mysqlDatabase + "?user=" + mysqlUser + "&password=" + mysqlPass;
try {
    mysqlConnection = DriverManager.getConnection(mysqlUrl);
} catch (SQLException e) {
    e.printStackTrace();
}

错误如下:

java.sql.SQLException: Access denied for user 'myusername'@'_gateway' (using password: YES)

让我解释一下我做了什么:

我的代码运行得非常好。但是,在我对 UFW 设置进行了一些更改,告诉 UFW 管理对所有 Docker 容器的传入请求后,发生了该错误。我按照这个答案修改了 UFW 设置:.

我已经尝试过的事情:

我已经打开了 UFW 端口 3306。我可以确认我的 MySQL 用户名和密码是正确的,我的数据库接受来自所有 IP 地址的远程连接。

bind-address = 0.0.0.0

MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE Host <> '';
+-----------------+-----------+
| User            | Host      |
+-----------------+-----------+
| myusername      | %         |
| root            | localhost |
+-----------------+-----------+
2 rows in set (0.001 sec)

我可以确认我的 Docker 容器可以访问外部互联网,因为它可以向 google.com 发送请求,并且可以响应来自 ping 工具和状态监视器的请求。

请帮助解释为什么我的代码无法连接到 Docker 之外的 MySQL 数据库,我该如何解决这个问题。非常感谢。

像下面这样指定端口号后,我的代码就可以工作了。我以为端口号是可选的。

String mysqlUrl = "jdbc:mysql://" + mysqlHost + ":3306/" + mysqlDatabase + "?user=" + mysqlUser + "&password=" + mysqlPass;
try {
    mysqlConnection = DriverManager.getConnection(mysqlUrl);
} catch (SQLException e) {
    e.printStackTrace();
}