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

问题描述 投票:0回答:1

在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_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数据库连接工作?

UPDATE

端口暴露后(问题是)我们无法使用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          |
+-----------+---------------+
mysql docker phpstorm
1个回答
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)

© www.soinside.com 2019 - 2024. All rights reserved.