Docker-无法连接到MySQL实例。如何解决?

时间:2019-04-18 17:51:34

标签: mysql docker phpstorm

在MAC OS中运行。

在这些Basic Steps for MySQL Server Deployment with Docker之后,我试图通过php Storm数据库与容器建立连接。

我在图片中看到以下错误:

enter image description here

我可以通过终端访问它:

docker exec -it 0ed bash
bash-4.2# mysql -uroot -pdockerLocal
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 47
Server version: 5.7.25 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

端口3306中没有正在运行的进程。netstat -vanp tcp | grep 3306什么也不显示。

我的Laravel也无法连接到db服务器。

DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=testdb
DB_USERNAME=root
DB_PASSWORD=dockerLocal

这是容器信息:

docker ps -a
CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS                    PORTS                 NAMES
0edce223c684        mysql/mysql-server:5.7   "/entrypoint.sh mysq…"   34 minutes ago      Up 34 minutes (healthy)   3306/tcp, 33060/tcp   stupefied_johnson

如何测试此连接以及如何使phpstorm db连接正常工作?

更新

暴露端口后(这是问题所在),我们无法使用root@localhost连接到容器。

SELECT host, user FROM mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+

这是错误:

Connection to @0.0.0.0 failed.
            [HY000][1130] null,  message from server: "Host '172.17.0.1' is not allowed to connect to this MySQL server"

解决方案在此post中。

Check if the database user exists and can connect
In MySQL, each database user is defined with IP address in it, so you can have for example a root user allowed to connect from localhost (127.0.0.1) but not from other IP addresses. With a container, you never access to the database from 127.0.0.1, it could explain the problem.

简而言之,如果我这样做,它就可以工作:

CREATE USER 'jerry'@'%' IDENTIFIED BY 'jerrypassword';
SELECT host, user FROM mysql.user;
+-----------+---------------+
| host      | user          |
+-----------+---------------+
| %         | jerry         |
| localhost | healthchecker |
| localhost | mysql.session |
| localhost | mysql.sys     |
| localhost | root          |
+-----------+---------------+

1 个答案:

答案 0 :(得分:4)

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

代替

docker run --name=mysql1 -d mysql/mysql-server:tag

docker run --name=mysql1 -p 3306:3306 -d mysql/mysql-server:tag 

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

您将可以通过localhost:3306

进行连接

参考:Docker Run -- Publish or expose port (-p, --expose)