首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将码头容器连接到远程MySQL数据库

将码头容器连接到远程MySQL数据库
EN

Stack Overflow用户
提问于 2018-02-07 20:51:59
回答 2查看 12.1K关注 0票数 3

我正在运行Docker的Windows 10环境中并行开发Laravel和遗留PHP应用程序。对于遗留的PHP应用程序,我想将开发转移到Docker容器中,但是,我似乎无法让PHP应用程序连接到本地网络上另一个Ubuntu服务器上的MySQL数据库。我使用Laradock来简化对接器容器映像,并为这种类型的开发环境设置。

这是我的装置:

  • Windows 10主机(IP: 172.19.0.200) -- MySQL服务器没有在本地安装
  • Ubuntu MySQL服务器(IP: 172.19.0.16)
  • TeamSQL (MySQL客户端)

Windows上cmd控制台中的ipconfig结果:

代码语言:javascript
复制
Ethernet adapter vEthernet (Default Switch):

Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::7ce7:47d:7b91:84a8%9
IPv4 Address. . . . . . . . . . . : 172.31.215.177
Subnet Mask . . . . . . . . . . . : 255.255.255.240
Default Gateway . . . . . . . . . :

Ethernet adapter vEthernet (DockerNAT):

Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::8cc5:621:daba:48e3%4
IPv4 Address. . . . . . . . . . . : 10.0.75.1
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . :

Ethernet adapter Local Area Connection:

Connection-specific DNS Suffix  . :
Link-local IPv6 Address . . . . . : fe80::71fc:9102:366c:fb7d%15
IPv4 Address. . . . . . . . . . . : 172.19.0.200
Subnet Mask . . . . . . . . . . . : 255.255.0.0
Default Gateway . . . . . . . . . : 172.19.0.254

Ubuntu服务器上的ufw status结果(显示防火墙规则):

代码语言:javascript
复制
To                         Action      From
--                         ------      ----
22                         ALLOW       172.19.0.0/24
3306                       ALLOW       172.19.0.0/24
80                         ALLOW       172.19.0.0/24
80                         ALLOW       10.0.75.0/24
3306                       ALLOW       10.0.75.0/24
80                         ALLOW       172.20.0.0/24
3306                       ALLOW       172.20.0.0/24

Ubuntu select host, user from mysql.user查询的结果:

代码语言:javascript
复制
+----------------+------------------+
| host           | user             |
+----------------+------------------+
| %              | root             |
| 10.0.2.2       | root             |
| 10.0.75.1      | root             |
| 127.0.0.1      | root             |
| 172.19.0.%     | root             |
| 172.19.0.15    | root             |
| 172.19.0.16    | root             |
| 172.19.0.200   | root             |
| 172.19.0.65    | root             |
| 172.20.0.1     | root             |
| 172.20.0.6     | root             |
| 172.31.215.177 | root             |
| localhost      | root             |
+----------------+------------------+

我可以使用以下连接参数使用MySQL从Windows 10系统连接到Ubuntu MySQL实例:

代码语言:javascript
复制
Host: 172.19.0.16
Post: 3306
User: root
Password: thisisasamplepassword

因此,我知道至少允许来自Windows的连接,并且凭据可以工作。

但是,我无法使用此连接字符串从Docker容器中的遗留PHP应用程序连接:

代码语言:javascript
复制
$dbHost = "172.19.0.16"
$dbPort = "3306"
$dbName = "databasename"
$dbUser = "root"
$dbPassword = "thisisasamplepassword"

$connectionString = "mysql:host=$dbHost;port=$dbPort;dbname=$dbName;
$instance = new PDO($connectionString, $dbUser, $dbPassword);

当我使用这些信息时,我会收到一个SQLSTATE[HY000] [2002] Connection timed out错误。因此,在我的挖掘中,我发现这篇文章使用PuTTY通过SSH隧道将Ubuntu MySQL服务器的端口转发到我的Windows 10主机。我的想法是,如果我可以将Ubuntu MySQL端口转发到我的Windows 10端口,然后从Docker连接到我的Windows 10端口(因为Windows 10是主机),那么也许我可以让连接正常工作。我浏览了该教程,打开了TeamSQL,并按照文章的建议切换了信息:

代码语言:javascript
复制
Host: 127.0.0.1
Post: 3306
User: root
Password: thisisasamplepassword

我收到一个“连接丢失:服务器关闭连接”错误。我想这一定是防火墙的问题,所以我关闭了,但仍然没有TeamSQL的运气,但我决定在PHP应用程序中尝试。

我将PHP应用程序的详细信息更改为:

代码语言:javascript
复制
$dbHost = "127.0.0.1"
$dbPort = "3306"
$dbName = "databasename"
$dbUser = "root"
$dbPassword = "thisisasamplepassword"

现在,当我试图连接时,我会收到一个SQLSTATE[HY000] [2002] Connection refused错误。

我在这个问题上做了一段几乎令人尴尬的工作。在这一点上,我真的不在乎它是否是面部表情式的答案,我只是想让它发挥作用。当我在Windows上使用XAMPP时,我的PHP应用程序和Ubuntu MySQL服务器之间的连接是有效的,但是我试图通过使用Docker来缩小本地开发环境和产品开发环境之间的差距。这就是转换背后的想法。

对如何解决这个问题有什么想法吗?提前谢谢。

编辑

绑定地址已设置为0.0.0.0,如此查询show global variables like 'bind_address';所示

代码语言:javascript
复制
+---------------+---------+
| Variable_name | Value   |
+---------------+---------+
| bind_address  | 0.0.0.0 |
+---------------+---------+
1 row in set (0.00 sec)

来自nginx容器内的ifconfig的结果:

代码语言:javascript
复制
eth0  Link encap:Ethernet  HWaddr 02:42:AC:14:00:04
      inet addr:172.20.0.4  Bcast:172.20.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:612 errors:0 dropped:0 overruns:0 frame:0
      TX packets:484 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:136633 (133.4 KiB)  TX bytes:98603 (96.2 KiB)

eth1  Link encap:Ethernet  HWaddr 02:42:AC:13:00:03
      inet addr:172.19.0.3  Bcast:172.19.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:156 errors:0 dropped:0 overruns:0 frame:0
      TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:9832 (9.6 KiB)  TX bytes:0 (0.0 B)

lo    Link encap:Local Loopback
      inet addr:127.0.0.1  Mask:255.0.0.0
      UP LOOPBACK RUNNING  MTU:65536  Metric:1
      RX packets:4 errors:0 dropped:0 overruns:0 frame:0
      TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1
      RX bytes:235 (235.0 B)  TX bytes:235 (235.0 B)

编辑2

使用@Canis的建议,我执行了以下命令:

代码语言:javascript
复制
docker network create --driver=bridge --subnet=192.168.0.0/16 br0
docker network connect br0 laradock_nginx_1

我仍然无法访问Ubuntu MySQL容器。以下是ifconfig当前的结果

代码语言:javascript
复制
eth0  Link encap:Ethernet  HWaddr 02:42:C0:A8:00:02
      inet addr:192.168.0.2  Bcast:192.168.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:25 errors:0 dropped:0 overruns:0 frame:0
      TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:2154 (2.1 KiB)  TX bytes:1209 (1.1 KiB)

eth1  Link encap:Ethernet  HWaddr 02:42:AC:13:00:03
      inet addr:172.19.0.3  Bcast:172.19.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:12 errors:0 dropped:0 overruns:0 frame:0
      TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:928 (928.0 B)  TX bytes:252 (252.0 B)

eth2  Link encap:Ethernet  HWaddr 02:42:AC:14:00:04
      inet addr:172.20.0.4  Bcast:172.20.255.255  Mask:255.255.0.0
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:21 errors:0 dropped:0 overruns:0 frame:0
      TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:3330 (3.2 KiB)  TX bytes:1394 (1.3 KiB)

lo    Link encap:Local Loopback
      inet addr:127.0.0.1  Mask:255.0.0.0
      UP LOOPBACK RUNNING  MTU:65536  Metric:1
      RX packets:12 errors:0 dropped:0 overruns:0 frame:0
      TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1
      RX bytes:1131 (1.1 KiB)  TX bytes:1131 (1.1 KiB)

看起来eth1和eth2仍然在使用可能冲突的IP地址。不过,我不知道怎么从这里开始。有什么想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-07 21:39:32

码头容器内的内部ip网络与外部ip网络重叠,或者设置为host。如果未设置为host,则使得Linux主机内部的路由尝试在本地查找该资源,而不是将请求发送到internet上。

尝试更改容器的网络,如下所示:

代码语言:javascript
复制
docker network create --driver=bridge --subnet=192.168.0.0/16 br0
docker network connect br0 your-nginx-container

记住用your-nginx-container代替正在运行的容器的实际名称。如果使用docker create创建容器,可以通过添加--network=br0来指定要使用的网络桥,其中br0是我们在上面的docker network create命令中使用的名称。

编辑

在看到您最新的ifconfig后,我建议您尝试删除其他网络。你能看到这个命令有什么效果吗?它应该从容器中删除host网络驱动程序,希望同时删除这两个接口。

代码语言:javascript
复制
docker network disconnect host laradock_nginx_1
票数 0
EN

Stack Overflow用户

发布于 2018-07-31 16:49:12

我用我的主机ip或网络在laradock .env文件中解决了这个设置.env(两者都为我工作)。

代码语言:javascript
复制
DOCKER_HOST_IP=172.16.4.1

希望能帮助别人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48673027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档