PhpStorm - 如何通过 Docker 连接到 MySQL
PhpStorm - How to connect to MySQL via Docker
我正在使用 PhpStorm 2018.3.4、Docker、MySQL 和 Ubuntu。
我尝试使用 Docker 容器 network_mysql
.
配置 MySQL 失败
首先,我试过这个配置:
它给了我这个错误:
然后,我尝试了这个:
这个给了我另一个错误。
我错过了什么吗?还有其他我必须配置的地方吗?
docker ps
输出:
这里 docker network ls
:
对于命令 docker inspect network_mysql
,这里有一个 link 的描述:
https://pastebin.com/9LmeAkc8
这是一个 docker-compose.yml 配置:
https://pastebin.com/DB4Eye4y
我尝试将 - "3306:3306"
添加到 wex_server_proxy
部分但无济于事。
要修改的文件是这个:
我添加了 ports
部分,打开了 3306 端口 :) 然后,它起作用了。
解决方案
我注意到您没有映射 mysql 容器端口。如果这样做,您会从 docker ps
命令中看到:
... 0.0.0.0:3306->3306/tcp network_mysql
容器 network_mysql
连接到名为 tmp_wex_net
的网桥类型网络。这意味着无法通过容器名称从主机访问容器。
看来您正在为堆栈使用 docker-compose.yml 定义。为了能够从主机访问容器,您需要使用此容器的撰写定义的 ports
部分:
serivces:
mysql:
...
ports:
- "3306:3306"
...
如果您从 docker run
开始,那么您可以使用以下方法完成同样的事情:
docker run -p 3306:3306 --name network_mysql --network="tmp_wex_net" -d mysql
然后在 PHPStorm 的连接设置的主机名中使用 localhost
。像这样:
Host: localhost
Port: 3306
Database: network
问题
您无法连接的原因是,您在连接设置中指定的主机名 network_mysql
没有解析为您的机器知道的任何主机。
docker 容器的容器名称不是 docker 主机可以解析的 DNS 名称。
如果您没有为您的 mysql 容器指定任何网络,那么它将连接到默认的桥接网络。如果您创建了一个新网络,但没有指定类型——它也将默认为网桥驱动程序。
为了从主机访问容器,您需要:
- 将容器连接到主机网络
- 或者从桥接网络上的容器,按照上述解决方案中的建议将端口映射到主机。然后,您可以使用
localhost:<portnum>
从主机寻址该容器上的特定映射端口。
我的解决方案:
我将端口从本地主机转发到远程:ssh -R 3306:localhost:3306 root@remote_host_ip
并且连接成功。
对于在 docker 图像中手动设置 mysql 的每个人:
您可能必须配置 mysql 以接受来自 docker creates/uses 与主机通信(以及端口转发)的网络接口的传入连接。
在我的例子中,我将以下内容添加到 /etc/mysql/my.cnf
到文件末尾:
[mysqld]
bind-address = 0.0.0.0
mysql 监听所有网络接口。
我正在使用 PhpStorm 2018.3.4、Docker、MySQL 和 Ubuntu。
我尝试使用 Docker 容器 network_mysql
.
首先,我试过这个配置:
它给了我这个错误:
然后,我尝试了这个:
这个给了我另一个错误。
我错过了什么吗?还有其他我必须配置的地方吗?
docker ps
输出:
这里 docker network ls
:
对于命令 docker inspect network_mysql
,这里有一个 link 的描述:
https://pastebin.com/9LmeAkc8
这是一个 docker-compose.yml 配置: https://pastebin.com/DB4Eye4y
我尝试将 - "3306:3306"
添加到 wex_server_proxy
部分但无济于事。
要修改的文件是这个:
我添加了 ports
部分,打开了 3306 端口 :) 然后,它起作用了。
解决方案
我注意到您没有映射 mysql 容器端口。如果这样做,您会从 docker ps
命令中看到:
... 0.0.0.0:3306->3306/tcp network_mysql
容器 network_mysql
连接到名为 tmp_wex_net
的网桥类型网络。这意味着无法通过容器名称从主机访问容器。
看来您正在为堆栈使用 docker-compose.yml 定义。为了能够从主机访问容器,您需要使用此容器的撰写定义的 ports
部分:
serivces:
mysql:
...
ports:
- "3306:3306"
...
如果您从 docker run
开始,那么您可以使用以下方法完成同样的事情:
docker run -p 3306:3306 --name network_mysql --network="tmp_wex_net" -d mysql
然后在 PHPStorm 的连接设置的主机名中使用 localhost
。像这样:
Host: localhost
Port: 3306
Database: network
问题
您无法连接的原因是,您在连接设置中指定的主机名 network_mysql
没有解析为您的机器知道的任何主机。
docker 容器的容器名称不是 docker 主机可以解析的 DNS 名称。
如果您没有为您的 mysql 容器指定任何网络,那么它将连接到默认的桥接网络。如果您创建了一个新网络,但没有指定类型——它也将默认为网桥驱动程序。
为了从主机访问容器,您需要:
- 将容器连接到主机网络
- 或者从桥接网络上的容器,按照上述解决方案中的建议将端口映射到主机。然后,您可以使用
localhost:<portnum>
从主机寻址该容器上的特定映射端口。
我的解决方案:
我将端口从本地主机转发到远程:ssh -R 3306:localhost:3306 root@remote_host_ip
并且连接成功。
对于在 docker 图像中手动设置 mysql 的每个人:
您可能必须配置 mysql 以接受来自 docker creates/uses 与主机通信(以及端口转发)的网络接口的传入连接。
在我的例子中,我将以下内容添加到 /etc/mysql/my.cnf
到文件末尾:
[mysqld]
bind-address = 0.0.0.0
mysql 监听所有网络接口。