在MAC OS中运行。
在这些Basic Steps for MySQL Server Deployment with Docker之后,我试图通过php Storm数据库与容器建立连接。
我在图片中看到以下错误:
我可以通过终端访问它:
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 |
+-----------+---------------+
答案 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