【发布时间】:2021-12-27 16:50:58
【问题描述】:
我试图在 MacOs 上本地运行我的 Java 微服务并连接到在 Docker 容器中运行的 MySQL db,但出现错误:
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.
我的 docker-compose.yml 看起来像这样:
version: "3.1"
services:
mysql:
image: mysql
container_name: mysql_v.0.1
command: --default-authentication-plugin=mysql_native_password
restart: always
env_file:
- .mysql-dev-env
ports:
- 33060:33060
但是我能够连接到 mysql 并通过 docker 本身创建 dbs:
docker exec -it mysql_v.0.1
mysql -u root -p
微服务有这样的 application.dev.yml 配置:
db:
pool.size.maximum: 30
connection.idle.minimum: 10
widget:
url: jdbc:mysql://localhost:33060/dev_widget_platform?characterEncoding=UTF-8&useUnicode=yes&autoReconnect=true
user: root
password: pass
我正在尝试通过 MySQL Workbench 连接到 db,它也没有成功。 似乎我需要应用一些网络技巧,但我是 docker 和 MySQl 的新手。
【问题讨论】:
-
你能检查一下 docker 容器是否真的在你主机上的 33060 端口上监听,比如
netstat -anp | grep 33060甚至telnet 33060(但不确定它们是否在 macos 上工作)?您也可以查看docker inspect mysql_v.0.1以查看容器的端口映射,这可能会有所帮助.. -
docker inspect mysql_v.0.1 带入 "NetworkSettings": "Ports": { "3306/tcp": null, "33060/tcp": [ { "HostIp": "0.0.0.0", “主机端口”:“33060”}]}
-
您的
ports:将主机端口33060 转发到容器端口33060,但该容器端口上没有任何监听; MySQL 容器将始终侦听默认端口 3306。尝试使用标准端口作为第二个端口号更改ports: ['33060:3306']。 -
我按照您的建议进行了更改,但仍然无法正常工作。现在我的 NetworkSettings: "Ports": { "3306/tcp": [ { "HostIp": "0.0.0.0", "HostPort": "33060" } ], "33060/tcp": null } 看起来我在做出了什么问题
-
你能显示 env_file: .mysql-dev-env,看来你应该配置:MYSQL_ROOT_HOST: '%'。配置接受来自远程服务器/客户端的连接