Docker - 无法连接到 MySQL 实例。怎么解决呢?

zwi*_*ion 4 mysql phpstorm docker

在 MAC 操作系统中运行。

\n

按照使用 Docker 进行 MySQL 服务器部署的这些基本步骤,我尝试通过 phpstorm 数据库与容器建立连接。

\n

我收到图片中的错误:

\n

在此输入图像描述

\n

我可以通过终端访问它:

\n
docker exec -it 0ed bash\nbash-4.2# mysql -uroot -pdockerLocal\nmysql: [Warning] Using a password on the command line interface can be insecure.\nWelcome to the MySQL monitor.  Commands end with ; or \\g.\nYour MySQL connection id is 47\nServer version: 5.7.25 MySQL Community Server (GPL)\n\nCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.\n\nOracle is a registered trademark of Oracle Corporation and/or its\naffiliates. Other names may be trademarks of their respective\nowners.\n\nType \'help;\' or \'\\h\' for help. Type \'\\c\' to clear the current input statement.\nmysql> show databases;\n+--------------------+\n| Database           |\n+--------------------+\n| information_schema |\n| mysql              |\n| performance_schema |\n| sys                |\n| testdb             |\n+--------------------+\n5 rows in set (0.00 sec)\n\nmysql> \n
Run Code Online (Sandbox Code Playgroud)\n

端口 3306 上没有进程正在运行netstat -vanp tcp | grep 3306。没有显示任何内容。

\n

我的 Laravel 也无法连接到数据库服务器。

\n
DB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=testdb\nDB_USERNAME=root\nDB_PASSWORD=dockerLocal\n
Run Code Online (Sandbox Code Playgroud)\n

这是容器信息:

\n
docker ps -a\nCONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS                 NAMES\n0edce223c684        mysql/mysql-server:5.7   "/entrypoint.sh mysq\xe2\x80\xa6"   34 minutes ago      Up 34 minutes (healthy)   3306/tcp, 33060/tcp   stupefied_johnson\n
Run Code Online (Sandbox Code Playgroud)\n

我如何测试这个连接以及如何让 phpstorm 数据库连接正常工作?

\n

更新

\n

端口暴露后(这就是问题所在),我们无法使用root@localhost.

\n
SELECT host, user FROM mysql.user;\n+-----------+---------------+\n| host      | user          |\n+-----------+---------------+\n| localhost | healthchecker |\n| localhost | mysql.session |\n| localhost | mysql.sys     |\n| localhost | root          |\n+-----------+---------------+\n
Run Code Online (Sandbox Code Playgroud)\n

这是错误:

\n
Connection to @0.0.0.0 failed.\n            [HY000][1130] null,  message from server: "Host \'172.17.0.1\' is not allowed to connect to this MySQL server"\n
Run Code Online (Sandbox Code Playgroud)\n

解决方案就在这篇文章中。

\n
\n

检查数据库用户是否存在并且可以连接

\n

在 MySQL 中,每个数据库用户都定义有 IP 地址,因此您可以允许 root 用户从本地主机 (127.0.0.1) 连接,但不能从其他 IP 地址连接。使用容器,您永远不会从127.0.0.1访问数据库,这可以解释问题。

\n
\n

简而言之,如果我这样做,它就会起作用:

\n
CREATE USER \'jerry\'@\'%\' IDENTIFIED BY \'jerrypassword\';\nSELECT host, user FROM mysql.user;\n+-----------+---------------+\n| host      | user          |\n+-----------+---------------+\n| %         | jerry         |\n| localhost | healthchecker |\n| localhost | mysql.session |\n| localhost | mysql.sys     |\n| localhost | root          |\n+-----------+---------------+\n
Run Code Online (Sandbox Code Playgroud)\n

Jus*_*ard 6

您需要将容器端口绑定到主机。

而不是做

docker run --name=mysql1 -d mysql/mysql-server:tag
Run Code Online (Sandbox Code Playgroud)

docker run --name=mysql1 -p 3306:3306 -d mysql/mysql-server:tag 
Run Code Online (Sandbox Code Playgroud)

这会将容器的端口 3306 绑定到主机 127.0.0.1 上的端口 3306。

然后您将能够通过以下方式连接localhost:3306

参考:Docker Run - 发布或公开端口(-p,--expose)