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 部分但无济于事。

要修改的文件是这个:

https://pastebin.com/TPBQNCDZ

我添加了 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 容器指定任何网络,那么它将连接到默认的桥接网络。如果您创建了一个新网络,但没有指定类型——它也将默认为网桥驱动程序。

为了从主机访问容器,您需要:

  1. 将容器连接到主机网络
  2. 或者从桥接网络上的容器,按照上述解决方案中的建议将端口映射到主机。然后,您可以使用 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 监听所有网络接口。