我正在运行Docker的Windows 10环境中并行开发Laravel和遗留PHP应用程序。对于遗留的PHP应用程序,我想将开发转移到Docker容器中,但是,我似乎无法让PHP应用程序连接到本地网络上另一个Ubuntu服务器上的MySQL数据库。我使用Laradock来简化对接器容器映像,并为这种类型的开发环境设置。
这是我的装置:
Windows上cmd控制台中的ipconfig结果:
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.254Ubuntu服务器上的ufw status结果(显示防火墙规则):
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/24Ubuntu select host, user from mysql.user查询的结果:
+----------------+------------------+
| 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实例:
Host: 172.19.0.16
Post: 3306
User: root
Password: thisisasamplepassword因此,我知道至少允许来自Windows的连接,并且凭据可以工作。
但是,我无法使用此连接字符串从Docker容器中的遗留PHP应用程序连接:
$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,并按照文章的建议切换了信息:
Host: 127.0.0.1
Post: 3306
User: root
Password: thisisasamplepassword我收到一个“连接丢失:服务器关闭连接”错误。我想这一定是防火墙的问题,所以我关闭了,但仍然没有TeamSQL的运气,但我决定在PHP应用程序中尝试。
我将PHP应用程序的详细信息更改为:
$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';所示
+---------------+---------+
| Variable_name | Value |
+---------------+---------+
| bind_address | 0.0.0.0 |
+---------------+---------+
1 row in set (0.00 sec)来自nginx容器内的ifconfig的结果:
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的建议,我执行了以下命令:
docker network create --driver=bridge --subnet=192.168.0.0/16 br0
docker network connect br0 laradock_nginx_1我仍然无法访问Ubuntu MySQL容器。以下是ifconfig当前的结果
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地址。不过,我不知道怎么从这里开始。有什么想法?
发布于 2018-02-07 21:39:32
码头容器内的内部ip网络与外部ip网络重叠,或者设置为host。如果未设置为host,则使得Linux主机内部的路由尝试在本地查找该资源,而不是将请求发送到internet上。
尝试更改容器的网络,如下所示:
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网络驱动程序,希望同时删除这两个接口。
docker network disconnect host laradock_nginx_1发布于 2018-07-31 16:49:12
我用我的主机ip或网络在laradock .env文件中解决了这个设置.env(两者都为我工作)。
DOCKER_HOST_IP=172.16.4.1希望能帮助别人。
https://stackoverflow.com/questions/48673027
复制相似问题